{"action":"created","issue":{"url":"https://api.github.com/repos/opensim-org/opensim-core/issues/649","labels_url":"https://api.github.com/repos/opensim-org/opensim-core/issues/649/labels{/name}","comments_url":"https://api.github.com/repos/opensim-org/opensim-core/issues/649/comments","events_url":"https://api.github.com/repos/opensim-org/opensim-core/issues/649/events","html_url":"https://github.com/opensim-org/opensim-core/pull/649","id":109200588,"number":649,"title":"WeldConstraint and BushingForces utilize Frames","user":{"login":"aseth1","id":6494122,"avatar_url":"https://avatars.githubusercontent.com/u/6494122?v=3","gravatar_id":"","url":"https://api.github.com/users/aseth1","html_url":"https://github.com/aseth1","followers_url":"https://api.github.com/users/aseth1/followers","following_url":"https://api.github.com/users/aseth1/following{/other_user}","gists_url":"https://api.github.com/users/aseth1/gists{/gist_id}","starred_url":"https://api.github.com/users/aseth1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aseth1/subscriptions","organizations_url":"https://api.github.com/users/aseth1/orgs","repos_url":"https://api.github.com/users/aseth1/repos","events_url":"https://api.github.com/users/aseth1/events{/privacy}","received_events_url":"https://api.github.com/users/aseth1/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":26,"created_at":"2015-09-30T23:27:26Z","updated_at":"2015-10-10T00:31:47Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/opensim-org/opensim-core/pulls/649","html_url":"https://github.com/opensim-org/opensim-core/pull/649","diff_url":"https://github.com/opensim-org/opensim-core/pull/649.diff","patch_url":"https://github.com/opensim-org/opensim-core/pull/649.patch"},"body":"Update to `WeldConstraint` and all `BushingForces` to take advantage of Frames since they clearly link two Frames together.\r\n\r\nThere was a ton of code duplication (and there is still some, especially in Bushings and `testForces`). `WeldConstraint`  and all (4) `BushingForces` require the same structural setup. In particular, they link two (Physical)Frames together. Therefore they share connectors to frames and associated properties as well as constructors. \r\n\r\nI added an intermediate utility (mixin) class (`LinkTwoFrames<ComponentType, FrameType>`) for the purpose of eliminating obvious code duplication, ease maintainability, and eliminate opportunities for inconsistent naming and documentation to arise (which there was a lot of). I did not invest much time in its naming so I am happy to revisit it as part of this review. I would not expect the casual API user to use it. (As an aside, Joints could potentially be included if we agree that `frame1` and `frame2`, is as informative as `parent` and `child` for Joints- then they would be identical to what `LinkTwoFrames<>` defines). I very much like having one place that standardizes how any Component should link two frames (including convenience constructors for including offsets) from the perspective of API consistency.\r\n\r\nVisualization has been left to the individual `BushingForces` (WeldConstraint and Constraints in general do not visualize) but I think these could also be centralized, but I view that as secondary to getting the Constraint and Forces to compute correctly using Frames (main focus of this PR).\r\n\r\nThe updated Constraint and Forces have also been added to `testComponents` and the definition and tolerance for memory leaks has been tightened (so we may see failures on different platforms).\n\n<!-- Reviewable:start -->\n[<img src=\"https://reviewable.io/review_button.png\" height=40 alt=\"Review on Reviewable\"/>](https://reviewable.io/reviews/opensim-org/opensim-core/649)\n<!-- Reviewable:end -->\n"},"comment":{"url":"https://api.github.com/repos/opensim-org/opensim-core/issues/comments/147016817","html_url":"https://github.com/opensim-org/opensim-core/pull/649#issuecomment-147016817","issue_url":"https://api.github.com/repos/opensim-org/opensim-core/issues/649","id":147016817,"user":{"login":"aseth1","id":6494122,"avatar_url":"https://avatars.githubusercontent.com/u/6494122?v=3","gravatar_id":"","url":"https://api.github.com/users/aseth1","html_url":"https://github.com/aseth1","followers_url":"https://api.github.com/users/aseth1/followers","following_url":"https://api.github.com/users/aseth1/following{/other_user}","gists_url":"https://api.github.com/users/aseth1/gists{/gist_id}","starred_url":"https://api.github.com/users/aseth1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aseth1/subscriptions","organizations_url":"https://api.github.com/users/aseth1/orgs","repos_url":"https://api.github.com/users/aseth1/repos","events_url":"https://api.github.com/users/aseth1/events{/privacy}","received_events_url":"https://api.github.com/users/aseth1/received_events","type":"User","site_admin":false},"created_at":"2015-10-10T00:31:47Z","updated_at":"2015-10-10T00:31:47Z","body":"> The dotted yellow part doesn't seem very useful in that one.\r\n\r\nWe could ignore template relations in the *user* doxygen and keep for *developer*?\r\n\r\nLooks like this with `TEMPLATE_RELATIONS = NO`:\r\n![classopensim_1_1physicaloffsetframe__inherit__graph_no_template_relations](https://cloud.githubusercontent.com/assets/6494122/10408177/944fdbbc-6eab-11e5-8df2-854dd0c36445.png)\r\n\r\n"}}