diff --git a/CMakeLists.txt b/CMakeLists.txt index 09b5d5e..0885a00 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,6 +51,10 @@ set(ONDSELSOLVER_SRC OndselSolver/ASMTAngleJoint.cpp OndselSolver/ASMTAnimationParameters.cpp OndselSolver/ASMTAssembly.cpp + OndselSolver/ASMTConeConeContact.cpp + OndselSolver/ASMTContact.cpp + OndselSolver/ASMTCylConeContact.cpp + OndselSolver/ASMTCylCylContact.cpp OndselSolver/ASMTCompoundJoint.cpp OndselSolver/ASMTConstantGravity.cpp OndselSolver/ASMTConstantVelocityJoint.cpp @@ -421,6 +425,10 @@ set(ONDSELSOLVER_HEADERS OndselSolver/CADSystem.h OndselSolver/CartesianFrame.h OndselSolver/CompoundJoint.h + OndselSolver/ASMTConeConeContact.h + OndselSolver/ASMTContact.h + OndselSolver/ASMTCylConeContact.h + OndselSolver/ASMTCylCylContact.h OndselSolver/Constant.h OndselSolver/ConstantGravity.h OndselSolver/ConstantVelocityJoint.h diff --git a/OndselSolver/ASMTAssembly.cpp b/OndselSolver/ASMTAssembly.cpp index 12d5361..609575a 100644 --- a/OndselSolver/ASMTAssembly.cpp +++ b/OndselSolver/ASMTAssembly.cpp @@ -443,18 +443,30 @@ void MbD::ASMTAssembly::runFile(const char* fileName) void MbD::ASMTAssembly::runDraggingLogTest() { - auto assembly = ASMTAssembly::assemblyFromFile("../testapp/runPreDrag.asmt"); - assembly->runDraggingLog("../testapp/dragging.log"); - //auto assembly = ASMTAssembly::assemblyFromFile("../temp/runPreDrag.asmt"); - //assembly->setDebug(true); - //assembly->runDraggingLog("../temp/dragging.log"); - //assembly->setDebug(false); + runDraggingTest(); + auto assembly = ASMTAssembly::assemblyFromFile("runPreDrag.asmt"); + assembly->runDraggingLog("dragging.log"); +} + +void MbD::ASMTAssembly::runDraggingLogTest2() +{ + runDraggingTest2(); + auto assembly = ASMTAssembly::assemblyFromFile("runPreDrag.asmt"); + assembly->runDraggingLog("dragging.log"); +} + +void MbD::ASMTAssembly::runDraggingLogTest3() +{ + runDraggingTest3(); + auto assembly = ASMTAssembly::assemblyFromFile("runPreDrag.asmt"); + assembly->runDraggingLog("dragging.log"); } void MbD::ASMTAssembly::runDraggingTest() { //auto assembly = ASMTAssembly::assemblyFromFile("../testapp/pistonWithLimits.asmt"); auto assembly = ASMTAssembly::assemblyFromFile("../testapp/dragCrankSlider.asmt"); + assembly->setDebug(true); auto limit1 = ASMTRotationLimit::With(); limit1->setName("Limit1"); @@ -494,6 +506,7 @@ void MbD::ASMTAssembly::runDraggingTest2() { //auto assembly = ASMTAssembly::assemblyFromFile("../testapp/pistonWithLimits.asmt"); auto assembly = ASMTAssembly::assemblyFromFile("../testapp/dragCrankSlider.asmt"); + assembly->setDebug(true); auto limit1 = ASMTRotationLimit::With(); limit1->setName("Limit1"); @@ -532,6 +545,7 @@ void MbD::ASMTAssembly::runDraggingTest2() void MbD::ASMTAssembly::runDraggingTest3() { auto assembly = ASMTAssembly::assemblyFromFile("../testapp/rackPinion3.asmt"); + assembly->setDebug(true); auto dragPart = assembly->partNamed("/OndselAssembly/rackPinion#Box"); auto rotPart = assembly->partNamed("/OndselAssembly/rackPinion#Cylinder"); auto dragParts = std::make_shared>>(); @@ -1318,7 +1332,9 @@ void MbD::ASMTAssembly::runDragStep(std::shared_ptrrunDragStep(dragMbDParts); } catch (...) { - runPreDrag(); + //Do not use + //runPreDrag(); + //Assembly breaks up too easily because of redundant constraint removal. } } diff --git a/OndselSolver/ASMTAssembly.h b/OndselSolver/ASMTAssembly.h index 53631ff..81b6ce7 100644 --- a/OndselSolver/ASMTAssembly.h +++ b/OndselSolver/ASMTAssembly.h @@ -41,6 +41,8 @@ namespace MbD { static std::shared_ptr assemblyFromFile(const char* chars); static void runFile(const char* chars); static void runDraggingLogTest(); + static void runDraggingLogTest2(); + static void runDraggingLogTest3(); static void runDraggingTest(); static void runDraggingTest2(); static void runDraggingTest3(); diff --git a/OndselSolver/ASMTConeConeContact.cpp b/OndselSolver/ASMTConeConeContact.cpp new file mode 100644 index 0000000..6e7893a --- /dev/null +++ b/OndselSolver/ASMTConeConeContact.cpp @@ -0,0 +1 @@ +#include "ASMTConeConeContact.h" diff --git a/OndselSolver/ASMTConeConeContact.h b/OndselSolver/ASMTConeConeContact.h new file mode 100644 index 0000000..fd21d69 --- /dev/null +++ b/OndselSolver/ASMTConeConeContact.h @@ -0,0 +1,21 @@ +/*************************************************************************** + * Copyright (c) 2023 Ondsel, Inc. * + * * + * This file is part of OndselSolver. * + * * + * See LICENSE file for details about copyright. * + ***************************************************************************/ + +#pragma once + +#include "ASMTContact.h" + +namespace MbD { + class ASMTConeConeContact : public ASMTContact + { + // + public: + + }; +} + diff --git a/OndselSolver/ASMTContact.cpp b/OndselSolver/ASMTContact.cpp new file mode 100644 index 0000000..1e1da9e --- /dev/null +++ b/OndselSolver/ASMTContact.cpp @@ -0,0 +1 @@ +#include "ASMTContact.h" diff --git a/OndselSolver/ASMTContact.h b/OndselSolver/ASMTContact.h new file mode 100644 index 0000000..23a53b3 --- /dev/null +++ b/OndselSolver/ASMTContact.h @@ -0,0 +1,29 @@ +/*************************************************************************** + * Copyright (c) 2023 Ondsel, Inc. * + * * + * This file is part of OndselSolver. * + * * + * See LICENSE file for details about copyright. * + ***************************************************************************/ + +#pragma once + +#include "ASMTConstraintSet.h" + +namespace MbD { + class ForceTorqueData; + + class ASMTContact : public ASMTConstraintSet + { + // + public: + static std::shared_ptr With(); + void readJointSeries(std::vector& lines); + void storeOnLevel(std::ofstream& os, size_t level) override; + void storeOnTimeSeries(std::ofstream& os) override; + void createMbD(std::shared_ptr mbdSys, std::shared_ptr mbdUnits) override; + + std::shared_ptr>> jointSeries; + + }; +} diff --git a/OndselSolver/ASMTCylConeContact.cpp b/OndselSolver/ASMTCylConeContact.cpp new file mode 100644 index 0000000..074c940 --- /dev/null +++ b/OndselSolver/ASMTCylConeContact.cpp @@ -0,0 +1 @@ +#include "ASMTCylConeContact.h" diff --git a/OndselSolver/ASMTCylConeContact.h b/OndselSolver/ASMTCylConeContact.h new file mode 100644 index 0000000..8b784a5 --- /dev/null +++ b/OndselSolver/ASMTCylConeContact.h @@ -0,0 +1,21 @@ +/*************************************************************************** + * Copyright (c) 2023 Ondsel, Inc. * + * * + * This file is part of OndselSolver. * + * * + * See LICENSE file for details about copyright. * + ***************************************************************************/ + +#pragma once + +#include "ASMTContact.h" + +namespace MbD { + class ASMTCylConeContact : public ASMTContact + { + // + public: + + }; +} + diff --git a/OndselSolver/ASMTCylCylContact.cpp b/OndselSolver/ASMTCylCylContact.cpp new file mode 100644 index 0000000..0f76c7b --- /dev/null +++ b/OndselSolver/ASMTCylCylContact.cpp @@ -0,0 +1 @@ +#include "ASMTCylCylContact.h" diff --git a/OndselSolver/ASMTCylCylContact.h b/OndselSolver/ASMTCylCylContact.h new file mode 100644 index 0000000..b185ece --- /dev/null +++ b/OndselSolver/ASMTCylCylContact.h @@ -0,0 +1,26 @@ +/*************************************************************************** + * Copyright (c) 2023 Ondsel, Inc. * + * * + * This file is part of OndselSolver. * + * * + * See LICENSE file for details about copyright. * + ***************************************************************************/ + +#pragma once + +#include "ASMTContact.h" + +namespace MbD { + class ASMTCylCylContact : public ASMTContact + { + // + public: + void parseASMT(std::vector& lines) override; + void readDistanceIJ(std::vector& lines); + void createMbD(std::shared_ptr mbdSys, std::shared_ptr mbdUnits) override; + void storeOnLevel(std::ofstream& os, size_t level) override; + + double distancexyIJ = 0.0; + + }; +} diff --git a/OndselSolver/OndselSolver.vcxproj b/OndselSolver/OndselSolver.vcxproj index 7fa4c62..b6cfb35 100644 --- a/OndselSolver/OndselSolver.vcxproj +++ b/OndselSolver/OndselSolver.vcxproj @@ -163,9 +163,13 @@ + + + + @@ -478,9 +482,13 @@ + + + + diff --git a/OndselSolver/OndselSolver.vcxproj.filters b/OndselSolver/OndselSolver.vcxproj.filters index 438727e..a6c5883 100644 --- a/OndselSolver/OndselSolver.vcxproj.filters +++ b/OndselSolver/OndselSolver.vcxproj.filters @@ -954,6 +954,18 @@ Source Files + + Source Files + + + Source Files + + + Source Files + + + Source Files + @@ -1901,6 +1913,18 @@ Header Files + + Header Files + + + Header Files + + + Header Files + + + Header Files + diff --git a/OndselSolver/dragging.log b/OndselSolver/dragging.log index 7ad7c58..a873595 100644 --- a/OndselSolver/dragging.log +++ b/OndselSolver/dragging.log @@ -1 +1,20 @@ runPreDrag +runDragStep + Name + Part1 + Position3D + 4.801714581503802e-15 0.099999999999995245 0.19999999999999998 + RotationMatrix + 1 -4.7573992180162559e-14 0 + 4.7573992180162559e-14 1 0 + 0 0 1 +runDragStep + Name + Part1 + Position3D + 0.2633974596215562 0.063397459621556157 0 + RotationMatrix + 0.86602540378443871 -0.49999999999999994 0 + 0.49999999999999994 0.86602540378443871 0 + 0 0 1 +runPostDrag diff --git a/OndselSolver/runPreDrag.asmt b/OndselSolver/runPreDrag.asmt index aee5c03..cfbaf83 100644 --- a/OndselSolver/runPreDrag.asmt +++ b/OndselSolver/runPreDrag.asmt @@ -1,9 +1,9 @@ OndselSolver Assembly Notes - (Text string: '' runs: (Core.RunArray runs: #() values: #())) + (Text string: 'CAD: Copyright (C) 2000-2004, Aik-Siong Koh, All Rights Reserved.The piston crank is the most common mechanism to convert rotary motion to reciprocating motion or vice versa. A crank connects to the ground with a revolute joint. Its other end is connected to the connecting rod. And the connecting rod is connected to the piston which slides along an axis on the ground. The crank is given rotary motion causing the piston to slides back and forth is a straight line. Units are SI units. Angles are in radians.If the instructions below are too brief, refer to the Notes in projectile.asm and circular.asm.To load the example for a quick look:Click File/Open/Assembly/ to get a dialog. Enter *.asm for a list of assemblies. Select piston.asm. To create the assembly from scratch:To create crank, connection rod and piston:Create an empty assembly and populate it with two rods (Assembly1Part1, Assembly1Part2) and one cylinder (Assembly1Part3). The rods have dimensions (1.0d, 0.2d, 0.1d) and (1.5d, 0.2d, 0.1d). The cylinder has radius (0.5d) and height (1.0d). Arrange them from bottom up away from the origin. To mark joint attachment points:On the ground, create a marker (Assembly1Marker1) at (0.0d, 0.0d, 0.0d) and another (Assembly1Marker2) at (3.0d, 0.0d, 0.0d). On the first rod, create a marker (Assembly1Part1Marker1) at (0.1d, 0.1d, 0.0d) and another (Assembly1Part1Marker2) at (0.9d, 0.1d, 0.0d) relative to the z-face. On the second rod, create a marker (Assembly1Part2Marker1) at (0.1d, 0.1d, -0.1d) and another (Assembly1Part2Marker2) at (1.4d, 0.1d, -0.1d) relative to the z-face. On the cylinder, create a marker (Assembly1Part3Marker1) at (0.0d, 0.0d, 0.0d) and another (Assembly1Part3Marker2) at (0.0d, 0.0d, -1.0d) relative to the z-face. Tilt the cylinder a little to get a good view of (Assembly1Part3Marker2). RightClick/Rotate/ over it to rotate the marker (90.0d) degrees about the x-axis.Tilt the cylinder upright to help the solver assemble the system later.To create the joints:Connect (Assembly1Marker1) to (Assembly1Part1Marker1) with revolute joint (Assembly1Joint1).Connect (Assembly1Part1Marker2) to (Assembly1Part2Marker1) with revolute joint (Assembly1Joint2).Connect (Assembly1Part2Marker2) to (Assembly1Part3Marker2) with revolute joint (Assembly1Joint3).Connect (Assembly1Marker2) to (Assembly1Part3Marker1) with translational joint (Assembly1Joint3).The translational joint keeps the marker z-axes parallel and colinear. Only relative translation along the z-axis is permitted.To apply motion to the crank:Apply rotation motion (Assembly1Motion1) to (Assembly1Joint1). Enter 2.0d*pi*time.The assembly is now ready for simulation, animation and plotting.' runs: (Core.RunArray runs: #(514 63 14 5 12 1 2 37 89 10 4 36 1 43 295 32 848 21 517 29 151) values: #(nil #underline #(#underline #bold) #underline #(#underline #bold) #underline nil #(#bold #large) nil #bold nil #(#bold #large) nil #bold nil #bold nil #bold nil #bold nil))) Name - OndselAssembly + Assembly1 Position3D 0 0 0 RotationMatrix @@ -25,9 +25,26 @@ Assembly Markers Marker Name - marker-AssemblyExample#BasePin + Marker1 Position3D - -206.51702880859375 40.255699157714844 364.26800537109375 + 0 3 0 + RotationMatrix + 1 0 0 + 0 0 1 + 0 -1 0 + RefPoint + Position3D + 0 0 0 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + Markers + Marker + Name + Marker2 + Position3D + 0 0 0 RotationMatrix 1 0 0 0 1 0 @@ -37,9 +54,9 @@ Assembly Parts Part Name - AssemblyExample#BasePin + Part1 Position3D - -206.51702880859375 40.255699157714844 364.26800537109375 + -0.10000000000000001 -0.10000000000000001 -0.10000000000000001 RotationMatrix 1 0 0 0 1 0 @@ -53,21 +70,21 @@ Assembly Name MassMarker Position3D - 0 0 0 + 0.5 0.10000000000000001 0.050000000000000003 RotationMatrix 1 0 0 0 1 0 0 0 1 Mass - 1 + 0.20000000000000001 MomentOfInertias - 1 1 1 + 0.00083333333333333003 0.016833333333332999 0.017333333333332999 Density - 1 + 10 RefPoints RefPoint Position3D - 0 0 0 + 0 0 0.10000000000000001 RotationMatrix 1 0 0 0 1 0 @@ -75,9 +92,26 @@ Assembly Markers Marker Name - FixingMarker + Marker1 Position3D - 0 0 0 + 0.10000000000000001 0.10000000000000001 0 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + RefPoint + Position3D + 0 0 0.10000000000000001 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + Markers + Marker + Name + Marker2 + Position3D + 0.90000000000000002 0.10000000000000001 0 RotationMatrix 1 0 0 0 1 0 @@ -86,13 +120,13 @@ Assembly RefSurfaces Part Name - AssemblyExample#Stick + Part2 Position3D - -206.81702880859257 269.20743548911616 124.57579919241013 + 0.94036115973815004 -0.017284236661228001 6.9388939039071999e-18 RotationMatrix - 1 1.9573942562249709e-15 -4.8204795291975149e-16 - -1.4705626826996499e-15 0.87188642801965233 0.48970813413208841 - 1.3788429567821853e-15 -0.48970813413208841 0.87188642801965233 + -0.61538461538461997 -0.78822698199689001 -2.4430659816415999e-17 + 0.78822698199689001 -0.61538461538461997 3.1292471039841e-17 + -3.9699822201676001e-17 -4.8559383484174003e-33 1 Velocity3D 0 0 0 Omega3D @@ -102,58 +136,209 @@ Assembly Name MassMarker Position3D - 0 0 0 + 0.75 0.10000000000000001 0.050000000000000003 RotationMatrix - 1 0 0 - 0 1 0 + 1 -2.7755575615629002e-16 0 + 2.7755575615629002e-16 1 0 0 0 1 Mass - 1 + 0.29999999999999999 MomentOfInertias - 1 1 1 + 0.00125 0.056500000000000002 0.057250000000000002 Density - 1 + 10 RefPoints + RefPoint + Position3D + 0 0 0.10000000000000001 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + Markers + Marker + Name + Marker1 + Position3D + 0.10000000000000001 0.10000000000000001 -0.10000000000000001 + RotationMatrix + 1 1.6433823482156999e-50 6.1629758220391999e-33 + 1.9277988905447e-49 1 1.055150120668e-32 + 6.1629758220391999e-33 8.8305116654984998e-33 1 + RefPoint + Position3D + -7.0256300777060995e-17 -1.0408340855861e-17 0.10000000000000001 + RotationMatrix + 1 1.7347234759768e-18 -6.9388939039071999e-18 + 1.7347234759768e-18 1 0 + -6.9388939039071999e-18 0 1 + Markers + Marker + Name + Marker2 + Position3D + 1.3999999999999999 0.10000000000000001 -0.10000000000000001 + RotationMatrix + 1 1.9417266172264999e-33 1.873501354055e-16 + 1.4257315131995e-48 1 4.1633363423443e-17 + -2.5673907444456001e-16 -4.1633363423443e-17 1 + RefCurves + RefSurfaces + Part + Name + Part3 + Position3D + 1.8563657024100999e-16 1.0246950765959999 -6.9385028492422e-17 + RotationMatrix + 1 1.7680967979306999e-16 -2.2204460492503e-16 + 2.2204460492503e-16 6.3228810015036994e-17 1 + 1.7680967979306999e-16 -1 6.3228810015036994e-17 + Velocity3D + 0 0 0 + Omega3D + 0 0 0 + FeatureOrder + PrincipalMassMarker + Name + MassMarker + Position3D + -7.9328390680451997e-18 2.9323172983666999e-17 0.5 + RotationMatrix + 9.2444637330587006e-33 1 -1.0785207688569e-32 + 9.9703461330478005e-65 1.0785207688569e-32 1 + 1 -9.2444637330587006e-33 0 + Mass + 7.6536686473018003 + MomentOfInertias + 0.93243354610287998 1.1040224936598999 1.1040224936598999 + Density + 10 + RefPoints + RefPoint + Position3D + 0 0 0 + RotationMatrix + 1 0 0 + 0 -1 0 + 0 0 -1 + Markers + Marker + Name + Marker1 + Position3D + 0 0 0 + RotationMatrix + 1 2.1223636732195001e-32 -2.4651903288157002e-32 + -2.4651903288157002e-32 -2.2204460492503e-16 1 + -1.1179465652455999e-32 -1 -2.2204460492503e-16 + RefPoint + Position3D + 1.0408340855861e-17 5.5511151231258e-17 1 + RotationMatrix + 1 -6.9388939039071999e-18 6.9388939039071999e-18 + -6.9388939039071999e-18 1 0 + 6.9388939039071999e-18 0 1 + Markers + Marker + Name + Marker2 + Position3D + 0 0 0 + RotationMatrix + 1 -4.1633363423442002e-17 4.1633363423442002e-17 + -4.1633363423442002e-17 1 -4.9303806576313002e-32 + 4.1633363423442002e-17 -3.6977854932235e-32 1 RefCurves RefSurfaces KinematicIJs ConstraintSets Joints - FixedJoint + RevoluteJoint Name - AssemblyExample#GroundedJoint + Joint1 MarkerI - /OndselAssembly/marker-AssemblyExample#BasePin + /Assembly1/Marker2 MarkerJ - /OndselAssembly/AssemblyExample#BasePin/FixingMarker + /Assembly1/Part1/Marker1 + RevoluteJoint + Name + Joint2 + MarkerI + /Assembly1/Part1/Marker2 + MarkerJ + /Assembly1/Part2/Marker1 + RevoluteJoint + Name + Joint3 + MarkerI + /Assembly1/Part2/Marker2 + MarkerJ + /Assembly1/Part3/Marker1 + CylindricalJoint + Name + Joint4 + MarkerI + /Assembly1/Part3/Marker2 + MarkerJ + /Assembly1/Marker1 Motions Limits + RotationLimit + Name + Limit1 + MarkerI + /Assembly1/Marker2 + MarkerJ + /Assembly1/Part1/Marker1 + MotionJoint + + Limit + 30.0*pi/180.0 + Type + => + Tol + 1.0e-9 + TranslationLimit + Name + Limit2 + MarkerI + /Assembly1/Part3/Marker2 + MarkerJ + /Assembly1/Marker1 + MotionJoint + + Limit + 1.2 + Type + =< + Tol + 1.0e-9 GeneralConstraintSets ForceTorques ConstantGravity - 0 0 0 + 0 -9.8100000000000005 0 SimulationParameters tstart 0 tend - 1 + 0 hmin 1.0000000000000001e-09 hmax - 1000000000 + 1 hout - 0.10000000000000001 + 0.040000000000000001 errorTol 9.9999999999999995e-07 AnimationParameters nframe - 1000000 + 26 icurrent 1 istart 1 iend - 1000000 + 26 isForward true framesPerSecond diff --git a/testapp/OndselSolver.cpp b/testapp/OndselSolver.cpp index eec8edb..6878c91 100644 --- a/testapp/OndselSolver.cpp +++ b/testapp/OndselSolver.cpp @@ -25,11 +25,9 @@ void sharedptrTest(); int main() { + ASMTAssembly::runDraggingLogTest3(); + ASMTAssembly::runDraggingLogTest2(); ASMTAssembly::runDraggingLogTest(); - ASMTAssembly::runDraggingTest2(); - ASMTAssembly::runDraggingTest3(); - ASMTAssembly::runDraggingTest(); - //ASMTAssembly::runFile("../testapp/pistonWithLimits.asmt"); ASMTAssembly::runFile("../testapp/pistonAllowZRotation.asmt"); ASMTAssembly::runFile("../testapp/Schmidt_Coupling_Ass_1-1.asmt"); ASMTAssembly::runFile("../testapp/RevRevJt.asmt"); diff --git a/testapp/__cubes.asmt b/testapp/__cubes.asmt new file mode 100644 index 0000000..aebf630 --- /dev/null +++ b/testapp/__cubes.asmt @@ -0,0 +1,203 @@ +OndselSolver +Assembly + Notes + (Text string: '' runs: (Core.RunArray runs: #() values: #())) + Name + OndselAssembly + Position3D + 0 0 0 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + Velocity3D + 0 0 0 + Omega3D + 0 0 0 + RefPoints + RefPoint + Position3D + 0 0 0 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + Markers + Marker + Name + marker-__cubes#Box001 + Position3D + -15.44875431060791 -5.7149038314819336 3.9632759094238281 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + RefCurves + RefSurfaces + Parts + Part + Name + __cubes#Box001 + Position3D + -15.44875431060791 -5.7149038314819336 3.9632759094238281 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + Velocity3D + 0 0 0 + Omega3D + 0 0 0 + FeatureOrder + PrincipalMassMarker + Name + MassMarker + Position3D + 0 0 0 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + Mass + 1 + MomentOfInertias + 1 1 1 + Density + 1 + RefPoints + RefPoint + Position3D + 0 0 0 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + Markers + Marker + Name + FixingMarker + Position3D + 0 0 0 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + RefPoint + Position3D + 0 0 0 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + Markers + Marker + Name + __cubes#Angle + Position3D + 0 0 5 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + RefCurves + RefSurfaces + Part + Name + __cubes#Box002 + Position3D + -9.9629693031311035 -3.2665310316877054 17.9748312545318 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + Velocity3D + 0 0 0 + Omega3D + 0 0 0 + FeatureOrder + PrincipalMassMarker + Name + MassMarker + Position3D + 0 0 0 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + Mass + 1 + MomentOfInertias + 1 1 1 + Density + 1 + RefPoints + RefPoint + Position3D + 0 0 0 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + Markers + Marker + Name + __cubes#Angle + Position3D + 0 0 5 + RotationMatrix + 1 0 0 + 0 1 0 + 0 0 1 + RefCurves + RefSurfaces + KinematicIJs + ConstraintSets + Joints + FixedJoint + Name + __cubes#GroundedJoint + MarkerI + /OndselAssembly/marker-__cubes#Box001 + MarkerJ + /OndselAssembly/__cubes#Box001/FixingMarker + AngleJoint + Name + __cubes#Angle + MarkerI + /OndselAssembly/__cubes#Box001/__cubes#Angle + MarkerJ + /OndselAssembly/__cubes#Box002/__cubes#Angle + theIzJz + 0.17453292519943295 + Motions + Limits + GeneralConstraintSets + ForceTorques + ConstantGravity + 0 0 0 + SimulationParameters + tstart + 0 + tend + 1 + hmin + 1.0000000000000001e-09 + hmax + 1000000000 + hout + 0.10000000000000001 + errorTol + 9.9999999999999995e-07 + AnimationParameters + nframe + 1000000 + icurrent + 1 + istart + 1 + iend + 1000000 + isForward + true + framesPerSecond + 30