From 001cc1111ea3489774fc55f04a70b2deb8de76c4 Mon Sep 17 00:00:00 2001 From: mc007 Date: Sun, 31 Oct 2021 19:11:02 +0100 Subject: [PATCH] sdk --- .../AddInSamples/AddInSample/AddInSample.cpp | 479 +++++ .../AddInSamples/AddInSample/AddInSample.dll | Bin 0 -> 59760 bytes .../AddInSample/AddInSample.dylib | Bin 0 -> 85916 bytes .../AddInSample/AddInSample.manifest | 14 + .../AddInSample/AddInSample.vcxproj | 107 ++ .../AddInSample.xcodeproj/project.pbxproj | 267 +++ .../CPP/AddInSamples/AddInSample/help.html | 6 + .../AddInSample/resources/16x16-dark.png | Bin 0 -> 726 bytes .../AddInSample/resources/16x16-disabled.png | Bin 0 -> 726 bytes .../AddInSample/resources/16x16.png | Bin 0 -> 708 bytes .../AddInSample/resources/32x32-dark.png | Bin 0 -> 1300 bytes .../AddInSample/resources/32x32-disabled.png | Bin 0 -> 1300 bytes .../AddInSample/resources/32x32.png | Bin 0 -> 1234 bytes .../SpurGear/Resources/GearEnglish.png | Bin 0 -> 11340 bytes .../SpurGear/Resources/GearMetric.png | Bin 0 -> 10766 bytes .../SpurGear/Resources/SpurGear/16x16.png | Bin 0 -> 965 bytes .../SpurGear/Resources/SpurGear/16x16@2x.png | Bin 0 -> 2058 bytes .../SpurGear/Resources/SpurGear/32x32.png | Bin 0 -> 2058 bytes .../SpurGear/Resources/SpurGear/32x32@2x.png | Bin 0 -> 4997 bytes .../CPP/AddInSamples/SpurGear/SpurGear.cpp | 1287 ++++++++++++++ .../CPP/AddInSamples/SpurGear/SpurGear.dll | Bin 0 -> 353648 bytes .../CPP/AddInSamples/SpurGear/SpurGear.dylib | Bin 0 -> 474352 bytes .../AddInSamples/SpurGear/SpurGear.manifest | 15 + .../AddInSamples/SpurGear/SpurGear.vcxproj | 107 ++ .../SpurGear.xcodeproj/project.pbxproj | 269 +++ usr/autodesk/CPP/Default/DEFAULT.cpp | 45 + usr/autodesk/CPP/Default/DEFAULT.dll | Bin 0 -> 18288 bytes usr/autodesk/CPP/Default/DEFAULT.dylib | Bin 0 -> 11244 bytes usr/autodesk/CPP/Default/DEFAULT.manifest | 10 + usr/autodesk/CPP/Default/DEFAULT.vcxproj | 107 ++ .../Default/DEFAULT.xcodeproj/project.pbxproj | 269 +++ usr/autodesk/CPP/DefaultAddIn/DEFAULT.cpp | 58 + usr/autodesk/CPP/DefaultAddIn/DEFAULT.dll | Bin 0 -> 18800 bytes usr/autodesk/CPP/DefaultAddIn/DEFAULT.dylib | Bin 0 -> 11620 bytes .../CPP/DefaultAddIn/DEFAULT.manifest | 10 + usr/autodesk/CPP/DefaultAddIn/DEFAULT.vcxproj | 107 ++ .../DEFAULT.xcodeproj/project.pbxproj | 269 +++ .../CustomGraphicsSample.cpp | 1537 +++++++++++++++++ .../CustomGraphicsSample.dll | Bin 0 -> 152944 bytes .../CustomGraphicsSample.dylib | Bin 0 -> 709728 bytes .../CustomGraphicsSample.manifest | 12 + .../CustomGraphicsSample.vcxproj | 107 ++ .../project.pbxproj | 269 +++ .../resources/16x16-disabled.png | Bin 0 -> 322 bytes .../CustomGraphicsSample/resources/16x16.png | Bin 0 -> 708 bytes .../resources/One/16x16-disabled.png | Bin 0 -> 444 bytes .../resources/One/16x16-pressed.png | Bin 0 -> 535 bytes .../resources/One/16x16.png | Bin 0 -> 556 bytes .../resources/One/32x32-pressed.png | Bin 0 -> 635 bytes .../resources/One/32x32.png | Bin 0 -> 653 bytes .../resources/Three/16x16-disabled.png | Bin 0 -> 589 bytes .../resources/Three/16x16-pressed.png | Bin 0 -> 602 bytes .../resources/Three/16x16.png | Bin 0 -> 853 bytes .../resources/Three/32x32-pressed.png | Bin 0 -> 1236 bytes .../resources/Three/32x32.png | Bin 0 -> 1403 bytes .../resources/Two/16x16-disabled.png | Bin 0 -> 566 bytes .../resources/Two/16x16-pressed.png | Bin 0 -> 732 bytes .../resources/Two/16x16.png | Bin 0 -> 831 bytes .../resources/Two/32x32.png | Bin 0 -> 1146 bytes .../resources/Two/32x32pressed.png | Bin 0 -> 1013 bytes .../resources/lowerLeft/16x16-disabled.png | Bin 0 -> 498 bytes .../resources/lowerLeft/16x16.png | Bin 0 -> 1001 bytes .../resources/lowerLeft/32x32.png | Bin 0 -> 3001 bytes .../resources/lowerRight/16x16-disabled.png | Bin 0 -> 507 bytes .../resources/lowerRight/16x16.png | Bin 0 -> 1095 bytes .../resources/lowerRight/32x32.png | Bin 0 -> 3373 bytes .../resources/text_bold/16x16-disabled.png | Bin 0 -> 245 bytes .../resources/text_bold/16x16.png | Bin 0 -> 270 bytes .../resources/text_bold/32x32.png | Bin 0 -> 774 bytes .../resources/text_italic/16x16-disabled.png | Bin 0 -> 232 bytes .../resources/text_italic/16x16.png | Bin 0 -> 232 bytes .../resources/text_italic/32x32.png | Bin 0 -> 673 bytes .../text_strikethrough/16x16-disabled.png | Bin 0 -> 373 bytes .../resources/text_strikethrough/16x16.png | Bin 0 -> 343 bytes .../resources/text_strikethrough/32x32.png | Bin 0 -> 452 bytes .../text_underline/16x16-disabled.png | Bin 0 -> 213 bytes .../resources/text_underline/16x16.png | Bin 0 -> 236 bytes .../resources/text_underline/32x32.png | Bin 0 -> 593 bytes .../resources/upperLeft/16x16-disabled.png | Bin 0 -> 504 bytes .../resources/upperLeft/16x16.png | Bin 0 -> 1010 bytes .../resources/upperLeft/32x32.png | Bin 0 -> 3055 bytes .../resources/upperRight/16x16-disabled.png | Bin 0 -> 506 bytes .../resources/upperRight/16x16.png | Bin 0 -> 1017 bytes .../resources/upperRight/32x32.png | Bin 0 -> 2972 bytes .../SpurGear/Resources/GearEnglish.png | Bin 0 -> 11340 bytes .../Samples/SpurGear/Resources/GearMetric.png | Bin 0 -> 10766 bytes .../SpurGear/Resources/SpurGear/16x16.png | Bin 0 -> 965 bytes .../SpurGear/Resources/SpurGear/16x16@2x.png | Bin 0 -> 2058 bytes .../SpurGear/Resources/SpurGear/32x32.png | Bin 0 -> 2058 bytes .../SpurGear/Resources/SpurGear/32x32@2x.png | Bin 0 -> 4997 bytes .../CPP/Samples/SpurGear/SpurGear.cpp | 1283 ++++++++++++++ .../CPP/Samples/SpurGear/SpurGear.dll | Bin 0 -> 345968 bytes .../CPP/Samples/SpurGear/SpurGear.dylib | Bin 0 -> 459584 bytes .../CPP/Samples/SpurGear/SpurGear.manifest | 11 + .../CPP/Samples/SpurGear/SpurGear.vcxproj | 107 ++ .../SpurGear.xcodeproj/project.pbxproj | 269 +++ .../CPP/Samples/TestScript/TestScript.cpp | 43 + .../CPP/Samples/TestScript/TestScript.dll | Bin 0 -> 18288 bytes .../CPP/Samples/TestScript/TestScript.dylib | Bin 0 -> 11244 bytes .../Samples/TestScript/TestScript.manifest | 11 + .../CPP/Samples/TestScript/TestScript.vcxproj | 107 ++ .../TestScript.xcodeproj/project.pbxproj | 267 +++ usr/autodesk/CPP/include/CAM/CAM/CAM.h | 410 +++++ usr/autodesk/CPP/include/CAM/CAM/CAMFolder.h | 170 ++ usr/autodesk/CPP/include/CAM/CAM/CAMFolders.h | 112 ++ usr/autodesk/CPP/include/CAM/CAM/CAMPattern.h | 48 + .../CPP/include/CAM/CAM/CAMPatterns.h | 112 ++ .../CPP/include/CAM/CAM/ChildOperationList.h | 108 ++ .../include/CAM/CAM/GenerateToolpathFuture.h | 93 + .../CPP/include/CAM/CAM/MachiningTime.h | 120 ++ .../CPP/include/CAM/CAM/PostProcessInput.h | 272 +++ usr/autodesk/CPP/include/CAM/CAM/Setup.h | 197 +++ .../CPP/include/CAM/CAM/SetupEvents.h | 226 +++ usr/autodesk/CPP/include/CAM/CAM/Setups.h | 112 ++ usr/autodesk/CPP/include/CAM/CAMAll.h | 38 + usr/autodesk/CPP/include/CAM/CAMTypeDefs.h | 138 ++ .../include/CAM/Global/CAMLibraryManager.h | 141 ++ .../CPP/include/CAM/Global/CAMManager.h | 109 ++ .../include/CAM/Global/MachineDescription.h | 225 +++ .../include/CAM/Global/NetworkMachineEvents.h | 278 +++ .../Global/NetworkMachineIntegrationInput.h | 113 ++ .../Global/NetworkMachineIntegrationManager.h | 100 ++ .../include/CAM/Machine/LinearMachineAxis.h | 69 + .../CAM/Machine/LinearMachineAxisInput.h | 70 + .../CPP/include/CAM/Machine/Machine.h | 209 +++ .../CPP/include/CAM/Machine/MachineAxis.h | 173 ++ .../include/CAM/Machine/MachineAxisInput.h | 164 ++ .../include/CAM/Machine/MachineCapabilities.h | 100 ++ .../include/CAM/Machine/MachineKinematics.h | 63 + .../CPP/include/CAM/Machine/MachinePart.h | 135 ++ .../include/CAM/Machine/MachinePartInput.h | 124 ++ .../CPP/include/CAM/Machine/MachineParts.h | 130 ++ .../include/CAM/Machine/RotaryMachineAxis.h | 69 + .../CAM/Machine/RotaryMachineAxisInput.h | 71 + .../CPP/include/CAM/Operations/CAMParameter.h | 154 ++ .../include/CAM/Operations/CAMParameters.h | 100 ++ .../CPP/include/CAM/Operations/Operation.h | 185 ++ .../include/CAM/Operations/OperationBase.h | 263 +++ .../CPP/include/CAM/Operations/Operations.h | 112 ++ .../SandvikIntegration/SandvikIntegration.h | 180 ++ .../SandvikIntegrationEvents.h | 287 +++ usr/autodesk/CPP/include/Core/.gitignore | 9 + usr/autodesk/CPP/include/Core/Base.h | 127 ++ usr/autodesk/CPP/include/Core/Deallocator.h | 91 + usr/autodesk/CPP/include/Core/Memory.h | 190 ++ usr/autodesk/CPP/include/Core/OSMacros.h | 27 + usr/autodesk/CPP/include/Core/Utils.h | 35 + .../CPP/include/Drawing/Drawing/Drawing.h | 63 + .../include/Drawing/Drawing/DrawingDocument.h | 62 + .../Drawing/Drawing/DrawingExportManager.h | 81 + .../Drawing/Drawing/DrawingExportOptions.h | 106 ++ .../Drawing/Drawing/PDFExportOptions.h | 133 ++ usr/autodesk/CPP/include/Drawing/DrawingAll.h | 6 + .../CPP/include/Drawing/DrawingTypeDefs.h | 24 + .../CPP/include/Fusion/BRep/BRepBodies.h | 126 ++ .../CPP/include/Fusion/BRep/BRepBody.h | 681 ++++++++ .../include/Fusion/BRep/BRepBodyDefinition.h | 187 ++ .../CPP/include/Fusion/BRep/BRepCoEdge.h | 232 +++ .../Fusion/BRep/BRepCoEdgeDefinition.h | 88 + .../Fusion/BRep/BRepCoEdgeDefinitions.h | 103 ++ .../CPP/include/Fusion/BRep/BRepCoEdges.h | 87 + .../CPP/include/Fusion/BRep/BRepEdge.h | 326 ++++ .../include/Fusion/BRep/BRepEdgeDefinition.h | 149 ++ .../CPP/include/Fusion/BRep/BRepEdges.h | 87 + .../CPP/include/Fusion/BRep/BRepFace.h | 351 ++++ .../include/Fusion/BRep/BRepFaceDefinition.h | 121 ++ .../include/Fusion/BRep/BRepFaceDefinitions.h | 106 ++ .../CPP/include/Fusion/BRep/BRepFaces.h | 87 + .../CPP/include/Fusion/BRep/BRepLoop.h | 187 ++ .../include/Fusion/BRep/BRepLoopDefinition.h | 64 + .../include/Fusion/BRep/BRepLoopDefinitions.h | 99 ++ .../CPP/include/Fusion/BRep/BRepLoops.h | 87 + .../CPP/include/Fusion/BRep/BRepLump.h | 243 +++ .../include/Fusion/BRep/BRepLumpDefinition.h | 64 + .../include/Fusion/BRep/BRepLumpDefinitions.h | 99 ++ .../CPP/include/Fusion/BRep/BRepLumps.h | 87 + .../CPP/include/Fusion/BRep/BRepShell.h | 265 +++ .../include/Fusion/BRep/BRepShellDefinition.h | 75 + .../Fusion/BRep/BRepShellDefinitions.h | 99 ++ .../CPP/include/Fusion/BRep/BRepShells.h | 87 + .../CPP/include/Fusion/BRep/BRepVertex.h | 222 +++ .../Fusion/BRep/BRepVertexDefinition.h | 70 + .../CPP/include/Fusion/BRep/BRepVertices.h | 87 + .../CPP/include/Fusion/BRep/BRepWire.h | 174 ++ .../include/Fusion/BRep/BRepWireDefinition.h | 64 + .../Fusion/BRep/BRepWireEdgeDefinition.h | 127 ++ .../Fusion/BRep/BRepWireEdgeDefinitions.h | 108 ++ .../CPP/include/Fusion/BRep/BRepWires.h | 87 + .../Fusion/BRep/TemporaryBRepManager.h | 446 +++++ .../include/Fusion/Components/AsBuiltJoint.h | 432 +++++ .../Fusion/Components/AsBuiltJointInput.h | 233 +++ .../Fusion/Components/AsBuiltJointList.h | 100 ++ .../include/Fusion/Components/AsBuiltJoints.h | 136 ++ .../Fusion/Components/BallJointMotion.h | 269 +++ .../include/Fusion/Components/BaseComponent.h | 291 ++++ .../CPP/include/Fusion/Components/Component.h | 725 ++++++++ .../include/Fusion/Components/ComponentList.h | 87 + .../include/Fusion/Components/Components.h | 112 ++ .../include/Fusion/Components/ContactSet.h | 134 ++ .../include/Fusion/Components/ContactSets.h | 107 ++ .../Components/CylindricalJointMotion.h | 173 ++ .../CPP/include/Fusion/Components/Joint.h | 528 ++++++ .../include/Fusion/Components/JointGeometry.h | 291 ++++ .../include/Fusion/Components/JointInput.h | 281 +++ .../include/Fusion/Components/JointLimits.h | 157 ++ .../CPP/include/Fusion/Components/JointList.h | 100 ++ .../include/Fusion/Components/JointMotion.h | 75 + .../include/Fusion/Components/JointOrigin.h | 344 ++++ .../Fusion/Components/JointOriginInput.h | 236 +++ .../Fusion/Components/JointOriginList.h | 100 ++ .../include/Fusion/Components/JointOrigins.h | 132 ++ .../CPP/include/Fusion/Components/Joints.h | 135 ++ .../include/Fusion/Components/Occurrence.h | 519 ++++++ .../Fusion/Components/OccurrenceList.h | 100 ++ .../include/Fusion/Components/Occurrences.h | 150 ++ .../Fusion/Components/PinSlotJointMotion.h | 230 +++ .../Fusion/Components/PlanarJointMotion.h | 263 +++ .../Fusion/Components/RevoluteJointMotion.h | 141 ++ .../include/Fusion/Components/RigidGroup.h | 232 +++ .../Fusion/Components/RigidGroupList.h | 100 ++ .../include/Fusion/Components/RigidGroups.h | 117 ++ .../Fusion/Components/RigidJointMotion.h | 50 + .../Fusion/Components/SliderJointMotion.h | 143 ++ .../Fusion/Construction/ConstructionAxes.h | 143 ++ .../Fusion/Construction/ConstructionAxis.h | 317 ++++ .../ConstructionAxisByLineDefinition.h | 71 + .../ConstructionAxisCircularFaceDefinition.h | 70 + .../Construction/ConstructionAxisDefinition.h | 95 + .../ConstructionAxisEdgeDefinition.h | 66 + .../Construction/ConstructionAxisInput.h | 215 +++ ...ructionAxisNormalToFaceAtPointDefinition.h | 82 + ...uctionAxisPerpendicularAtPointDefinition.h | 86 + .../ConstructionAxisTwoPlaneDefinition.h | 81 + .../ConstructionAxisTwoPointDefinition.h | 81 + .../Fusion/Construction/ConstructionPlane.h | 356 ++++ .../ConstructionPlaneAtAngleDefinition.h | 105 ++ .../ConstructionPlaneByPlaneDefinition.h | 70 + .../ConstructionPlaneDefinition.h | 94 + ...onstructionPlaneDistanceOnPathDefinition.h | 89 + .../Construction/ConstructionPlaneInput.h | 260 +++ .../ConstructionPlaneMidplaneDefinition.h | 81 + .../ConstructionPlaneOffsetDefinition.h | 91 + ...onstructionPlaneTangentAtPointDefinition.h | 86 + .../ConstructionPlaneTangentDefinition.h | 105 ++ .../ConstructionPlaneThreePointsDefinition.h | 94 + .../ConstructionPlaneTwoEdgesDefinition.h | 86 + .../Fusion/Construction/ConstructionPlanes.h | 144 ++ .../Fusion/Construction/ConstructionPoint.h | 315 ++++ .../ConstructionPointCenterDefinition.h | 66 + .../ConstructionPointDefinition.h | 95 + .../ConstructionPointEdgePlaneDefinition.h | 81 + .../Construction/ConstructionPointInput.h | 184 ++ .../ConstructionPointPointDefinition.h | 69 + .../ConstructionPointThreePlanesDefinition.h | 92 + .../ConstructionPointTwoEdgesDefinition.h | 81 + .../Fusion/Construction/ConstructionPoints.h | 144 ++ .../Fusion/Features/AllExtentDefinition.h | 69 + .../Fusion/Features/AngleExtentDefinition.h | 83 + .../Features/AtCenterHolePositionDefinition.h | 73 + .../CPP/include/Fusion/Features/BRepCell.h | 94 + .../CPP/include/Fusion/Features/BRepCells.h | 87 + .../CPP/include/Fusion/Features/BaseFeature.h | 214 +++ .../include/Fusion/Features/BaseFeatures.h | 111 ++ .../Fusion/Features/BoundaryFillFeature.h | 149 ++ .../Features/BoundaryFillFeatureInput.h | 163 ++ .../Fusion/Features/BoundaryFillFeatures.h | 142 ++ .../CPP/include/Fusion/Features/BoxFeature.h | 48 + .../CPP/include/Fusion/Features/BoxFeatures.h | 100 ++ .../include/Fusion/Features/ChamferEdgeSet.h | 108 ++ .../include/Fusion/Features/ChamferEdgeSets.h | 170 ++ .../include/Fusion/Features/ChamferFeature.h | 241 +++ .../Fusion/Features/ChamferFeatureInput.h | 204 +++ .../include/Fusion/Features/ChamferFeatures.h | 147 ++ .../Fusion/Features/ChamferTypeDefinition.h | 94 + .../Features/ChordLengthFilletEdgeSet.h | 85 + .../Fusion/Features/CircularPatternFeature.h | 251 +++ .../Features/CircularPatternFeatureInput.h | 188 ++ .../Fusion/Features/CircularPatternFeatures.h | 137 ++ .../CPP/include/Fusion/Features/CoilFeature.h | 48 + .../Fusion/Features/CoilFeatureInput.h | 325 ++++ .../include/Fusion/Features/CoilFeatures.h | 101 ++ .../include/Fusion/Features/CombineFeature.h | 172 ++ .../Fusion/Features/CombineFeatureInput.h | 169 ++ .../include/Fusion/Features/CombineFeatures.h | 138 ++ .../Features/ConstantRadiusFilletEdgeSet.h | 85 + .../include/Fusion/Features/CopyPasteBodies.h | 113 ++ .../include/Fusion/Features/CopyPasteBody.h | 67 + .../include/Fusion/Features/CustomFeature.h | 177 ++ .../Fusion/Features/CustomFeatureDefinition.h | 196 +++ .../Features/CustomFeatureDependencies.h | 120 ++ .../Fusion/Features/CustomFeatureDependency.h | 112 ++ .../Fusion/Features/CustomFeatureEvents.h | 131 ++ .../Fusion/Features/CustomFeatureInput.h | 161 ++ .../Fusion/Features/CustomFeatureParameter.h | 105 ++ .../Fusion/Features/CustomFeatureParameters.h | 88 + .../include/Fusion/Features/CustomFeatures.h | 129 ++ .../Fusion/Features/CustomNamedValues.h | 142 ++ .../include/Fusion/Features/CutPasteBodies.h | 114 ++ .../include/Fusion/Features/CutPasteBody.h | 67 + .../include/Fusion/Features/CylinderFeature.h | 48 + .../Fusion/Features/CylinderFeatures.h | 100 ++ .../Fusion/Features/DeleteFaceFeature.h | 122 ++ .../Fusion/Features/DeleteFaceFeatures.h | 122 ++ .../Features/DistanceAndAngleChamferEdgeSet.h | 117 ++ .../DistanceAndAngleChamferTypeDefinition.h | 74 + .../Features/DistanceExtentDefinition.h | 101 ++ .../include/Fusion/Features/DraftFeature.h | 226 +++ .../Fusion/Features/DraftFeatureInput.h | 228 +++ .../include/Fusion/Features/DraftFeatures.h | 141 ++ .../Features/EqualDistanceChamferEdgeSet.h | 87 + .../EqualDistanceChamferTypeDefinition.h | 63 + .../include/Fusion/Features/ExtendFeature.h | 177 ++ .../Fusion/Features/ExtendFeatureInput.h | 166 ++ .../include/Fusion/Features/ExtendFeatures.h | 149 ++ .../Fusion/Features/ExtentDefinition.h | 95 + .../include/Fusion/Features/ExtrudeFeature.h | 592 +++++++ .../Fusion/Features/ExtrudeFeatureInput.h | 542 ++++++ .../include/Fusion/Features/ExtrudeFeatures.h | 160 ++ .../CPP/include/Fusion/Features/Feature.h | 341 ++++ .../CPP/include/Fusion/Features/FeatureList.h | 88 + .../CPP/include/Fusion/Features/Features.h | 747 ++++++++ .../include/Fusion/Features/FilletEdgeSet.h | 96 + .../include/Fusion/Features/FilletEdgeSets.h | 87 + .../include/Fusion/Features/FilletFeature.h | 144 ++ .../Fusion/Features/FilletFeatureInput.h | 219 +++ .../include/Fusion/Features/FilletFeatures.h | 129 ++ .../include/Fusion/Features/FlangeFeature.h | 48 + .../include/Fusion/Features/FlangeFeatures.h | 100 ++ .../CPP/include/Fusion/Features/FormFeature.h | 86 + .../include/Fusion/Features/FormFeatures.h | 111 ++ .../Features/FromEntityStartDefinition.h | 100 ++ .../CPP/include/Fusion/Features/HoleFeature.h | 516 ++++++ .../Fusion/Features/HoleFeatureInput.h | 336 ++++ .../include/Fusion/Features/HoleFeatures.h | 190 ++ .../Fusion/Features/HolePositionDefinition.h | 81 + .../Fusion/Features/LoftCenterLineOrRail.h | 92 + .../Fusion/Features/LoftCenterLineOrRails.h | 117 ++ .../Features/LoftDirectionEndCondition.h | 76 + .../Fusion/Features/LoftEndCondition.h | 78 + .../CPP/include/Fusion/Features/LoftFeature.h | 205 +++ .../Fusion/Features/LoftFeatureInput.h | 196 +++ .../include/Fusion/Features/LoftFeatures.h | 129 ++ .../Fusion/Features/LoftFreeEndCondition.h | 48 + .../Features/LoftPointSharpEndCondition.h | 48 + .../Features/LoftPointTangentEndCondition.h | 62 + .../CPP/include/Fusion/Features/LoftSection.h | 235 +++ .../include/Fusion/Features/LoftSections.h | 93 + .../Fusion/Features/LoftSmoothEndCondition.h | 62 + .../Fusion/Features/LoftTangentEndCondition.h | 62 + .../include/Fusion/Features/MirrorFeature.h | 201 +++ .../Fusion/Features/MirrorFeatureInput.h | 175 ++ .../include/Fusion/Features/MirrorFeatures.h | 136 ++ .../CPP/include/Fusion/Features/MoveFeature.h | 123 ++ .../Fusion/Features/MoveFeatureInput.h | 117 ++ .../include/Fusion/Features/MoveFeatures.h | 140 ++ .../Fusion/Features/OffsetFacesFeature.h | 49 + .../Fusion/Features/OffsetFacesFeatures.h | 103 ++ .../include/Fusion/Features/OffsetFeature.h | 154 ++ .../Fusion/Features/OffsetFeatureInput.h | 149 ++ .../include/Fusion/Features/OffsetFeatures.h | 142 ++ .../Fusion/Features/OffsetStartDefinition.h | 93 + .../Features/OnEdgeHolePositionDefinition.h | 85 + .../Features/OneSideToExtentDefinition.h | 86 + .../include/Fusion/Features/PatchFeature.h | 137 ++ .../Fusion/Features/PatchFeatureInput.h | 155 ++ .../include/Fusion/Features/PatchFeatures.h | 137 ++ .../CPP/include/Fusion/Features/Path.h | 166 ++ .../CPP/include/Fusion/Features/PathEntity.h | 142 ++ .../Fusion/Features/PathPatternFeature.h | 327 ++++ .../Fusion/Features/PathPatternFeatureInput.h | 257 +++ .../Fusion/Features/PathPatternFeatures.h | 144 ++ .../include/Fusion/Features/PatternElement.h | 163 ++ .../include/Fusion/Features/PatternElements.h | 87 + .../CPP/include/Fusion/Features/PipeFeature.h | 48 + .../include/Fusion/Features/PipeFeatures.h | 100 ++ .../PlaneAndOffsetsHolePositionDefinition.h | 109 ++ .../Features/PointHolePositionDefinition.h | 69 + .../Features/ProfilePlaneStartDefinition.h | 74 + .../Features/RectangularPatternFeature.h | 357 ++++ .../Features/RectangularPatternFeatureInput.h | 314 ++++ .../Features/RectangularPatternFeatures.h | 144 ++ .../include/Fusion/Features/RefoldFeature.h | 48 + .../include/Fusion/Features/RefoldFeatures.h | 100 ++ .../include/Fusion/Features/RemoveFeature.h | 91 + .../include/Fusion/Features/RemoveFeatures.h | 113 ++ .../Fusion/Features/ReplaceFaceFeature.h | 130 ++ .../Fusion/Features/ReplaceFaceFeatureInput.h | 133 ++ .../Fusion/Features/ReplaceFaceFeatures.h | 139 ++ .../Fusion/Features/ReverseNormalFeature.h | 102 ++ .../Fusion/Features/ReverseNormalFeatures.h | 117 ++ .../include/Fusion/Features/RevolveFeature.h | 326 ++++ .../Fusion/Features/RevolveFeatureInput.h | 285 +++ .../include/Fusion/Features/RevolveFeatures.h | 140 ++ .../CPP/include/Fusion/Features/RibFeature.h | 48 + .../CPP/include/Fusion/Features/RibFeatures.h | 100 ++ .../Fusion/Features/RuleFilletFeature.h | 48 + .../Fusion/Features/RuleFilletFeatures.h | 100 ++ .../Fusion/Features/RuledSurfaceFeature.h | 205 +++ .../Features/RuledSurfaceFeatureInput.h | 252 +++ .../Fusion/Features/RuledSurfaceFeatures.h | 138 ++ .../include/Fusion/Features/ScaleFeature.h | 216 +++ .../Fusion/Features/ScaleFeatureInput.h | 192 ++ .../include/Fusion/Features/ScaleFeatures.h | 138 ++ .../include/Fusion/Features/ShellFeature.h | 161 ++ .../Fusion/Features/ShellFeatureInput.h | 173 ++ .../include/Fusion/Features/ShellFeatures.h | 136 ++ .../Fusion/Features/SilhouetteSplitFeature.h | 130 ++ .../Features/SilhouetteSplitFeatureInput.h | 129 ++ .../Fusion/Features/SilhouetteSplitFeatures.h | 134 ++ .../SketchPointHolePositionDefinition.h | 62 + .../SketchPointsHolePositionDefinition.h | 62 + .../include/Fusion/Features/SphereFeature.h | 48 + .../include/Fusion/Features/SphereFeatures.h | 100 ++ .../Fusion/Features/SplitBodyFeature.h | 142 ++ .../Fusion/Features/SplitBodyFeatureInput.h | 130 ++ .../Fusion/Features/SplitBodyFeatures.h | 135 ++ .../Fusion/Features/SplitFaceFeature.h | 225 +++ .../Fusion/Features/SplitFaceFeatureInput.h | 185 ++ .../Fusion/Features/SplitFaceFeatures.h | 143 ++ .../include/Fusion/Features/StitchFeature.h | 137 ++ .../Fusion/Features/StitchFeatureInput.h | 132 ++ .../include/Fusion/Features/StitchFeatures.h | 140 ++ .../Features/SurfaceDeleteFaceFeature.h | 120 ++ .../Features/SurfaceDeleteFaceFeatures.h | 121 ++ .../include/Fusion/Features/SweepFeature.h | 366 ++++ .../Fusion/Features/SweepFeatureInput.h | 381 ++++ .../include/Fusion/Features/SweepFeatures.h | 135 ++ .../Features/SymmetricExtentDefinition.h | 111 ++ .../include/Fusion/Features/ThickenFeature.h | 179 ++ .../Fusion/Features/ThickenFeatureInput.h | 165 ++ .../include/Fusion/Features/ThickenFeatures.h | 140 ++ .../include/Fusion/Features/ThreadDataQuery.h | 267 +++ .../include/Fusion/Features/ThreadFeature.h | 271 +++ .../Fusion/Features/ThreadFeatureInput.h | 247 +++ .../include/Fusion/Features/ThreadFeatures.h | 173 ++ .../CPP/include/Fusion/Features/ThreadInfo.h | 210 +++ .../Features/ThroughAllExtentDefinition.h | 80 + .../Features/ToEntityExtentDefinition.h | 159 ++ .../include/Fusion/Features/TorusFeature.h | 48 + .../include/Fusion/Features/TorusFeatures.h | 100 ++ .../CPP/include/Fusion/Features/TrimFeature.h | 126 ++ .../Fusion/Features/TrimFeatureInput.h | 121 ++ .../include/Fusion/Features/TrimFeatures.h | 137 ++ .../Features/TwoDistancesChamferEdgeSet.h | 117 ++ .../TwoDistancesChamferTypeDefinition.h | 74 + .../Features/TwoSidesAngleExtentDefinition.h | 75 + .../TwoSidesDistanceExtentDefinition.h | 73 + .../Features/TwoSidesToExtentDefinition.h | 102 ++ .../include/Fusion/Features/UnfoldFeature.h | 48 + .../include/Fusion/Features/UnfoldFeatures.h | 100 ++ .../include/Fusion/Features/UnstitchFeature.h | 122 ++ .../Fusion/Features/UnstitchFeatures.h | 119 ++ .../include/Fusion/Features/UntrimFeature.h | 183 ++ .../Fusion/Features/UntrimFeatureInput.h | 163 ++ .../include/Fusion/Features/UntrimFeatures.h | 165 ++ .../Features/VariableRadiusFilletEdgeSet.h | 158 ++ .../CPP/include/Fusion/Features/WebFeature.h | 48 + .../CPP/include/Fusion/Features/WebFeatures.h | 100 ++ .../include/Fusion/Fusion/AreaProperties.h | 188 ++ .../Fusion/Fusion/BooleanParameterValue.h | 65 + .../include/Fusion/Fusion/C3MFExportOptions.h | 239 +++ .../Fusion/Fusion/ChoiceParameterValue.h | 117 ++ .../CPP/include/Fusion/Fusion/Design.h | 415 +++++ .../CPP/include/Fusion/Fusion/ExportManager.h | 189 ++ .../CPP/include/Fusion/Fusion/ExportOptions.h | 123 ++ .../Fusion/Fusion/FloatParameterValue.h | 65 + .../Fusion/FusionArchiveExportOptions.h | 48 + .../Fusion/FusionDefaultUnitsPreferences.h | 66 + .../include/Fusion/Fusion/FusionDocument.h | 62 + .../Fusion/Fusion/FusionProductPreferences.h | 204 +++ .../Fusion/Fusion/FusionUnitsManager.h | 84 + .../include/Fusion/Fusion/IGESExportOptions.h | 48 + .../Fusion/Fusion/IntegerParameterValue.h | 65 + .../include/Fusion/Fusion/InterferenceInput.h | 91 + .../Fusion/Fusion/InterferenceResult.h | 103 ++ .../Fusion/Fusion/InterferenceResults.h | 105 ++ .../include/Fusion/Fusion/ModelParameter.h | 131 ++ .../include/Fusion/Fusion/ModelParameters.h | 113 ++ .../CPP/include/Fusion/Fusion/Parameter.h | 257 +++ .../CPP/include/Fusion/Fusion/ParameterList.h | 209 +++ .../include/Fusion/Fusion/ParameterValue.h | 75 + .../Fusion/Fusion/PhysicalProperties.h | 195 +++ .../include/Fusion/Fusion/SATExportOptions.h | 48 + .../include/Fusion/Fusion/SMTExportOptions.h | 71 + .../include/Fusion/Fusion/STEPExportOptions.h | 48 + .../include/Fusion/Fusion/STLExportOptions.h | 256 +++ .../CPP/include/Fusion/Fusion/Snapshot.h | 99 ++ .../CPP/include/Fusion/Fusion/Snapshots.h | 122 ++ .../Fusion/Fusion/StringParameterValue.h | 73 + .../CPP/include/Fusion/Fusion/Timeline.h | 185 ++ .../CPP/include/Fusion/Fusion/TimelineGroup.h | 117 ++ .../include/Fusion/Fusion/TimelineGroups.h | 103 ++ .../include/Fusion/Fusion/TimelineObject.h | 284 +++ .../CPP/include/Fusion/Fusion/UserParameter.h | 88 + .../include/Fusion/Fusion/UserParameters.h | 148 ++ usr/autodesk/CPP/include/Fusion/FusionAll.h | 446 +++++ .../CPP/include/Fusion/FusionTypeDefs.h | 508 ++++++ .../CustomGraphicsAppearanceColorEffect.h | 87 + .../Fusion/Graphics/CustomGraphicsBRepBody.h | 95 + .../Fusion/Graphics/CustomGraphicsBRepEdges.h | 49 + .../Fusion/Graphics/CustomGraphicsBRepFaces.h | 49 + .../Graphics/CustomGraphicsBRepVertices.h | 49 + .../CustomGraphicsBasicMaterialColorEffect.h | 194 +++ .../Fusion/Graphics/CustomGraphicsBillBoard.h | 135 ++ .../Graphics/CustomGraphicsColorEffect.h | 65 + .../Graphics/CustomGraphicsCoordinates.h | 184 ++ .../Fusion/Graphics/CustomGraphicsCurve.h | 90 + .../Fusion/Graphics/CustomGraphicsEntity.h | 373 ++++ .../Fusion/Graphics/CustomGraphicsGroup.h | 228 +++ .../Fusion/Graphics/CustomGraphicsGroups.h | 87 + .../Fusion/Graphics/CustomGraphicsLines.h | 217 +++ .../Fusion/Graphics/CustomGraphicsMesh.h | 181 ++ .../Fusion/Graphics/CustomGraphicsPointSet.h | 148 ++ .../CustomGraphicsShowThroughColorEffect.h | 109 ++ .../Graphics/CustomGraphicsSolidColorEffect.h | 89 + .../Fusion/Graphics/CustomGraphicsText.h | 213 +++ .../CustomGraphicsVertexColorEffect.h | 61 + .../Graphics/CustomGraphicsViewPlacement.h | 139 ++ .../Fusion/Graphics/CustomGraphicsViewScale.h | 111 ++ .../CPP/include/Fusion/MeshBody/MeshBodies.h | 135 ++ .../CPP/include/Fusion/MeshBody/MeshBody.h | 346 ++++ .../include/Fusion/MeshBody/MeshBodyList.h | 87 + .../CPP/include/Fusion/MeshData/MeshManager.h | 87 + .../CPP/include/Fusion/MeshData/PolygonMesh.h | 286 +++ .../include/Fusion/MeshData/TextureImage.h | 63 + .../include/Fusion/MeshData/TriangleMesh.h | 291 ++++ .../Fusion/MeshData/TriangleMeshCalculator.h | 173 ++ .../Fusion/MeshData/TriangleMeshList.h | 86 + .../Fusion/Sketch/AlongPathTextDefinition.h | 119 ++ .../Fusion/Sketch/CircularPatternConstraint.h | 48 + .../Fusion/Sketch/CoincidentConstraint.h | 101 ++ .../Fusion/Sketch/CollinearConstraint.h | 100 ++ .../Fusion/Sketch/ConcentricConstraint.h | 100 ++ .../include/Fusion/Sketch/EqualConstraint.h | 100 ++ .../Fusion/Sketch/FitOnPathTextDefintion.h | 82 + .../Fusion/Sketch/GeometricConstraint.h | 163 ++ .../Fusion/Sketch/GeometricConstraintList.h | 87 + .../Fusion/Sketch/GeometricConstraints.h | 289 ++++ .../Fusion/Sketch/HorizontalConstraint.h | 90 + .../Sketch/HorizontalPointsConstraint.h | 100 ++ .../Fusion/Sketch/MidPointConstraint.h | 101 ++ .../Fusion/Sketch/MultiLineTextDefinition.h | 133 ++ .../include/Fusion/Sketch/OffsetConstraint.h | 147 ++ .../Fusion/Sketch/ParallelConstraint.h | 100 ++ .../Fusion/Sketch/PerpendicularConstraint.h | 100 ++ .../include/Fusion/Sketch/PolygonConstraint.h | 71 + .../CPP/include/Fusion/Sketch/Profile.h | 183 ++ .../CPP/include/Fusion/Sketch/ProfileCurve.h | 173 ++ .../CPP/include/Fusion/Sketch/ProfileCurves.h | 87 + .../CPP/include/Fusion/Sketch/ProfileLoop.h | 127 ++ .../CPP/include/Fusion/Sketch/ProfileLoops.h | 88 + .../CPP/include/Fusion/Sketch/Profiles.h | 91 + .../Sketch/RectangularPatternConstraint.h | 48 + .../CPP/include/Fusion/Sketch/Sketch.h | 829 +++++++++ .../Fusion/Sketch/SketchAngularDimension.h | 100 ++ .../CPP/include/Fusion/Sketch/SketchArc.h | 159 ++ .../CPP/include/Fusion/Sketch/SketchArcs.h | 140 ++ .../CPP/include/Fusion/Sketch/SketchCircle.h | 145 ++ .../CPP/include/Fusion/Sketch/SketchCircles.h | 185 ++ .../Sketch/SketchConcentricCircleDimension.h | 100 ++ .../include/Fusion/Sketch/SketchConicCurve.h | 153 ++ .../include/Fusion/Sketch/SketchConicCurves.h | 88 + .../CPP/include/Fusion/Sketch/SketchCurve.h | 191 ++ .../CPP/include/Fusion/Sketch/SketchCurves.h | 193 +++ .../Fusion/Sketch/SketchDiameterDimension.h | 90 + .../include/Fusion/Sketch/SketchDimension.h | 204 +++ .../Fusion/Sketch/SketchDimensionList.h | 88 + .../include/Fusion/Sketch/SketchDimensions.h | 244 +++ .../CPP/include/Fusion/Sketch/SketchEllipse.h | 200 +++ .../SketchEllipseMajorRadiusDimension.h | 90 + .../SketchEllipseMinorRadiusDimension.h | 90 + .../include/Fusion/Sketch/SketchEllipses.h | 107 ++ .../Fusion/Sketch/SketchEllipticalArc.h | 201 +++ .../Fusion/Sketch/SketchEllipticalArcs.h | 88 + .../CPP/include/Fusion/Sketch/SketchEntity.h | 316 ++++ .../include/Fusion/Sketch/SketchEntityList.h | 87 + .../Fusion/Sketch/SketchFittedSpline.h | 249 +++ .../Fusion/Sketch/SketchFittedSplines.h | 118 ++ .../include/Fusion/Sketch/SketchFixedSpline.h | 160 ++ .../Fusion/Sketch/SketchFixedSplines.h | 105 ++ .../CPP/include/Fusion/Sketch/SketchLine.h | 146 ++ .../include/Fusion/Sketch/SketchLineList.h | 87 + .../Fusion/Sketch/SketchLinearDimension.h | 111 ++ .../CPP/include/Fusion/Sketch/SketchLines.h | 204 +++ .../Sketch/SketchOffsetCurvesDimension.h | 91 + .../Fusion/Sketch/SketchOffsetDimension.h | 101 ++ .../CPP/include/Fusion/Sketch/SketchPoint.h | 151 ++ .../include/Fusion/Sketch/SketchPointList.h | 87 + .../CPP/include/Fusion/Sketch/SketchPoints.h | 104 ++ .../Fusion/Sketch/SketchRadialDimension.h | 90 + .../CPP/include/Fusion/Sketch/SketchText.h | 306 ++++ .../Fusion/Sketch/SketchTextDefinition.h | 65 + .../include/Fusion/Sketch/SketchTextInput.h | 277 +++ .../CPP/include/Fusion/Sketch/SketchTexts.h | 141 ++ .../CPP/include/Fusion/Sketch/Sketches.h | 154 ++ .../include/Fusion/Sketch/SmoothConstraint.h | 100 ++ .../Fusion/Sketch/SymmetryConstraint.h | 111 ++ .../include/Fusion/Sketch/TangentConstraint.h | 100 ++ .../Fusion/Sketch/VerticalConstraint.h | 90 + .../Fusion/Sketch/VerticalPointsConstraint.h | 100 ++ .../include/Fusion/TSpline/TSplineBodies.h | 125 ++ .../CPP/include/Fusion/TSpline/TSplineBody.h | 144 ++ usr/autodesk/CPP/lib/cam.lib | Bin 0 -> 77744 bytes usr/autodesk/CPP/lib/core.lib | Bin 0 -> 416770 bytes usr/autodesk/CPP/lib/drawing.lib | Bin 0 -> 11320 bytes usr/autodesk/CPP/lib/fusion.lib | Bin 0 -> 753918 bytes 606 files changed, 81468 insertions(+) create mode 100644 usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.cpp create mode 100644 usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.dll create mode 100644 usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.dylib create mode 100644 usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.manifest create mode 100644 usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.vcxproj create mode 100644 usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.xcodeproj/project.pbxproj create mode 100644 usr/autodesk/CPP/AddInSamples/AddInSample/help.html create mode 100644 usr/autodesk/CPP/AddInSamples/AddInSample/resources/16x16-dark.png create mode 100644 usr/autodesk/CPP/AddInSamples/AddInSample/resources/16x16-disabled.png create mode 100644 usr/autodesk/CPP/AddInSamples/AddInSample/resources/16x16.png create mode 100644 usr/autodesk/CPP/AddInSamples/AddInSample/resources/32x32-dark.png create mode 100644 usr/autodesk/CPP/AddInSamples/AddInSample/resources/32x32-disabled.png create mode 100644 usr/autodesk/CPP/AddInSamples/AddInSample/resources/32x32.png create mode 100644 usr/autodesk/CPP/AddInSamples/SpurGear/Resources/GearEnglish.png create mode 100644 usr/autodesk/CPP/AddInSamples/SpurGear/Resources/GearMetric.png create mode 100644 usr/autodesk/CPP/AddInSamples/SpurGear/Resources/SpurGear/16x16.png create mode 100644 usr/autodesk/CPP/AddInSamples/SpurGear/Resources/SpurGear/16x16@2x.png create mode 100644 usr/autodesk/CPP/AddInSamples/SpurGear/Resources/SpurGear/32x32.png create mode 100644 usr/autodesk/CPP/AddInSamples/SpurGear/Resources/SpurGear/32x32@2x.png create mode 100644 usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.cpp create mode 100644 usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.dll create mode 100644 usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.dylib create mode 100644 usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.manifest create mode 100644 usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.vcxproj create mode 100644 usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.xcodeproj/project.pbxproj create mode 100644 usr/autodesk/CPP/Default/DEFAULT.cpp create mode 100644 usr/autodesk/CPP/Default/DEFAULT.dll create mode 100644 usr/autodesk/CPP/Default/DEFAULT.dylib create mode 100644 usr/autodesk/CPP/Default/DEFAULT.manifest create mode 100644 usr/autodesk/CPP/Default/DEFAULT.vcxproj create mode 100644 usr/autodesk/CPP/Default/DEFAULT.xcodeproj/project.pbxproj create mode 100644 usr/autodesk/CPP/DefaultAddIn/DEFAULT.cpp create mode 100644 usr/autodesk/CPP/DefaultAddIn/DEFAULT.dll create mode 100644 usr/autodesk/CPP/DefaultAddIn/DEFAULT.dylib create mode 100644 usr/autodesk/CPP/DefaultAddIn/DEFAULT.manifest create mode 100644 usr/autodesk/CPP/DefaultAddIn/DEFAULT.vcxproj create mode 100644 usr/autodesk/CPP/DefaultAddIn/DEFAULT.xcodeproj/project.pbxproj create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.cpp create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.dll create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.dylib create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.manifest create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.vcxproj create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.xcodeproj/project.pbxproj create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/16x16-disabled.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/16x16.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/One/16x16-disabled.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/One/16x16-pressed.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/One/16x16.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/One/32x32-pressed.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/One/32x32.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Three/16x16-disabled.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Three/16x16-pressed.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Three/16x16.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Three/32x32-pressed.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Three/32x32.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Two/16x16-disabled.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Two/16x16-pressed.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Two/16x16.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Two/32x32.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Two/32x32pressed.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/lowerLeft/16x16-disabled.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/lowerLeft/16x16.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/lowerLeft/32x32.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/lowerRight/16x16-disabled.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/lowerRight/16x16.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/lowerRight/32x32.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_bold/16x16-disabled.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_bold/16x16.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_bold/32x32.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_italic/16x16-disabled.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_italic/16x16.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_italic/32x32.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_strikethrough/16x16-disabled.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_strikethrough/16x16.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_strikethrough/32x32.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_underline/16x16-disabled.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_underline/16x16.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_underline/32x32.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/upperLeft/16x16-disabled.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/upperLeft/16x16.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/upperLeft/32x32.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/upperRight/16x16-disabled.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/upperRight/16x16.png create mode 100644 usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/upperRight/32x32.png create mode 100644 usr/autodesk/CPP/Samples/SpurGear/Resources/GearEnglish.png create mode 100644 usr/autodesk/CPP/Samples/SpurGear/Resources/GearMetric.png create mode 100644 usr/autodesk/CPP/Samples/SpurGear/Resources/SpurGear/16x16.png create mode 100644 usr/autodesk/CPP/Samples/SpurGear/Resources/SpurGear/16x16@2x.png create mode 100644 usr/autodesk/CPP/Samples/SpurGear/Resources/SpurGear/32x32.png create mode 100644 usr/autodesk/CPP/Samples/SpurGear/Resources/SpurGear/32x32@2x.png create mode 100644 usr/autodesk/CPP/Samples/SpurGear/SpurGear.cpp create mode 100644 usr/autodesk/CPP/Samples/SpurGear/SpurGear.dll create mode 100644 usr/autodesk/CPP/Samples/SpurGear/SpurGear.dylib create mode 100644 usr/autodesk/CPP/Samples/SpurGear/SpurGear.manifest create mode 100644 usr/autodesk/CPP/Samples/SpurGear/SpurGear.vcxproj create mode 100644 usr/autodesk/CPP/Samples/SpurGear/SpurGear.xcodeproj/project.pbxproj create mode 100644 usr/autodesk/CPP/Samples/TestScript/TestScript.cpp create mode 100644 usr/autodesk/CPP/Samples/TestScript/TestScript.dll create mode 100644 usr/autodesk/CPP/Samples/TestScript/TestScript.dylib create mode 100644 usr/autodesk/CPP/Samples/TestScript/TestScript.manifest create mode 100644 usr/autodesk/CPP/Samples/TestScript/TestScript.vcxproj create mode 100644 usr/autodesk/CPP/Samples/TestScript/TestScript.xcodeproj/project.pbxproj create mode 100644 usr/autodesk/CPP/include/CAM/CAM/CAM.h create mode 100644 usr/autodesk/CPP/include/CAM/CAM/CAMFolder.h create mode 100644 usr/autodesk/CPP/include/CAM/CAM/CAMFolders.h create mode 100644 usr/autodesk/CPP/include/CAM/CAM/CAMPattern.h create mode 100644 usr/autodesk/CPP/include/CAM/CAM/CAMPatterns.h create mode 100644 usr/autodesk/CPP/include/CAM/CAM/ChildOperationList.h create mode 100644 usr/autodesk/CPP/include/CAM/CAM/GenerateToolpathFuture.h create mode 100644 usr/autodesk/CPP/include/CAM/CAM/MachiningTime.h create mode 100644 usr/autodesk/CPP/include/CAM/CAM/PostProcessInput.h create mode 100644 usr/autodesk/CPP/include/CAM/CAM/Setup.h create mode 100644 usr/autodesk/CPP/include/CAM/CAM/SetupEvents.h create mode 100644 usr/autodesk/CPP/include/CAM/CAM/Setups.h create mode 100644 usr/autodesk/CPP/include/CAM/CAMAll.h create mode 100644 usr/autodesk/CPP/include/CAM/CAMTypeDefs.h create mode 100644 usr/autodesk/CPP/include/CAM/Global/CAMLibraryManager.h create mode 100644 usr/autodesk/CPP/include/CAM/Global/CAMManager.h create mode 100644 usr/autodesk/CPP/include/CAM/Global/MachineDescription.h create mode 100644 usr/autodesk/CPP/include/CAM/Global/NetworkMachineEvents.h create mode 100644 usr/autodesk/CPP/include/CAM/Global/NetworkMachineIntegrationInput.h create mode 100644 usr/autodesk/CPP/include/CAM/Global/NetworkMachineIntegrationManager.h create mode 100644 usr/autodesk/CPP/include/CAM/Machine/LinearMachineAxis.h create mode 100644 usr/autodesk/CPP/include/CAM/Machine/LinearMachineAxisInput.h create mode 100644 usr/autodesk/CPP/include/CAM/Machine/Machine.h create mode 100644 usr/autodesk/CPP/include/CAM/Machine/MachineAxis.h create mode 100644 usr/autodesk/CPP/include/CAM/Machine/MachineAxisInput.h create mode 100644 usr/autodesk/CPP/include/CAM/Machine/MachineCapabilities.h create mode 100644 usr/autodesk/CPP/include/CAM/Machine/MachineKinematics.h create mode 100644 usr/autodesk/CPP/include/CAM/Machine/MachinePart.h create mode 100644 usr/autodesk/CPP/include/CAM/Machine/MachinePartInput.h create mode 100644 usr/autodesk/CPP/include/CAM/Machine/MachineParts.h create mode 100644 usr/autodesk/CPP/include/CAM/Machine/RotaryMachineAxis.h create mode 100644 usr/autodesk/CPP/include/CAM/Machine/RotaryMachineAxisInput.h create mode 100644 usr/autodesk/CPP/include/CAM/Operations/CAMParameter.h create mode 100644 usr/autodesk/CPP/include/CAM/Operations/CAMParameters.h create mode 100644 usr/autodesk/CPP/include/CAM/Operations/Operation.h create mode 100644 usr/autodesk/CPP/include/CAM/Operations/OperationBase.h create mode 100644 usr/autodesk/CPP/include/CAM/Operations/Operations.h create mode 100644 usr/autodesk/CPP/include/CAM/SandvikIntegration/SandvikIntegration.h create mode 100644 usr/autodesk/CPP/include/CAM/SandvikIntegration/SandvikIntegrationEvents.h create mode 100644 usr/autodesk/CPP/include/Core/.gitignore create mode 100644 usr/autodesk/CPP/include/Core/Base.h create mode 100644 usr/autodesk/CPP/include/Core/Deallocator.h create mode 100644 usr/autodesk/CPP/include/Core/Memory.h create mode 100644 usr/autodesk/CPP/include/Core/OSMacros.h create mode 100644 usr/autodesk/CPP/include/Core/Utils.h create mode 100644 usr/autodesk/CPP/include/Drawing/Drawing/Drawing.h create mode 100644 usr/autodesk/CPP/include/Drawing/Drawing/DrawingDocument.h create mode 100644 usr/autodesk/CPP/include/Drawing/Drawing/DrawingExportManager.h create mode 100644 usr/autodesk/CPP/include/Drawing/Drawing/DrawingExportOptions.h create mode 100644 usr/autodesk/CPP/include/Drawing/Drawing/PDFExportOptions.h create mode 100644 usr/autodesk/CPP/include/Drawing/DrawingAll.h create mode 100644 usr/autodesk/CPP/include/Drawing/DrawingTypeDefs.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepBodies.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepBody.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepBodyDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepCoEdge.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepCoEdgeDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepCoEdgeDefinitions.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepCoEdges.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepEdge.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepEdgeDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepEdges.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepFace.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepFaceDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepFaceDefinitions.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepFaces.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepLoop.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepLoopDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepLoopDefinitions.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepLoops.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepLump.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepLumpDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepLumpDefinitions.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepLumps.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepShell.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepShellDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepShellDefinitions.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepShells.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepVertex.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepVertexDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepVertices.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepWire.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepWireDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepWireEdgeDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepWireEdgeDefinitions.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/BRepWires.h create mode 100644 usr/autodesk/CPP/include/Fusion/BRep/TemporaryBRepManager.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/AsBuiltJoint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/AsBuiltJointInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/AsBuiltJointList.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/AsBuiltJoints.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/BallJointMotion.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/BaseComponent.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/Component.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/ComponentList.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/Components.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/ContactSet.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/ContactSets.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/CylindricalJointMotion.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/Joint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/JointGeometry.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/JointInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/JointLimits.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/JointList.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/JointMotion.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/JointOrigin.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/JointOriginInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/JointOriginList.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/JointOrigins.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/Joints.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/Occurrence.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/OccurrenceList.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/Occurrences.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/PinSlotJointMotion.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/PlanarJointMotion.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/RevoluteJointMotion.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/RigidGroup.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/RigidGroupList.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/RigidGroups.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/RigidJointMotion.h create mode 100644 usr/autodesk/CPP/include/Fusion/Components/SliderJointMotion.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxes.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxis.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisByLineDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisCircularFaceDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisEdgeDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisNormalToFaceAtPointDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisPerpendicularAtPointDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisTwoPlaneDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisTwoPointDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlane.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneAtAngleDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneByPlaneDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneDistanceOnPathDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneMidplaneDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneOffsetDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneTangentAtPointDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneTangentDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneThreePointsDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneTwoEdgesDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlanes.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPoint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointCenterDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointEdgePlaneDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointPointDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointThreePlanesDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointTwoEdgesDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Construction/ConstructionPoints.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/AllExtentDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/AngleExtentDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/AtCenterHolePositionDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/BRepCell.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/BRepCells.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/BaseFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/BaseFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/BoundaryFillFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/BoundaryFillFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/BoundaryFillFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/BoxFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/BoxFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ChamferEdgeSet.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ChamferEdgeSets.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ChamferFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ChamferFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ChamferFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ChamferTypeDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ChordLengthFilletEdgeSet.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CircularPatternFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CircularPatternFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CircularPatternFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CoilFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CoilFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CoilFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CombineFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CombineFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CombineFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ConstantRadiusFilletEdgeSet.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CopyPasteBodies.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CopyPasteBody.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CustomFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CustomFeatureDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CustomFeatureDependencies.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CustomFeatureDependency.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CustomFeatureEvents.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CustomFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CustomFeatureParameter.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CustomFeatureParameters.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CustomFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CustomNamedValues.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CutPasteBodies.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CutPasteBody.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CylinderFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/CylinderFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/DeleteFaceFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/DeleteFaceFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/DistanceAndAngleChamferEdgeSet.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/DistanceAndAngleChamferTypeDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/DistanceExtentDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/DraftFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/DraftFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/DraftFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/EqualDistanceChamferEdgeSet.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/EqualDistanceChamferTypeDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ExtendFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ExtendFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ExtendFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ExtentDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ExtrudeFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ExtrudeFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ExtrudeFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/Feature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/FeatureList.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/Features.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/FilletEdgeSet.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/FilletEdgeSets.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/FilletFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/FilletFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/FilletFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/FlangeFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/FlangeFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/FormFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/FormFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/FromEntityStartDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/HoleFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/HoleFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/HoleFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/HolePositionDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/LoftCenterLineOrRail.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/LoftCenterLineOrRails.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/LoftDirectionEndCondition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/LoftEndCondition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/LoftFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/LoftFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/LoftFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/LoftFreeEndCondition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/LoftPointSharpEndCondition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/LoftPointTangentEndCondition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/LoftSection.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/LoftSections.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/LoftSmoothEndCondition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/LoftTangentEndCondition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/MirrorFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/MirrorFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/MirrorFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/MoveFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/MoveFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/MoveFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/OffsetFacesFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/OffsetFacesFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/OffsetFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/OffsetFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/OffsetFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/OffsetStartDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/OnEdgeHolePositionDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/OneSideToExtentDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/PatchFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/PatchFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/PatchFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/Path.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/PathEntity.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/PathPatternFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/PathPatternFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/PathPatternFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/PatternElement.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/PatternElements.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/PipeFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/PipeFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/PlaneAndOffsetsHolePositionDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/PointHolePositionDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ProfilePlaneStartDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RectangularPatternFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RectangularPatternFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RectangularPatternFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RefoldFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RefoldFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RemoveFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RemoveFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ReplaceFaceFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ReplaceFaceFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ReplaceFaceFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ReverseNormalFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ReverseNormalFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RevolveFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RevolveFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RevolveFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RibFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RibFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RuleFilletFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RuleFilletFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RuledSurfaceFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RuledSurfaceFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/RuledSurfaceFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ScaleFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ScaleFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ScaleFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ShellFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ShellFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ShellFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SilhouetteSplitFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SilhouetteSplitFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SilhouetteSplitFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SketchPointHolePositionDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SketchPointsHolePositionDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SphereFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SphereFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SplitBodyFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SplitBodyFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SplitBodyFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SplitFaceFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SplitFaceFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SplitFaceFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/StitchFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/StitchFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/StitchFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SurfaceDeleteFaceFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SurfaceDeleteFaceFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SweepFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SweepFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SweepFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/SymmetricExtentDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ThickenFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ThickenFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ThickenFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ThreadDataQuery.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ThreadFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ThreadFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ThreadFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ThreadInfo.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ThroughAllExtentDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/ToEntityExtentDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/TorusFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/TorusFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/TrimFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/TrimFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/TrimFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/TwoDistancesChamferEdgeSet.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/TwoDistancesChamferTypeDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/TwoSidesAngleExtentDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/TwoSidesDistanceExtentDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/TwoSidesToExtentDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/UnfoldFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/UnfoldFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/UnstitchFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/UnstitchFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/UntrimFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/UntrimFeatureInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/UntrimFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/VariableRadiusFilletEdgeSet.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/WebFeature.h create mode 100644 usr/autodesk/CPP/include/Fusion/Features/WebFeatures.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/AreaProperties.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/BooleanParameterValue.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/C3MFExportOptions.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/ChoiceParameterValue.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/Design.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/ExportManager.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/ExportOptions.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/FloatParameterValue.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/FusionArchiveExportOptions.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/FusionDefaultUnitsPreferences.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/FusionDocument.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/FusionProductPreferences.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/FusionUnitsManager.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/IGESExportOptions.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/IntegerParameterValue.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/InterferenceInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/InterferenceResult.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/InterferenceResults.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/ModelParameter.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/ModelParameters.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/Parameter.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/ParameterList.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/ParameterValue.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/PhysicalProperties.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/SATExportOptions.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/SMTExportOptions.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/STEPExportOptions.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/STLExportOptions.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/Snapshot.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/Snapshots.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/StringParameterValue.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/Timeline.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/TimelineGroup.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/TimelineGroups.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/TimelineObject.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/UserParameter.h create mode 100644 usr/autodesk/CPP/include/Fusion/Fusion/UserParameters.h create mode 100644 usr/autodesk/CPP/include/Fusion/FusionAll.h create mode 100644 usr/autodesk/CPP/include/Fusion/FusionTypeDefs.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsAppearanceColorEffect.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBRepBody.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBRepEdges.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBRepFaces.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBRepVertices.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBasicMaterialColorEffect.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBillBoard.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsColorEffect.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsCoordinates.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsCurve.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsEntity.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsGroup.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsGroups.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsLines.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsMesh.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsPointSet.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsShowThroughColorEffect.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsSolidColorEffect.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsText.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsVertexColorEffect.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsViewPlacement.h create mode 100644 usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsViewScale.h create mode 100644 usr/autodesk/CPP/include/Fusion/MeshBody/MeshBodies.h create mode 100644 usr/autodesk/CPP/include/Fusion/MeshBody/MeshBody.h create mode 100644 usr/autodesk/CPP/include/Fusion/MeshBody/MeshBodyList.h create mode 100644 usr/autodesk/CPP/include/Fusion/MeshData/MeshManager.h create mode 100644 usr/autodesk/CPP/include/Fusion/MeshData/PolygonMesh.h create mode 100644 usr/autodesk/CPP/include/Fusion/MeshData/TextureImage.h create mode 100644 usr/autodesk/CPP/include/Fusion/MeshData/TriangleMesh.h create mode 100644 usr/autodesk/CPP/include/Fusion/MeshData/TriangleMeshCalculator.h create mode 100644 usr/autodesk/CPP/include/Fusion/MeshData/TriangleMeshList.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/AlongPathTextDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/CircularPatternConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/CoincidentConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/CollinearConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/ConcentricConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/EqualConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/FitOnPathTextDefintion.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/GeometricConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/GeometricConstraintList.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/GeometricConstraints.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/HorizontalConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/HorizontalPointsConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/MidPointConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/MultiLineTextDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/OffsetConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/ParallelConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/PerpendicularConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/PolygonConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/Profile.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/ProfileCurve.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/ProfileCurves.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/ProfileLoop.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/ProfileLoops.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/Profiles.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/RectangularPatternConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/Sketch.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchAngularDimension.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchArc.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchArcs.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchCircle.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchCircles.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchConcentricCircleDimension.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchConicCurve.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchConicCurves.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchCurve.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchCurves.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchDiameterDimension.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchDimension.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchDimensionList.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchDimensions.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipse.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipseMajorRadiusDimension.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipseMinorRadiusDimension.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipses.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipticalArc.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipticalArcs.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchEntity.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchEntityList.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchFittedSpline.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchFittedSplines.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchFixedSpline.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchFixedSplines.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchLine.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchLineList.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchLinearDimension.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchLines.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchOffsetCurvesDimension.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchOffsetDimension.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchPoint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchPointList.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchPoints.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchRadialDimension.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchText.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchTextDefinition.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchTextInput.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SketchTexts.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/Sketches.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SmoothConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/SymmetryConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/TangentConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/VerticalConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/Sketch/VerticalPointsConstraint.h create mode 100644 usr/autodesk/CPP/include/Fusion/TSpline/TSplineBodies.h create mode 100644 usr/autodesk/CPP/include/Fusion/TSpline/TSplineBody.h create mode 100644 usr/autodesk/CPP/lib/cam.lib create mode 100644 usr/autodesk/CPP/lib/core.lib create mode 100644 usr/autodesk/CPP/lib/drawing.lib create mode 100644 usr/autodesk/CPP/lib/fusion.lib diff --git a/usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.cpp b/usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.cpp new file mode 100644 index 0000000..2c9431e --- /dev/null +++ b/usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.cpp @@ -0,0 +1,479 @@ +//Author-Autodesk Inc. +//Description-This is sample addin. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace adsk::core; +using namespace adsk::fusion; + +const std::string btnCmdIdOnQAT = "demoButtonCommandOnQATCPP"; +const std::string listCmdIdOnQAT = "demoListCommandOnQATCPP"; +const std::string commandIdOnPanel = "demoCommandOnPanelCPP"; +const std::string iconResources = "./resources"; +const std::string selectionInputId = "selectionInput"; +const std::string distanceInputId = "distanceValueCommandInput"; +const std::string panelId = "SolidCreatePanel"; + +Ptr app; +Ptr ui; + +class CommandExecutedHandler : public adsk::core::CommandEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + Ptr firingEvent = eventArgs->firingEvent(); + if (!firingEvent) + return; + + Ptr command = firingEvent->sender(); + if (!command) + return; + + Ptr parentDefinition = command->parentCommandDefinition(); + if (!parentDefinition) + return; + + std::stringstream ss; + ss << "command: " + parentDefinition->id() << " executed successfully"; + + ui->messageBox(ss.str()); + } +}; + +class InputChangedHandler : public adsk::core::InputChangedEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + Ptr firingEvent = eventArgs->firingEvent(); + if (!firingEvent) + return; + + Ptr command = firingEvent->sender(); + if (!command) + return; + + Ptr parentDefinition = command->parentCommandDefinition(); + if (!parentDefinition) + return; + + Ptr cmdInput = eventArgs->input(); + if(!cmdInput) + return; + + if(cmdInput->id() != distanceInputId) + { + std::stringstream ss; + ss << "Input: " << parentDefinition->id() << " changed event triggered"; + ui->messageBox(ss.str()); + } + + if(cmdInput->id() == selectionInputId){ + Ptr inputs = cmdInput->commandInputs(); + Ptr distanceInput = inputs->itemById(distanceInputId); + + Ptr selInput = cmdInput; + if(selInput->selectionCount() > 0){ + Ptr sel = selInput->selection(0); + if(!sel) + return; + + Ptr selPt = sel->point(); + if(!selPt) + return; + + Ptr obj = sel->entity(); + if(!obj) + return; + + Ptr plane; + if(Ptr face = obj) + { + plane = face->geometry(); + } + else if(Ptr constructionPlane = obj) + { + plane = constructionPlane->geometry(); + } + if(!plane) + return; + + distanceInput->setManipulator(selPt, plane->normal()); + distanceInput->expression("10mm * 2"); + distanceInput->isEnabled(true); + distanceInput->isVisible(true); + } + else{ + distanceInput->isEnabled(false); + distanceInput->isVisible(false); + } + } + } +}; + +class CommandCreatedOnQATHandler : public adsk::core::CommandCreatedEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + if (eventArgs) + { + Ptr command = eventArgs->command(); + if (!command) + return; + + Ptr exec = command->execute(); + if (!exec) + return; + exec->add(&onCommandExecuted_); + + if (ui) + ui->messageBox("QAT command created successfully"); + } + } +private: + CommandExecutedHandler onCommandExecuted_; +} onCommandCreatedOnQAT; + +class CommandCreatedOnPanelHandler : public adsk::core::CommandCreatedEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + if (eventArgs) + { + Ptr command = eventArgs->command(); + if (!command) + return; + + command->helpFile("help.html"); + + Ptr exec = command->execute(); + if (!exec) + return; + exec->add(&onCommandExecuted_); + + Ptr inputChanged = command->inputChanged(); + if (!inputChanged) + return; + inputChanged->add(&onInputChanged_); + + // Define the inputs. + Ptr inputs = command->commandInputs(); + if (!inputs) + return; + + inputs->addValueInput("valueInput_", "Value", "cm", ValueInput::createByString("0.0 cm")); + inputs->addBoolValueInput("boolvalueInput_", "Bool", true); + inputs->addStringValueInput("stringValueInput_", "String Value", "Default value"); + Ptr selInput = inputs->addSelectionInput(selectionInputId, "Selection", "Select one"); + if (selInput) + { + selInput->setSelectionLimits(0); + selInput->addSelectionFilter("PlanarFaces"); + selInput->addSelectionFilter("ConstructionPlanes"); + } + + Ptr dropDownCommandInput = inputs->addDropDownCommandInput("dropdownCommandInput", "Drop Down", DropDownStyles::LabeledIconDropDownStyle); + if (dropDownCommandInput) + { + Ptr dropdownItems = dropDownCommandInput->listItems(); + if (!dropdownItems) + return; + dropdownItems->add("ListItem 1", true); + dropdownItems->add("ListItem 2", false); + dropdownItems->add("ListItem 3", false); + } + Ptr dropDownCommandInput2 = inputs->addDropDownCommandInput("dropDownCommandInput2", "Drop Down2", DropDownStyles::CheckBoxDropDownStyle); + if (dropDownCommandInput2) + { + Ptr dropdownItems = dropDownCommandInput2->listItems(); + if (!dropdownItems) + return; + dropdownItems->add("ListItem 1", true); + dropdownItems->add("ListItem 2", true); + dropdownItems->add("ListItem 3", false); + } + inputs->addFloatSliderCommandInput("floatSliderCommandInput", "Slider", "cm", 0.0, 10.0, true); + Ptr buttonRowCommandInput = inputs->addButtonRowCommandInput("buttonRowCommandInput", "Button Row", false); + if (buttonRowCommandInput) + { + Ptr buttonRowItems = buttonRowCommandInput->listItems(); + if (!buttonRowItems) + return; + buttonRowItems->add("ListItem 1", false, iconResources); + buttonRowItems->add("ListItem 2", true, iconResources); + buttonRowItems->add("ListItem 3", false, iconResources); + } + + Ptr distanceInput = inputs->addDistanceValueCommandInput(distanceInputId, "Distance", adsk::core::ValueInput::createByReal(0.0)); + if(distanceInput) + { + distanceInput->isEnabled(false); + distanceInput->isVisible(false); + distanceInput->minimumValue(1.0); + distanceInput->maximumValue(10.0); + } + + Ptr directionInput = inputs->addDirectionCommandInput("directionInput", "Direction"); + if(directionInput) + { + directionInput->setManipulator(Point3D::create(0,0,0), Vector3D::create(1,0,0)); + } + + Ptr directionInput2 = inputs->addDirectionCommandInput("directionInput2", "Direction2", iconResources); + if(directionInput2) + { + directionInput2->setManipulator(Point3D::create(0,0,0), Vector3D::create(0,1,0)); + } + + ui->messageBox("Panel command created successfully"); + } + } +private: + CommandExecutedHandler onCommandExecuted_; + InputChangedHandler onInputChanged_; +} onCommandCreatedOnPanel; + +extern "C" XI_EXPORT bool run(const char* context) +{ + const std::string commandName = "Demo"; + const std::string commandDescription = "Demo Command"; + const std::string commandResources = "./resources"; + + app = Application::get(); + if (!app) + return false; + + ui = app->userInterface(); + if (!ui) + return false; + + Ptr commandDefinitions = ui->commandDefinitions(); + if (!commandDefinitions) + return false; + + // add a button command on Quick Access Toolbar + Ptr toolbars = ui->toolbars(); + if (!toolbars) + return false; + + Ptr toolbarQAT = toolbars->itemById("QAT"); + if (!toolbarQAT) + return false; + + Ptr toolbarControlsQAT = toolbarQAT->controls(); + if (!toolbarControlsQAT) + return false; + Ptr btnCmdToolbarCtlQAT = toolbarControlsQAT->itemById(btnCmdIdOnQAT); + if (!btnCmdToolbarCtlQAT) + { + Ptr btnCmdDefinitionQAT = commandDefinitions->itemById(btnCmdIdOnQAT); + if (!btnCmdDefinitionQAT) + { + btnCmdDefinitionQAT = commandDefinitions->addButtonDefinition(btnCmdIdOnQAT, commandName, commandDescription, commandResources); + + } + + Ptr btnCmdCreatedEvent = btnCmdDefinitionQAT->commandCreated(); + if (!btnCmdCreatedEvent) + return false; + btnCmdCreatedEvent->add(&onCommandCreatedOnQAT); + btnCmdToolbarCtlQAT = toolbarControlsQAT->addCommand(btnCmdDefinitionQAT); + if (!btnCmdToolbarCtlQAT) + return false; + btnCmdToolbarCtlQAT->isVisible(true); + ui->messageBox("A demo button command is successfully added to the Quick Access Toolbar"); + } + + // add a list command on Quick Access Toolbar + Ptr listCmdToolbarCtlQAT = toolbarControlsQAT->itemById(listCmdIdOnQAT); + if (!listCmdToolbarCtlQAT) + { + Ptr listCmdDefinitionQAT = commandDefinitions->itemById(listCmdIdOnQAT); + if (!listCmdDefinitionQAT) + { + listCmdDefinitionQAT = commandDefinitions->addListDefinition(listCmdIdOnQAT, commandName, ListControlDisplayTypes::CheckBoxListType, commandResources); + if (!listCmdDefinitionQAT) + return false; + Ptr listCtlDefinition = listCmdDefinitionQAT->controlDefinition(); + if (!listCtlDefinition) + return false; + Ptr listItems = listCtlDefinition->listItems(); + if (!listItems) + return false; + listItems->add("Demo item 1", true); + listItems->add("Demo item 2", false); + listItems->add("Demo item 3", false); + } + + Ptr listCmdCreatedEvent = listCmdDefinitionQAT->commandCreated(); + if (!listCmdCreatedEvent) + return false; + listCmdCreatedEvent->add(&onCommandCreatedOnQAT); + listCmdToolbarCtlQAT = toolbarControlsQAT->addCommand(listCmdDefinitionQAT); + if (!listCmdToolbarCtlQAT) + return false; + listCmdToolbarCtlQAT->isVisible(true); + ui->messageBox("A demo list command is successfully added to the Quick Access Toolbar"); + } + + // add a command on create panel in modeling workspace + Ptr workspaces = ui->workspaces(); + if (!workspaces) + return false; + Ptr modelingWorkspace = workspaces->itemById("FusionSolidEnvironment"); + if (!modelingWorkspace) + return false; + Ptr toolbarPanels = modelingWorkspace->toolbarPanels(); + if (!toolbarPanels) + return false; + Ptr toolbarPanel = toolbarPanels->itemById(panelId); // add the new command under the CREATE panel + if (!toolbarPanel) + return false; + Ptr toolbarControlsPanel = toolbarPanel->controls(); + if (!toolbarControlsPanel) + return false; + Ptr toolbarControlPanel = toolbarControlsPanel->itemById(commandIdOnPanel); + if (!toolbarControlPanel) + { + Ptr commandDefinitionPanel = commandDefinitions->itemById(commandIdOnPanel); + if (!commandDefinitionPanel) + { + commandDefinitionPanel = commandDefinitions->addButtonDefinition(commandIdOnPanel, commandName, commandDescription, commandResources); + } + Ptr cmdCreatedEvent = commandDefinitionPanel->commandCreated(); + if (!cmdCreatedEvent) + return false; + cmdCreatedEvent->add(&onCommandCreatedOnPanel); + toolbarControlPanel = toolbarControlsPanel->addCommand(commandDefinitionPanel); + if (toolbarControlPanel) + toolbarControlPanel->isVisible(true); + ui->messageBox("A demo command is successfully added to the create panel in modeling workspace"); + } + + return true; +} + +extern "C" XI_EXPORT bool stop(const char* context) +{ + if (!ui) + return false; + + // Get controls and command definitions + Ptr toolbars = ui->toolbars(); + if (!toolbars) + return false; + Ptr toolbarQAT = toolbars->itemById("QAT"); + if (!toolbarQAT) + return false; + Ptr toolbarControlsQAT = toolbarQAT->controls(); + if (!toolbarControlsQAT) + return false; + Ptr btnCmdToolbarCtlQAT = toolbarControlsQAT->itemById(btnCmdIdOnQAT); + Ptr listCmdToolbarCtlQAT = toolbarControlsQAT->itemById(listCmdIdOnQAT); + Ptr commandDefinitions = ui->commandDefinitions(); + if (!commandDefinitions) + return false; + Ptr btnCmdDefinitionQAT = commandDefinitions->itemById(btnCmdIdOnQAT); + Ptr listCmdDefinitionQAT = commandDefinitions->itemById(listCmdIdOnQAT); + Ptr workspaces = ui->workspaces(); + if (!workspaces) + return false; + Ptr modelingWorkspace = workspaces->itemById("FusionSolidEnvironment"); + if (!modelingWorkspace) + return false; + Ptr toolbarPanels = modelingWorkspace->toolbarPanels(); + if (!toolbarPanels) + return false; + Ptr toolbarPanel = toolbarPanels->itemById(panelId); + if (!toolbarPanel) + return false; + Ptr toolbarControlsPanel = toolbarPanel->controls(); + if (!toolbarControlsPanel) + return false; + Ptr toolbarControlPanel = toolbarControlsPanel->itemById(commandIdOnPanel); + Ptr commandDefinitionPanel = commandDefinitions->itemById(commandIdOnPanel); + + // Delete controls and associated command definitions + if (btnCmdToolbarCtlQAT) + btnCmdToolbarCtlQAT->deleteMe(); + if (listCmdToolbarCtlQAT) + listCmdToolbarCtlQAT->deleteMe(); + if (btnCmdDefinitionQAT) + btnCmdDefinitionQAT->deleteMe(); + if (listCmdToolbarCtlQAT) + listCmdToolbarCtlQAT->deleteMe(); + if (toolbarControlPanel) + toolbarControlPanel->deleteMe(); + if (commandDefinitionPanel) + commandDefinitionPanel->deleteMe(); + + return true; +} + + +#ifdef XI_WIN + +#include + +BOOL APIENTRY DllMain(HMODULE hmodule, DWORD reason, LPVOID reserved) +{ + switch (reason) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +#endif // XI_WIN diff --git a/usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.dll b/usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.dll new file mode 100644 index 0000000000000000000000000000000000000000..8548a6217ce18361113f2afe12bc6ff1d97ded06 GIT binary patch literal 59760 zcmeFa3w%`7**>~+nGh~v24plS=%_)WCG{LqV9;cXe~xR>zwCVYwgLNkOchq|2yY@ z&guST&$BM?de^(&^{(q)d#CV@0kG!n#6@@PeTvAnD$-IUuSy8^GRot4Q1s5*5+@d+4o#YvtI9Ahw2w5dV zH`M}N!rcrtNOz*9rHG&b)I5lVa>rLEXo*@WJTj35hx%nm@5`FD9K7C)Xj+rtnV|JD zqXU|jnF`#iY4sC;sDvQH@6fayz;KtV1N8RDc1_b+@xxp*gMlU%H`<6FicAlU#CCZ! zt#oEXMOm;+)6O~{5#XumxTU~w$jb|JnkmV&&T$Cq#mzEAaN8~~LT1)WLQ%#8h#Z5v z+eQSZm;4$U8_MApI?v=P%6v^1r= z8j=bPP3S-sJRv{(S=2_RsIzEC1Q@4pwC}k3V#obW>T7WN{(mz)2ZVnoe-1eRPWs3Z zr)SBbP{=D4I<);T{@; zJ(leh0-_g7h_;KY&`+RcXXd2aI@NTmQ|-}>on|uT3+P{??mw-iW4r2OnMqtPJG4I1 zznMO~FizcAmeEvbyeQ1N(AW#1vmmo3EZlGSGwKUk)=1MIUBKqgMldnf957-f=+KR) z(0IDQcq!T*LE0g!#A_Q3Re#|18+kHw<8{GtAagXdSiTeVmiagA#54tY`8j%Eq*w+& zvecc6+y!u=9Y))GM#x&~OJrhek+MN^5bjYm^v(L;2xd=178XNRT=!}9e=YMreL)t4 zst>zgfRAPZ$uZzAaz6q82n88nE6RiVllmK|CsCuWxOyx!j;P{#DZ)_27ZqpaH?qA9 zR9T#XY-blKti<=n1j|s&!{?U;yJXQyQ69m1P}L1rE-Q;8?`~E7Sot9zk)KsHv=duq zu*d6msA>$m3*cnk`GCkd+I}Rxv}KQIT7|}Ig$5dbY+PqOG$vySRx)8y?Na*YKjAm42d=+^Sf-WRZYq1igf9iCt&u9k)9Jgn*!htfv zNV1f1eCnJ4i@~oSQ`B~@PKGqhB3mPqu6jW+N`q`!r9j~)@Ta|#eafC&->N9@+)P01hu|A-dQGkhR79r*9MS8ou zF7)3q{{t)$#}J0d{6`!wghq$zFljAA%RlT0b%=o-LH;8$v(k(HqEKb$i>eKbMCXa47-hK*k+1vEC4Wg2aG5UsQLsRuIW>Zo3UEe}v*uA)efDm)f zQrH}K0CLP{K7&}gu{I+|-w<`KKb7+fL_kry%qqs^XGeX;J7VhTH?j&h91La_7-vV_ z84aL>5{#YEOOZAbL4B=lVafD9A?V zx_hA%Aqd}wgUBCfFATs#XKS$g<~n^{MgseVX0zY)>H;dTU>kD}*59zA-vu*011 zB~dquITjma=HGmbYk6W52we?nx*?K8-4E4+tZM^O^j#>ceM z0eWbB}?;>nBgnP(7 z`+2ke0;o28X9g{{z_`*=U^HeG7&qh;81MQ@d{GjM~&4}vNfpou*_$*i6%4xw24wNAI|R?qDky{oWih46hREX@u@Cb#c?R#-l+R_ zln?qp>*s{Ry=J6HwTVjekDrJ(u_B{V80&^nBv}qq+hJbHsQm1Y^NoM`+iEuJ2JHD@ zaJp`s7j;jh)>+p(qnC*mf!RR6-j)w4m(?H&p~GjXL)ji`+6&q0CW#!DWfT>l)n&`v z*J1(2xV{wXa6CEI~(=aGMRf$@s@&^+Np?EQ!}uR#nAbZ|CjvIt!pGLeZi(BFCB+`hquUo5R6NbjdM z!(oP)rRUgWpisY@$!wtNG%)0pD3G5LjqzFU)mizuDy4zre z7oENwOQ7H7poOSk|AavOwib$ZvwR~)0`ohxzXIbez3r-q-|!S}*vHXgUPjcNM%{6^ zc;0FpVz|hU*c%5#w>J*3WGma`H%^JVw=rYUx_nU#TpV%Gs@T3Z4Y1e{jR|_cP_cV? zOwf1y6jb(B?FUdnVBuWv#ttGHcL&G2NB${F9O!`D&h@XWp%A^+^XAnbD`n(B8P4_h ziMZu3`RC0R8CBC=xZz{x`gMqb{bC%{^Ro~7+d`cMMm}malEbjlsC!DKQp5{l?GSZ| zlCVX!<#)zP!g01z48&Bc_jBZq>K80XKZhR069c@9WuOg4HD%aouKtLU!Z36_ zcT4an-AHAXLJEc;M;D5rCIuKaC;>XegB(TF7^55Lyjc3t1x5-d7nn96NT&^sp)05F zc-9@~C{&I6Lv}|Ibkwn$e}EbeyRZB)fhPLiVo~#09HP{;9SmRXUR2b8Fvy+4*!md2CNB_vu=no2{MzeR@MOQu{x{Y6Kz7Q)8=bJ^` zXv6?JXo3;t;An}0!7(_dz!-&LQIs5#!BW)pLpQ=jv;@pIv;}g$!Px-j8!(JUFXkJ% zns4~7@~sea4mp#Mzux7SVs2fX@d#!Sn^~`2`Jc;K1m-RD8;-U=lRah-`RC}yCvy7W zT#tuxP{#7Vo3HnYR(aLm#Vp|%8TfkH(QbT)VRti@n?3D!(4y@1R(K98?ZWxs zV<=^>+r~O5kyAraLF_W*^FywAJhEz5WMK8C8(-)xTU=517cwL49sC`xgIg1r3w$qD zkaHIeOpk41V@mlfsA47%dw%B;9HZ|0;&_Aycx1^3Xt9*i!S&f?zDv10lT*=NjtO1) zo7Ge_9jh~s^VIsidCpV4-LR(I2M{mjqn)gO6hh2Lo$EU$z>EG2W9bLNZdPP836r{! z5ncJNm}R7**85TGqfwpri#A!-epG@>RA9eqBkkSD2ptcCMdkHl{Zr1o zmN(N%uaLPFHp5n&>r$GXT*^Y#l=t2DgivDU>RkV_%Ob-@nK0z=@>X(NE6Hwb z6|>fRNTx)Gxu$N<@7H{tn2ypC|Fwz$(ObpbvMaw{S#{<1{9=$nktBOtk`D%*jK<1ESk4dr|^IS{; z0>|mHV~NYf*U7^fr~=W}p#k&l8Ir6%zNUmP>@G&rL4_8Z4-2wzKBi?*qSPG}3B{qi z-(_Yh#R)yd6lX8e(L)z$Kq>z$6=jYSH?GWkBtcx6eVu8tJWsJz)AGiv^2G7+i8C=M z_9jV|V}5Yjki|w*p?1C}$%@U0AXCLwCSxo1U1(^um*ICDv2 zLFRf)tSFB+uIFvJF-!J|=~4H~D}*F*xy1Dkf0hI;C59N8q^Pg6N-63mr;H?Owk7Iw zg3J;X8**`?K9AYq$fBNhI8jFrE9#k+sOOI;>c&!~)e}Y(^~A%9dh?aTX_a$6%qy-2 z0Sv;Lns;qDFknk2oZC0-#qU6Uk1wTUVFsGFOdC?&Zp5KId?pPj-Mo@yoC?AUH8cpO zwKQJJ(dAe%dfSbm`--8&euA<|^Cu7Nj|;M4L}ner$}vOYicwgi*(2vVJdGjD|A(WP zkJzbI?WYxtx92yhy{u+dWVo=&{BedXYMk}O8o{$xt=0>&aDJ1Rg2+aIDatZz>!A@e zsNtk|P$O`~W_dk0F*~?9qMK+J<>oZLDeAso&~p{O-vk$vn-H`EfxuoXk(6 zr=li@mwCz&$lPB%vYyi|na>K+j_iD|4lgM^4bK`BhBMY#GpV z9%$lP25VuEmFVHLPawM4|FYc72)qAkl_YQylZV|7A#=DNiOqy#WY`zdtoqFZMVFmNu(xEsfbjK^kW=hE znI-V`eU>ETZM0PR9C{QnXz6UVqs(hTv>!dzR=-;9LNQHhsOdJx?Xwg!5p)n58t4WG zXkeD)*l#uoj)K|LIA*pc3oUn>PoZm)T7E_(q4C`ynSI92hsxBMj3mDkZXq- zjIsK*V%213Nf-4HVA8Prc&pGaV_MPf%-o4AI?T#fs4umwv5LCOoF!`o1k+Mw;GNN6D~dQh)vCei@LzR~1l@S+egL4C61AlV%)a$v6a!-W!+LT(hty`c=fkT8o)<|RUQ zdx;7+nqTco^Lse%v|X#Y&B;oSGze~xth(X7GaY)5l-C*cTzU&Tm1lQDDiL; z(*d>Fm;=LYJdp3qT-3`g$E!=Q+jzMBD^Jutcd1a^#n{T4DV*HA%7ANND=TFQ^B%O7 zB{rbE%a{6=aRYNRHZa9TsNvZAONz)1OFVqohng^C3o`S=c^S!=5vb=@f&RSKfN74N zg6BSn83)Q5Ntp>EFGnYTTObESndZLZB+*#5zh&SbF2pu@zDE(IgDBN}3Pfx;MdlA* zgxQ4CZoLlyxm)mnZY^BFnYxj#=k5re!YPZj*KX|4+ooPcLhKKY!{m`qEzQv40B5v15f zLc0`CGGIt4?h&Mz4sIM{<+g4&hi#mg~kg={yQe4QA%IDv~OC3ix}o6IYY742jb_U|x^?J%Ev11wr@jL2!< zrl|Y1iH&I@Gq_p0jO zi|X$-uOyX`mceo(_f+#?DSPnrjA06$n9_`S4@HJ^hx^u%mSTV?s zQ)GCKy3>4Ln7uk}wBZ>Tnq^9M)5$b1A|2``hmR5CP3H@mPR>xKgVPefL!N>Yhs6TX z3y5c;J?8TsmSvE&sT~aG`p`hS9VXi|pF_gr4u*~$Sk+P(;$Yi zx_dDt1j!BT!o!8AR&-Bn)p4pe*9$6CT{yp6NRGK99>2>L^c`sP5TWf=`2K}pNedm! z*Q&y2NPy?{tjS^IOq6oID;v;oa=wYF9qMX8P8e29&Uf}6M$YpNC+Act=cOaad4-U` zec{M*&KXJ0a}Foxj}{+BpCJ+qJgl}hJkSihG`X{1kc#k%0m;pgDeS)F9yE+Q854Gg za0-DHVa^kMu%tSDjXD6ZM93`3>**u~c=9qtg3sH$8 z%Ka?IF=m}ExMM9VMI=3YIclqvGIomr283rSPNn8Ea3LcOe;w>ypqWyc`UXLR$81b_ z_488CP39c~2?8oXlT5H!B;d2MZnIXXv#{9=43M88$n%>e^%TXvp5)&ZCFjlFQGq&m?~oEb=_fyvRH7%9_QW1( zx1b7LX!WF^>>{OoP{!kM)ujYg$wkkaCi_^}+Rwp+9@Ax(6hJ-gf{nYXfO(?&vKS4eq?)hL zg_SQtIas4%@Mz8s^A|74jIoaEF~5b05Yly+O@b}!UpTmMdj>8nbMOp1wh+5T@a#5k z6Jv_|AG%20Z9eLt!`-O59P?iK4ae3FfRMTX3GGdys#`UQh)9Vh@vv}E10O3_j`=QJ zf5LNAO7p4;tv6o~E*Q`@71X5i$M9rsR$*D@ua!$T@1)C+qbiwInzxBKtXI}aN4wc1 z9UIL$;o$r`0N4J+*>6BUsb;#2&orIVVVWs$_zgK{_Jcd;&^r8_Q{%8QW{*18IDcTz zvu+!g6}}Z$UbPk6FkiSlAE9A)VvvB+ho|!th=@8*Mt#tzq8b<#cX^j{vGQ9iRwBYS z95a3ZTCrF;6VsYPE?qFK88ti77hyNhc4vl|I$>h5mkBWO?*;nX?#bw+KfL@^f7|^T zn?=~;867|~rwbKiT=lB3rTp0+_brqiN(VdbaG^6cv7XME6^6_c0NAH>YUaPji@L`C z(Q>S|c9=CiVAXQtbU9gaM%`=ksJTEF4$g#9$@?uad0GBM5K^GV^vJFT0|aE~27pB;Un?@A3~w`JpTn4#nUo*X&4Z z{=#%O zp~3PD(KvO6NFMiB>pax5Jpa$rQJ@ekolFa@gObDmVfB2^qylYERDN1?tMI0}_1 zXZqXoA5LH(Rs$jsN6L7X%{F7me+NAv59D!83yU#AALvFtG!P3ESrnxXoZq4);Jj|l z!ytq?#0U$q>lRy1$Di?vWynU(Dvw{HP$@WIrw&%>2D-~#LZGW&EifjD^JEkc=l6CX z*l(ydhmN9`yueemNu1tc8)b*m0rWW^dd6?aHi@b@lRZfQOE2^!5k!k_1TATzk5%S= ztd3CVG|xX-b|Z-T+$*AZ9$iGuV3fSL{W9=%0qgv@Snc`bJN?FM{x+X0uQeerCowp_ z0Eb@-qLGEo^AfetL38R@uoN%%tB)k8^XGik6wA>DRMF_D`^U_`YmwyFwaA4mwe3lm zVaI)1K?tPMVB> zxd}M6YrWPva9&9_uqMIjq0!t?InHJRdfN%CW>lP*mZDs-xBvM)h`fyS;Wnkfk1v)8 z$-|DHa9nP~5at-g{s2nV*KI+!g-2yKorf(elCn0$W7EshX*=$#7(t^i*OQU(>kF7L zd9Dfxf3GqcjkYbD`;{KP7*A=Z3+k}r1VMH|y59AjW@e77>pQK|f$D;>$BuB>%fF7? zsDtt%X7)Y7W&Ic#DkEjgQ|I&Z4!1BOuWkL93gAKC0lYu#Yi5NNY!tPA7o^dR3pQdw z(+1^T&?%uucsisfB4KY^YRfeTzSi3=Hc^u1sM|3gX~P${4(J*O&FT?oy}z^t`iZ@0 zX+9+8BI+9xvAU+iyA+4XT0Y7&eD!&JSK+lyiNUe3VOUb8@9HbJwtN{4je$`p@21q? z48Ku;dEEqk!|vb-e#2K;klWLEv~Ku{_43q0)St1aSWkM+H=~;cS>)xJQIMV@!pl<; zrRTobh^D_I>i+#aD5^EfhxhMP20Gp{DFS^cIXk)^$9}=9JO_}j&&bh}zC@+#FZSsz zUw9fvJ>o%)?dK~BLC-4Z3F}4ubwbxS>od0Kxm}G8kcR$-_>hYw5~n|7*;HfY6h3_} zk09$f|A?cj$LlTsie8UAU%>KFU!n2?Q%x}VBrR{3XE4d z@SO-rI0hGj#-q12R_bk8aC#*aw`DTz!A14SG9V{7QRg_qEEW~DW%bd>WmHj@MicM5 zRYYFs!JCN%GrIJIMU{ddkKZz&V8*L@0yXW`lU~u=5W1+?*g505q!-#!nNJW+6)F=_ zAs}oxD=8=5i8tAs_}H|gss`T@iiILAp0a3AJ!ql_%8MvmlPG0C+bO0>oCD&=R=8G!7e#; zHWIUl%=9#W?$g(&=yNZrTz!InuCKB&8ND@>>8te3NbuofHO$jUbv~3Jb6|VN`=`bl zFnHb1H*7K5MsPYuRA6l7_hSkT%w|{@uN5ZY)g~WGh{hII zC15oPtWZFI?u*X#kFyTYQeD1-TM~k`d<9HzS)c_g3ODR_wqlkBue^xjJmUgjyO2;eP_JW!0E!E4;l@OcW6o+ zi~q3zs`*l9zy6vSywb(sweK9!d!?(v3#t&keUbP@ABZYr|3@gs;8k9a!Rtb_JMouywi|m6KAq^? z@Ke@3j0A7Q7qS`L20sTWgh5$_d(q_;;sH@t{sFGV@GjF9z3oQR+j`?(|BR>2T6Dg# ziCEhWE^lkDZY)2bw|wbp#JHDlVrmyW6>9_Vf#|zX5)p3{nkb%2Z(Ew)w^>MloZ5I4 z1K~>{|Aj8m$sc?=IRuXEa>SsB&e&JvFQ>%ml+KT?3^7VNNMs3T?g7{Ru^21(5LpW$ z>ld!ZDVD6q#$-KN$Xa+{KNbl25Ds&-dEFhH%Po zg>GDuPTe;+z=oSv7}gIoED}NRjn`DGuEZhRXZoGBGu zklWu#MPy@ekGkKQ4Mh~p==bODDsV3RLeG6JG-q)*c@%~}mmnJ_$Q~k@E*3GErt=dz zqqirgLf{?d8#Gi*gkCkv;KH7mPj9)2U(?Zzv!xPI#<8p?p$0qzo-`AxFyA_Q1U*z! z4|pYTkTS&lRhH;=n1HO&TQD)f`))!)HY@ZUS?DElpKd%B9f8aI5Mt4`v#@BvLPr`U zXPnT`8d;?*kGB=8h(T1yZ=ip~906AH8uWMlIZ_o}KCyCZn1l-0&P=w*x)(JE-}VHA zZMB7Q9E3HC&ki9==slRWI6Nr<`iQz4P=W!&z{98{X%lt^w6NsdL0ktqPq_FUA?N@f z)ewuYrI+&Mk(Q4zDa?~^w-oU7$ZPmcp5C&{skcPGUXA+sa{pP-6^6)e&bB-6yH{TN z=O5@Veh8yjeYD=yCEhrJ5zp9y3Ci`!i^KCUUR;b%g<&@RELMmuUqr7TA9X)Hi#@P4 zl@4ZM!L}b7TEV?^y#7ZeSMo77w!aSsPl%bwQ8ba47>1Uzoe%LIo1_%NRWrJrGB8H_ z^0#H9>7a~_sJti)t-yGDdvZ2(w=D-}BCv+BD{Q0S z6WDe=MgUYUUf0F$aN{w4!|UP*fW=FXSbpwAY4$@JOgBd9kb@mZ+XW!zq#El>%B0ry z-d05OC=-gR4}45e)CwwPnfT~J%SYZ=#c(UK8Mf+2)fk_M?`}2ujg?@Y;4k+k7Z__( zGtrUUG^QZ;tJRKz8DH&B%*O88C*+t}VE9u-2h7euzP^{DV~yOhc9u(nr5pZPMXV)! z$8q7AG}VDv=N*w&Jo~`Yj4_WTBmcf9@nhu8N}tB}Zd&@i!EE+lr>Qi~hnCGMCOmau z!)0)*%D{mPB=eVIQKKgwQH{p;4<5WPdFnbG+t!V5;cSCD1#TQ~aDUwljP={PG5=o- z$i+uPyZp|D+q2)`6d~Ezx*yM=FwfLCawB092;|H0V=(sRe(wC?7Hfonk>+6GCr6{W z8M$q$Z_MW26FS5~3Yn!F$4A{~iCXT#CPZ{8hDay6DLuD4wmmn2yQ@QP&oM_1eI*!9 z#75%BvZG+b!Qe0o#=#zR@bUom9$R{Jp*sLkOst{-v2KOxMIZT1#KLq)6w4+V2GE#K z_To=t;$gp-C;D79wSiJD!Kn2GN3{5PWB9CF(7ri+JpYjC;~a}NHhuJ?55+WatKZnk zIStq26b}71j$1)3_zWz*V2kkv+e$OG6y$EXo>Qn)jM#YZ^;C!`)*fOLrwtn;i^Hd5 zkibOrWz&y$>M<#*5<>*1j~H#$P^WxS2+lz{Js6{h$K^!bfzu#?n1aU5o~%h^N1BS( z+pde7MB;OFa%YBe%elwEyQ$P8^@ni^L!X!zcnUDY6&jz&Spf>>yya9>GxjW91v9Wz z;t?7Q*hSc0)13?Zl>*=s3K)eE8Sgcq4}Km!INsW%-k^XivC}3MaN$8Jz`6d=re~)KQO_}DM)%n%%@I5>iwsUJQ>C0>ugR&i^h$pPneld zgc!-ie9X(X;=3A8EYm*3cp7!zFDF8NnxfNkC4m*TuCEyi ziB6k?;OMloA!~G6ruaQp{Eid9UqiLgX$QpbU&Zep@w;98c8cG7#qXWs_rJt%v-oWg zzZK&5*Qb!rM)7-__+2Z0YsGJ=_+27?^ThAj__epXRk8h6JvZ&O5WWCBLEo~)wd(UN z(P${~A6xY;&${~3QjjP*?farccj8yA9b4v~&Ha|p*^j0I!i%vn{}5uu6Q;drKhtP5 zj-x;WNG4zc;Rr8E-=CtloXpQ$K-Zkr#nz&D=(rC(GoBNOw0wZiK?Un?EYfd*?E7!x zAr9=0K%{n1KP0G&V$??3og(Bs72*{s)9Ew1c_ILN#mjKaARX!1#o|C08fAZm5U~nL z8RCt)-hBTmI7i(#$ikv@QTGY5812oXeCr6Z3KI68%qlRKj6zU2tp#A7 zLiXXb$LKy5?t%KjyXtxyzZX`C9=Zve=cOL?AtfwAv!hsoV!DbgxeaGQ0>kmi8co9> z_+K8%)17BT+Z=BrD4-k3(=gA59`#gA`fxJOnH@QxJO7xr>t>kI-}a~Yot7l=ZQZ$lK`7sG=+9V=gCv;G%?W!l{$A|DZc<72hnTy37X)`nf{6fg3xc~GOF@+gDi{a0bG!8KIOZcn zpF972K=4Fxqu=aL5*beL8_zsSaxvXL88K1Ezplr>oM1+3ZB)%M7UPTGsK5&i>{B_{ z7U$aI+6DHB`2B=Wpn#CWJO*Vzw~gf@$LqLBL?7~I*A=tHdSQ!Vu*Xr`4kpaLJj0 zm%W43KUANE;mp>@M%|M==+#(PZI10XpjuysYB@W43D`3K0R%x|g1~$fL63}1)?`=R z_b|L-uHi@DhRugZu;-N;y_kQ1pSEP zX!;FD9ih$9i-CufUby!mX_w^x za>e#tIJYYA$JSd*X*Yy_M|b|=bv+5^(u-50yD+_~Z*u7~-sUJ!3f=mmuk1IuQzM#) zeM3Xcdj}q_t8E=`f$<4G(l5R`_nPA8EEwPic76MiEkA+7g)Fv5wnnE_p1?9(i(l*) zmHX!LjYMNNo>uvs4|^x&J0C8_z#B;~NQ&g+IsfrS(KvtZ?uIewXOf=71DA&JzUUSZ zWaj7YX!vV(ME&OoIbRUtnc8)HO%Kn%Jxr_KWn#OSm4A{x105FH?Jn~cjw1+i8s3a8 z<_VwowDcxm?HiE|8eM@{7hxOik-{tRZ&>E02F3raDA(udN!{6zb#wWzTSDU=9g9j` zHTRNqEO;Ra^S2%ycwjoG*Pw=50_mFm*z8}ubH-1wZq#$PhU&2Uo{oNgD!fKMsw^LG z$E3oCZ#>PSJDD-zLXYKta|+_}J^Gej4}x8KHr(0yz%BYCY*GAQI{L}*WDn$`JM%Dw zcKo)QnQ%4nc@Mn5q8G)(ITeomQdi-r*?d?No_{)k+ZjnzO=7f1Z`qov=f2Z`nppm&-0!3d# zW8T>5qh=(N+3Ut_UPy-TKzVT9MuT_=Vfo-|02TXvLD84|5VD9-yZSzR5QfPyP{r@F z{Nc3Mg3!+%_%Xh`05`uf)wgXRzK!vJw*1`6AJAK2C913von&+icBQ%Fj*amm%7uvq zHg_Eqy^Ze|JKD@xp@s67k_#&RL!9(1m3s@AkRthLCO`BvTK4YjXUz#T#aQLTVbh;S z>MyM&;GzC>)5X_Fq#4ALzy_M2uf92q3*XjHx5?Kd!nZZkJw=AM(=F16Z)>GH*+$5DNa_T4YtIdpeO_eQ$!knSR;?Urtl*IFBWy>tsc6*ih;8;##a24x@k#vi^@@(Nbw(!$!;T~J~BwKi@3MbF6#G59v-VaE3 z69(+QeJY$Zd!-w5Q>|~DOsmta*?9ih#%Gh_!?btW-0jlc!L-|?+e>$+bnm6RTDmt< zhEnMkJii)rtd?q<3>q&tW1JvN$d>Gm@Gap@NFZXho!f+79+%LKpW) zcPGO)O1IGO?b2P(@Mc?h(B`g`ZXxp&xZ~=NeQel`j}>y=aXxhA>qMWdnMv2ZH%j``x%#3!7st`R$EWj;ckyun+y3d;=2mW7U z28Jp3Ia~yU)4U??B*bBOd;`;2M2Yo5I4vJMp@y73UGcT*6!kOk>>NC%2p(@ACHbGi zp|i~~O7eG!IDU5l{BMx_zv65^oaPWwzmZY(m_sAgCo<|wS>l|&7xqI#pcUnf&_jKN z(@quTAMlSB<+uD@j(qUph1EOgyBuf4`DtG*^Y;Y!Euw6m1J4pmB;A<$TZEZ+Lha^{ z->2^R0$rH3z+KeOCO}3kIXqx^2MC?W0M2!A^4jjWmM&V3$d*})OW1SE{Cf~PIKMRr zGf!uJ(_{HfwenkU%dY~2D!)sZ3$E>sbLkp3zh#IWoZqPkGar8w`8~`DqbT3+;1%VY zWXo?72vvRw%mvqW$A=YwVe`8Ov4itlgD}(2{4R*)H{Z%ne5q3DvjT)x`IrkXl#i}q z^V?H?Xnwy%nE58&E;nCQACbv2Uw~JXZw?w&to}e~)gPR^P=9m{n_mW`8CEY_?*34x;}eR z;_nsKDm+Eu+dVQ~ya@$ok@6=he14aVzg=OT!qtj@=S~^_xGKk+3cpe~@p&14y26VT z)+_wJ!q*k1zaZ(CDU2vQsPJ5s-&%#5l1HY}v|C=1u6Bi+6h5GEo5I}+Usq@<{7hk@ z(r3ED*$NjctW>yG;R6cqQ1x=J!id7>EWgs*n+p3CPEq-uqHwmtg$h?HyjEdQp;hig zrSI*0Jb~*rg%>HDsPL6%W&BSSUajyXh3|LE_uQ0Tcy#uq7U zR=8PVL}8D@teYi$hr-PYBMN&I_9`5ZM7qAZPNuKER^s4z`mO(Uod|aW?&c2Mt#IJ7 z;>N*^Aw>JE12^JacS(Njia(;n)&9N=&-x%fziR@ufrhGbEmV75ZQb>?oQF#2 zP*H+@XK=OigB1J(62D}y!F z@Mg`-@{~h|yhV8swwmP*`1*u9a}xR96dDAyEa4Q`Ms7HPqF6@?beCT?PCV z@D8pL)_nmi#WPD1#{5ciF@LsOSA)f{NRlZEQKvY_ek?z@JxV5q!H%pb zfj$pgibskc<6G4jXU3kgiVB!)u+9^#40tXHRh3`o@d+#UEQ8&wENjr1r>AP5A_n}j zAOn6?5lRY`e>K$fZ{)6N=Z6|$WTJKE*RHN=sH?3(`@(8hmakkkL(hl>lkLh=&)&jQ zRqLs#s|Zxn>aVYBxUR7tHjDnN7A>L*ZBMp``ntv{_8zJ|Kt*+)>blx%VmfZWNA`<7 z3nc!nN}{RouL|E(_=>_Fh0iJ6rtnFHoeCdNc)!A5E9_ACQ-yaZ+#i$g zc!nA`jSlNLkZaZ8|iobA0l7hI+_g-qaR_=|uZATQ1%ExK)rZl9tX_lKeBZbvxharXmLfnNhNV1dL8 zuSD2^<@n!>o?dD9gV`=wnz!@;&#a3cT-u)h%L{UL*SFNX#B$`FyW*liD2Q=;MNL^% z?TW^R@)e8f8UnFUUs1sdOyO7fDk=(UmzLGkR|gvHo)t?l^DJu&*u!SlSFBV5OaSs8 zd@=9X)vIYacZs!5ENHNU^hKbtu2P#@g!Ni6@?kxFUfkqszf$)}AKNS+>eJ`N?fGxI z1}^4jU7O!Uzj!a&&mdk_JdyMrHXc2{MR|~BuPw|@Z@Jl)vNl=10i?|x`1OE4>%9TD zUGBZZ$V7P}w)8nD19@5(+aT?}e~7$E!+7&objd677fqwAyzKdx{zisbzaHe-jCB2X zL-)|Za98DD2jsEyOCKx`@@0R`%TCvOj|{VZ>s7rDrmM7-fpOG}bx{W9hp}teD-kiN zgUU!^>cTTf28NTq+g65D54OA*ZO^NN zI=K&h+z@iw>6-rnTZKHBGaqtU?S&Ecdl zgI>r+{qeH%*)&Kli_UczI?B&^WHN5;FPg^og1P%4m%W@lC}%tB1#|a9uEBQcf}MIn zJ6!+Pj+UMtO$1SSOoo z{OtN-o9ucGQ zIJ;g-A&31MNhZ><9Ga~h^zveOr;V3gkJ`J?;oV}*BWUeER{xW#0$IOa+=Kg{9Hjr> ztrKQBoQ<=sux@$T^~LsMzlQ76v-S<$FK$LT>{n~=&~&|n=$Ix6H^<5%TmQ*$UX)e0 z*{OY8vdcesT=F2zaBZ1iL>8y)7J8+lfLz_dtJzSj)Pz~>5-U-PGTJl27ds7m%l-Y?{Mcb9}k)ZiFx>ax+=)H$iz)Y+2{9MkLWne0y0+z5A9jMm%;cQ2XHOFq=! zQFZtq0=NzEA*SK}3ioDJosQ}`pQYY6YD3Gy0Ty= zN-hI z(}4Df+l%)FhzV)QTH2h^TH5TCq6Alp=0dq#D3@#YxZV>TiJBug3WKwzoq>DY?=($> zElUypGK5WG7|PCgyWgHBL6mz8$~{_hE*V=dd8BHQRhq{Caa*By*!>BV9lE0If*$3_ z0=*yiMnxazr>vmq2x!`axGfsHfAUGG+DSMFFrgvsz}Vi=kx}(2rHipA+VpeTS8Rq( zXq%4%EnBsa^~;-f$*_6YhwuWes~c%@;PIAA9!~*z9RQO4YarAAxP4lbU3H z_Ht7G$zzkWu?t5PrJxO4WfFF*+MsMtDH{JT;$LuAM%Z@1IT#<7Fez1=RDpZhC~Xqb zPMYnipX^D|CI+3_#5v=&iQgYvR0N%|3<-$|S|ak3yc0F-FKc^oM>flLY4<10aA-3s z(D%(r(o*V?HZ@60U6|ZEkbaD&EyK8i`zxlOm#WSCELj_mKEbgp6>`SMC$K+Sl9)AN zYBKsr*|u5k16Exsea%#Q^a4wlNFCn?jwdda@uIK31v;IQq>WEV*Ak1+ zFM{_*(407DoHpmPN!sc7Ct03t$7t!nDd@M3(^BUgtM&SE_N5Sg+aE!fny97ja|?gP zMcBJz7}7J|?vG2O;YlxeYy1aX;H`nT2Hx5r-jlx`rF|VdQ=5=*n&yZkWm)p+D9nkj zWX<*2EaaV~WqCDirVlpwfRd+Trtm+R2URl+@-W`=Pe@PJ(xJ;SOH%5o%k*DJeH1BO zt^nfMiLld;fyhql2l7ht%J2zk80S_>8}zF5%_{xv!1fkN_j4fA-v{LNhzg&)AWfUu zdb)OMjA>Lv^RmIGl8%)?K9w5poZth3?Bzf1EvGV12a^37SIL%Jm3VN zuKYx%BcevNWeQ6b@_FA)HA=O}+3@C^8ifK0ancqXtC zm<0@~@Mhp__-_aD>EcG^Co&!JY~Ve>bAX!_KCZA^#qR;;BEAKs?VAHaU7G0&txNq>W#${MQ3%o4)|kHlG2~M!o>jHa$=%ZSw-)DB!n&w9Pgk z=kO8be_6#lpm@@s0%ZCNfaJFpNE^NzNE?0*h@M6JLivxKCF65}q;CY$wtos758MKD z0uLzv1XL*FX9G!pEzkx09&iHie&A8S7l5?gIjDFy@M0kS-vOdW(|)D=?*nQ3ljlg= zp9?$|{wm;czz2Y|`Nx%ii}Jq*WE&WFmZlvKJQqm+l|a(B1KB1X26}++DSrwKhVi*T zwvm;k12md`9B1*4Nb_=w9|kK zfb^FFN&gEV+tf3_(}Dj`{z-FX{1PBcNLvGhNoc=O{%#fj7LfT*Iajv5EFh{>^8ry+ z+O5jpuHt_VB>kg6RE@S12-RyJ0-+l1b0CVU&CQi<@d6UqG+pY)5w(A38DAq0l76NYpUIhFx@M7SD%Kwy#e+^iK z@Q;C)04G97`cD8d{i#68F$ai0Z2^8*&c#6LcRBDlU@34C@H!yd$!Z|mc{7mh{x%@5 zJAfR!>|ie=g| zaloVCO;?x!bi<#e;^!&UfjGw?%F+(xbsvyr*#}Gljz=fPGAstN3_l0541WNQ0=};N zCr*=PnFHi_)2{pxAnEr49l#%*BFo7ChRrf2pb@Zac|ew}709yP4P@D#1hQ!{}(Er-{E2U3?TWOpo@b@bJBy`54 zKORVVP6blF93bWOtMC;nyiSGR3}m_5fMbB|Dtwm;e@%tI3#48S0+WFb*f{k*3CQbY zps>w(W3?HHAg_%cX&)~E$twyZuVYS>yru)m>m1-H;8NvpQSr|K z$@?wfXyDwFq`wMCS=Ir`?}tG0zX!2aDQ~49GBz#VoxPm^B_Lk zMib{(G@IAqG(B#MPn=)TcoDzUMib{(G(F9l_AYLVPn=)Tlp?;-Mib{(GzZWZCD~}~ z{s~i4w5b(iu+B=2t+O_v-l-RF6KrgXbZ-Xo66@UWCuRw3;ClDa^gT%LLW3cXEH)gb z6Z>y650MsojtP^;Xp@7ZwaHlDPsaLwGS>H#XS;hzU;G#TN*+YEpHttqGt1{!M1 zs=ehn4&*JXXuQtrz1&w^l<&*)UV*W7!Gc-&JWH?R<$&rygPm-7zR&07fAdZRRn~A+ zmsnKG5*ElKz$Fc3*LyF;IqkZJ>^wWeMLuME>8#n=-it1}2)P%GX_#GfmV+wEz6aV zxBx{7G_1mz=Yk5aI^>PB`Z%B!R}o90kcD{=^rs1NDXe4f;spWwk$AhjvBcVe_|)be6K^n7)r!N}L+80BKBdZPXxeuZ7t~in7nOC@cq_neNVCrJ+P(JV z`LL^E*5O}=Pd(@GssA#3>g>a(?j1h$?8B#iXZX~!4xjq%;ZtWFKJ`b#rk;D)#QTR$ zn{(K-9}b)LoWrK=8#e9PhfQk^oA&S~_Q9}e4{u=a51aPz=JnpNX%BB)`-V+>c++}o z*tCZ?theLay?E)!-fRbYrD8Gkun(M-HM63+8oNR9X%BgM$-7FthN4EP0Z!kKPq%PM zpq{Tl4MQ&9WjQqWml7A0Tvmnm>hLOENljV3w=r13v5;M`j$Zpo#4labIBfg_2@6UV z`tmM5|9qJ;yJYb~O?wroidU9Zl!#H+;>nKd4aU@kf+cmUFmm9nwOFJzzPwI~>Ok!^ z!O9Ym?I9E^91B9V7*=Jb=J~BPUW^i}Ic5(E(WHshwct^8-R;(l#@o6t3D}sE) zSbTTVf>qU_#>!aoBeoKsnE7!!`P)IV%>HJ~VzNY&7c>Tfc;7S_h;e{gMlK1}S*(|E zmUhD+eU6;aQstcF1yyKW16dxSDHJkeU;e^NIXABkcxMZHJQr56=9}9Undwla_IIHJ zHg?M}zJWM$GR}6S`hf2^7Bu}YbtaU@)|sp)AI#Igai?VQQ373#-Vbk(UjM&RII719 z?N-)ZkN2L}eB*W}MWK#gK>o62FC>MC&X{~PJQW4F{JtYFJt3zuHHsA!fo z0$)c?g9Z|dawg)k2E|#6yEBH1qeW-QzV&|`HG!I%y43;gi=>kJ5MI>9kf=2xWwu&z z7NgaD3;x++)b$mYT*y9|5-y2Jcz#j|Rju8ZToMvW*HRKo$f>Tpq`V=h{XC(h1d|E8 zA>C9J)Jox7RMJ=9PO7WXAJfna4_g*O)M^@@%TscvFEc(te2mbSL6 zCeRp5tZCka{MvH7tt(dG&`^3pUcm0ZHL0L6Pn8#vHuBYA17WHxbq(j^g??EI5w{@u zl2D*wO%YbWbq#2J<@gjph@xtzC0-B+E($d?fQ3q3P@&DVg)Xbaa8!Xn?SB}G2^rps zURG5T@HL|T0(5B?<}bM@-=95O&MFrtlq_m$Lb|%^2h^^uLb(xqegn#?_BQY!wVyUx zUQ>@J>%vvP=FlC<#)XS6XXuny{XsC4JQyPmZ#dlT)Cm4#Ji)QrEBa~+7 zd}4Y(+?;(FIY%^9p~aE&mG(NqLU}l29Y&r78LZirUfouaL+Q(|-@}z*sPuA!VkoN_ zy1XS9$d3t)SV2diuOnLODLxhqCBIegM>vtSSPh9h6EM>C|CaciJJoj=6mI;f^oKT% zRJ#Af{okztj|=D8a92j~+#C2~-1Gj3GeW@GIIyw;;rK>}_H*0}$9F!oi4$eG2UyB` zv&8ShO`3M#)5_fgOvFJOhP!}%&(V2=z$H&-41+OxqE<#M=KeCKfyf*<>~G#o3#updVlmH))!I4=6VerY^wEa4)byxtoDcDR%@o_5?}e0$#4%rNHki zcLy-Rqsj&R_#~9$3EaR*Crg{*xvw&uEn4=NJa?ChGk9#C^Cmq$M7E31noxz-rvI|9arBlzTI9k8<|{6PDo2(jQS5z^ic!n+JN9;>;Pt zfjzhxPW%UM>fio83EwOE9Cs?hi6xh!OmO4dNaDSfkC4{>z6#%Cx#M!Y8-#G;f8%}= z?#;lYDlgCFy&Ck6(>6ps~M)!}oDUm4F7} z#4~U=lMnDE+~m*qh4z)g=KcVk0&gzE*+jVc-qieZ-*?>R9O*!rF zq4E8+&vAEyhIrB{lnZYA`)qvA?M~eHAe?wF?oPPv@5u4px%Y7g5l;L9cPrfXckk@) z<&{<9%xo3%0S)nD+<9;lufn|yZZFOjmEbmU9t_`1)E>o69X<}Mz7Fk<;lLK$Jfns0 zA8KFXW*PCVMeT}eNxuU4n_Ad8!Z!im!%Z3!cziu%fZGGC!d(ge)xi1R!cjVe7Xu%} zy&mpPU}6K_-GRFl_&eNh!rcqJy%A-F%*1WDSx3aLl$-Ah)!?R_^}v^KGcTT{Ee|0K zZoc!$_ciYaPa@ydq?^e1F6k!nol3fi=d6})zC+3P?ikK@;rRaGGT4K7r|){Sm)}D^ zAm4uyJb`@oY#!t!&S}DU05{K^t-?(jd_PkQ;}*IFKB3(Bj;8jpa^qW?+SHpQjR#n$ z-1w%ZcB67P1AnL7Jg1v+Gx{;~Q9R%LOWfL{uwh_Qv*bgZg}dh|iA&+$2eeNC#-`VBAl3w`%bv+XZ?5va2@UngcI+^-2}J&%plJaeuCSJ zaN<$7K(}z)&mQtjVj1o!2q(7S&Vt*1hLL9*U&P)2q{M%~Jq|Ql3*INdO_{TRmnt{U zWQTEAKtFs>Y6tE;4}ktZ*Z&VRkRZ-nrlU)bFD%}%L_pRM;iHq~`w*pCf_7s)HT+v3Z7A3S95MzW6jLfv!;8n zFI9##p31TJCG0*#7^kookPWYJ2;$X9go0C6xvlF76l zYnYbyzw5=?+Sg0nmmY$@V%rOdX>qs+IA!Hwf4b2GSk++r@9Th6WI)^LT~W^N0&liSUG z$?fODObR?%o(hk|)8zpkg=foi;(73Vd4are9)lOhOXg+p@_5BOHm{sl$*bWBdCj~Q zUMH`c*U$UJ!|(}wS-uLN#Mk8mK80_~cj9~Seffd>a6W?{$4}pmAt2nt|q_#b`NNiPoS( zv>9zdJJD|RCEAaELNNk@Kvtk4APIB@KtK`L3Y-KU0$)L(AY8x@VAx;(!xj$Dm~QCX z@PuL8vNPDtY)q+dX>zHslyDpz4?kXfyyZBCLxHxe_5kUEbvdT07DLr0*l3fRJmYrN&PgZwBgx^1eTpD=MAeou?Rwz0+Qll21FcIRSW}G ziO(_+hks5_wZtNLwhgcb$}?(YfFusVu<^&S$rzwHqa9x1Y_MtN)u@kmY0ROR68i-@ zMLRfS>{MbUNX3_dR9rS2hefbh*`(akL`kqrTUb)Q^i@tl4wyYXDnttQpR#9SJUDN> zxIEU|i>wajiNnGyc?GX{i2tmRAeh}anh_a2@g6N%1E`BGOUWxuUtTNP3P`I%SfVVx zWD8&>62QqDP7B!6A%v35NM25MrWT8#y5JC!7cC6FE)zzww<8&mR+@tO%Ck)YnM}3> z6Neux!V;NcYGz?&VdV$5e?LljASddDAU(?-W($VT5F=<*@?@oi^eiuG1ZfR5lo~=O zD+9%e`A8G(Vpyh45T6pW||BU!{Aa88F+h< zS=dwr!Ej9UX|0+~@dp($>G#cJG=9Ux{i)gKC`XZ8;TtXHD6y z-0Okvp~~*7ky-U%za7dcaJz{9@*ZUV#0aS}w9CGbi^aVJa#ootujU@}vEKZ=$DoO0 z*XWQQ#}3xcA8(gQ?|8m}T`Z%v)3EH(Y=O_!?QfmH5X(^BmzeS3?c=6oy?cr6^@Z&@C2HYi#Un1@3p}1zFYRbIZ zl(Iwm@mT1e2qzU$gBDSN4vO7csvd(kqqQTWo^93>;&lXVqy|F z99Sl*B;hGwF)$Yw4@;4TD*@;O-6;_)qNEniVlkLYOiZ?K-)vM6-+`O);_e z@B$hl1zLC&pp>l8CKO-b+-K$b=s?eg(wddAlF>L{U?39Ez%K*~0Es=Ht(K-L(g)Q= zZ#HJeZwuNyp$Zm)qUpeAs$T@by8>sZeR8M(Nt6G+U9hMfSTrqw{T~#wW_l1@bkKtk z%wngE)B5(zy2#~OnX?D4Ut6KIp?=4!4_mIUJ2#)4z18^)ee7(c;#=3?n(M+O%=ZcBDleeHf;EE-$M$k|QtkW#q9?ZBy;AXQG-(!V{^QQT@Zd3D#oLj!rS- z9Wr}yK1q6R-2C5K!(kUHGWF#^gJa93H6_iPhnmkWe-*C zZBt=@qg2z3|bGaL2M^zr}CEhYQ}X7wTA-Yk0YVuJ(ZkTdN$# z|9A#*suto@=_F3ssx}2{{w%MFBi22gqk2XCFD3&i7rsY;sdX(+gzS_if|JR0{SBd} zE|9)Qs3m{`eF8!lSvN?JWC{RHZ2EH*7O-q1@*<+X?FylTwo(vsT z)D|aiGS!6S9YKqQ{Fq9Ix#}ZXBzx$cqBl(@;F1I}N2G%lF9J9~0p$kw%{Eoch-3iZq=Tfq-e0&zXxB7V0 z*qaNrUANsZ)y+oC6W3@_g&J1YXB;FBza);jxio1$)}!t-T|iB}lCBYvy(2)0@#8@WSnZ-RZ>lu_)-IZ?G@bSa&@}6gn>6?EH zz_>oX^5|)dgQ?w;`B4$Hn^G~3gu6HH85FkM8LPG38l3Ip_E}yoe$SgtYd@MFBOrsa z+TzMCT?6U~p<9asL(A^JyJws_(Em>IwZnDAEj_phvsUz&H|E+$!j^*CfQQ{?1A78T z{B`82KP$bjTel@yJLfA-rknvO6+lLWN%A6S6azST`W`D0ajxB7s-f_pDVl4b92jdihTBmNq99!^FA9KwC*`61C`& zVUfnrPiaiJQYIiTmN`);(j?l_)roi|NGi6E(wtTv^P1Cs>9vGuti;_SiMfASi4)-E z^6670?zv%D;?sidLAN4SjU*9gKWwhGsAaeZjV>Ie@6KL%jvwRFxj-*sK>2?(qonZ8#>J1Wd{p}AP zJV?!ygajE(*ZIss?l^d40Z&|ia7)lS~y}DnfG?a3;P=T0qyU_gp zy?qR3O5)+27mBH!E7FVeuJomWs}_y@RK?|6;QL58y>M2bQMaz{^xr{03hC3=;Y8 zFsP%@zU|@Tu+vs!Ys$_pBI6ma&gJ^+pSPr06z;1Nf){C>%(};YcVm}juFLH+a_#p~ zSzVQL!mL#)Myq{Gyv`#|>o74ro@)xPoxs>RE}W4J`o3u8s<#`#$L>naz`7HTd70^W;HxQ*uFc-NzLr zM=xqijd9eDcAk`EMExOLxoTh1<=^N2YV#H!ovYkB-hW2SbndFwO0{EOPQ;OxGwdoC zWk+I~mtf@V66`8ZW#;4A2jhmeR}Tj2Kc{=(&nX0s&-NTD&)V}vvuneqqz`)W?v)O# z$ZgT%Q(P?$ay1q(o(35N56KajKUIcgXU-&SFef8np;O9HJIX6b3>?btHTM z*a-Z^r2^BOkhD)L5D8@*SOv7E^g$A*EYc?;altc4R}g~C zaVEeB7_jx&I%(S94e%?8i<#PqjiTXBJVEIGmUMo{Od;Cpi6$W@vO(E=phi{&DzF0X z@p4lUjEAeU5!uKR`usPf{9Cd)la2mwp>$W@jZ?3)Vwd;X@;Py3)3?btebaG5PIjgHGw)H=E4E zNt>!~j)=WET*2_tseNg))00h$%6jPeCV7dr=`n|j2z%XD&6v8P&aABLFI>DMe($j2 zVOP1FCPU>f?Gd|5de-e9_~~bX(a6x_t{)HndWPa49A24tL%ViVKiuq)NA&OI$J%Zi zN||5C0&%w8Ik`IX@*-6m2#P5i`%HQ~UwF>H9;f$Wen=zb9pZvWE+i^7Da2p2vovp6 zn!l#t$dmAQg#I4d;joB2Db)i}ZHus%g??J(RO}BR6$`^(1f(4Nhs2|Q6E}a0+1YW> zL%v1r(&Slyz=i>OsVGRFI~`t2;>gl7#PC3EMoEfH1T(KH!sRmcYk?%547cK@EA(+J zr~W``k+;LE%A|xP61z6d+*e>Eicdu_fiagqto`NvE&airCr|2koo{bTqn?m`bkwP< zXvx#7sMGZOmK=!4_h71I9kwFf(y3Y)ELTURfx4~oeYuQRS*W{Xyj`7&}#lFl65b?)c_ zABN2l4?jQeM@|aFZ5`%26awo>PYeV^>IGNx`lvio%h|VS;WV;U;s>%q#Cowuvd%-D g`7$;)3hkTJOWto|XY}72w>nVU`}T)?!EVBT0Z&&vM*si- literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.dylib b/usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.dylib new file mode 100644 index 0000000000000000000000000000000000000000..fd182581af2df416875674d45cc28d64f9576b76 GIT binary patch literal 85916 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

SlF`-qBNO|r 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 Ta0!IqaL8c*y8umVadq`CYt%IV literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.manifest b/usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.manifest new file mode 100644 index 0000000..740877d --- /dev/null +++ b/usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.manifest @@ -0,0 +1,14 @@ +{ + "autodeskProduct": "Fusion360", + "type": "addin", + "author": "Autodesk Inc.", + "description": { + "": "This is sample addin." + }, + "supportedOS": "windows|mac", + "id": "48f0023c-5c4f-4c64-9030-5d644cd9ee2a", + "version": "", + "runOnStartup": false, + "sourcewindows": "AddInSample.vcxproj", + "sourcemac": "AddInSample.xcodeproj" +} \ No newline at end of file diff --git a/usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.vcxproj b/usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.vcxproj new file mode 100644 index 0000000..cc0d5ef --- /dev/null +++ b/usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.vcxproj @@ -0,0 +1,107 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {D7CBB035-8CC0-4576-9C72-5076E079586B} + Win32Proj + AddInSample + + + + DynamicLibrary + true + v110 + Unicode + + + DynamicLibrary + false + v110 + true + Unicode + + + + + + + + + + + + + false + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + false + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;SIMPLE_EXPORTS;%(PreprocessorDefinitions) + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/include + + + Windows + true + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/lib + core.lib;fusion.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /R /Y "$(SolutionDir)$(Configuration)\$(ProjectName).dll" "$(SolutionDir)" + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;SIMPLE_EXPORTS;%(PreprocessorDefinitions) + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/include + + + Windows + true + true + true + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/lib + core.lib;fusion.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /R /Y "$(SolutionDir)$(Configuration)\$(ProjectName).dll" "$(SolutionDir)" + + + + + NotUsing + NotUsing + + + + + true + true + + + + + + diff --git a/usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.xcodeproj/project.pbxproj b/usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.xcodeproj/project.pbxproj new file mode 100644 index 0000000..38551c7 --- /dev/null +++ b/usr/autodesk/CPP/AddInSamples/AddInSample/AddInSample.xcodeproj/project.pbxproj @@ -0,0 +1,267 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 2BB196C61AD5940800164CD3 /* AddInSample.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2BB196C51AD5940800164CD3 /* AddInSample.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 2BB196BE1AD586AA00164CD3 /* AddInSample.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = AddInSample.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; + 2BB196C51AD5940800164CD3 /* AddInSample.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AddInSample.cpp; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2BB196BB1AD586AA00164CD3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2BB196B51AD586AA00164CD3 = { + isa = PBXGroup; + children = ( + 2BB196C51AD5940800164CD3 /* AddInSample.cpp */, + 2BB196BF1AD586AA00164CD3 /* Products */, + ); + sourceTree = ""; + }; + 2BB196BF1AD586AA00164CD3 /* Products */ = { + isa = PBXGroup; + children = ( + 2BB196BE1AD586AA00164CD3 /* AddInSample.dylib */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 2BB196BC1AD586AA00164CD3 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 2BB196BD1AD586AA00164CD3 /* AddInSample */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2BB196C21AD586AA00164CD3 /* Build configuration list for PBXNativeTarget "AddInSample" */; + buildPhases = ( + 2BB196BA1AD586AA00164CD3 /* Sources */, + 2BB196BB1AD586AA00164CD3 /* Frameworks */, + 2BB196BC1AD586AA00164CD3 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AddInSample; + productName = AddInSample; + productReference = 2BB196BE1AD586AA00164CD3 /* AddInSample.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 2BB196B61AD586AA00164CD3 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0500; + ORGANIZATIONNAME = Autodesk; + }; + buildConfigurationList = 2BB196B91AD586AA00164CD3 /* Build configuration list for PBXProject "AddInSample" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 2BB196B51AD586AA00164CD3; + productRefGroup = 2BB196BF1AD586AA00164CD3 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 2BB196BD1AD586AA00164CD3 /* AddInSample */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 2BB196BA1AD586AA00164CD3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2BB196C61AD5940800164CD3 /* AddInSample.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 2BB196C01AD586AA00164CD3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/include", + ); + LIBRARY_SEARCH_PATHS = "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib"; + MACOSX_DEPLOYMENT_TARGET = 11.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 2BB196C11AD586AA00164CD3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/include", + ); + LIBRARY_SEARCH_PATHS = "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib"; + MACOSX_DEPLOYMENT_TARGET = 11.0; + SDKROOT = macosx; + }; + name = Release; + }; + 2BB196C31AD586AA00164CD3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(EFFECTIVE_PLATFORM_NAME)"; + EXECUTABLE_EXTENSION = dylib; + EXECUTABLE_PREFIX = ""; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(PYTHONINC)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); + INSTALL_PATH = "$(SRCROOT)"; + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = ""; + OTHER_LDFLAGS = ( + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/core.dylib", + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/fusion.dylib", + ); + PRELINK_LIBS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SYMROOT = "$(SRCROOT)"; + }; + name = Debug; + }; + 2BB196C41AD586AA00164CD3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(EFFECTIVE_PLATFORM_NAME)"; + EXECUTABLE_EXTENSION = dylib; + EXECUTABLE_PREFIX = ""; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(PYTHONINC)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); + INSTALL_PATH = "$(SRCROOT)"; + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = ""; + OTHER_LDFLAGS = ( + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/core.dylib", + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/fusion.dylib", + ); + PRELINK_LIBS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SYMROOT = "$(SRCROOT)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2BB196B91AD586AA00164CD3 /* Build configuration list for PBXProject "AddInSample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BB196C01AD586AA00164CD3 /* Debug */, + 2BB196C11AD586AA00164CD3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2BB196C21AD586AA00164CD3 /* Build configuration list for PBXNativeTarget "AddInSample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BB196C31AD586AA00164CD3 /* Debug */, + 2BB196C41AD586AA00164CD3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 2BB196B61AD586AA00164CD3 /* Project object */; +} diff --git a/usr/autodesk/CPP/AddInSamples/AddInSample/help.html b/usr/autodesk/CPP/AddInSamples/AddInSample/help.html new file mode 100644 index 0000000..78dc63d --- /dev/null +++ b/usr/autodesk/CPP/AddInSamples/AddInSample/help.html @@ -0,0 +1,6 @@ + + + +This is help file of this addin. + + \ No newline at end of file diff --git a/usr/autodesk/CPP/AddInSamples/AddInSample/resources/16x16-dark.png b/usr/autodesk/CPP/AddInSamples/AddInSample/resources/16x16-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f975a3a28a91ba2b5a0cfb03f0b1b09586e22e96 GIT binary patch literal 726 zcmV;{0xA88P)~8}fs zA=-9xe|`Aa^(wD=((7@#w1te8(Z#co-tO+i=9gk^o`?n`wbedC z8G(X9{qINPw>iDsl+}{g7H1|jA;cO$MkT1Crr}7SX{liv~3P@@jgw@rx)-)FY@02u!S>0 zaDocHPFxZy_oj}b( zJU0I6!px8F!}hZN1z=~(scKn>$g*r2Mvikfi#B}NU=%z523;Nr)AV|I>i_@%07*qo IM6N<$f_BqFqyPW_ literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/AddInSamples/AddInSample/resources/16x16-disabled.png b/usr/autodesk/CPP/AddInSamples/AddInSample/resources/16x16-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..1deb30985d681b1231445571f808a51ae9d728c9 GIT binary patch literal 726 zcmV;{0xA88P)~8}fs zA=-9xe|`Aa^(wD=((7@#w1te8(Z#co-tO+i=9gk^o`?n`wbedC z8G(X9{qINPw>iDsl+}{g7H1|jA;cO$MkT1Crr}7SX{liv~3P@@jgw@rx)-)FY@02u!S>0 zaDocHPFxZy_oj}b( zJU0I6!px8F!}hZN1z=~(scKn>$g*r2Mvikfi#B}NU=%z523;Nr)AV|I>i_@%07*qo IM6N<$f-_J;>i_@% literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/AddInSamples/AddInSample/resources/16x16.png b/usr/autodesk/CPP/AddInSamples/AddInSample/resources/16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..7bf7e0f4aa1ebf28fbdd53ff3d135fe130f1f324 GIT binary patch literal 708 zcmV;#0z3VQP)V$cyl~;ncklVlcfJ{b|6EMFpp_!B z;P)w`b2HA%e3y9D(yR1U%JphBTY9}5DF^Q@W|k2qe*m~vVU}6AHf-%rO@@ck%Y{_!)r{%z*WEV9*EX zA9k4RF3Sap|Hx?w&%XOsO}F~kHj049>agB&AN30iKLnWg0OK)0^}YFAM+RYH$~)67 zlCzx-*p3X$78^exnQHXSI#o0P90!6m`iw!41?crSfajPI!x0ED1QE3c`l^i85@3pE z&>B5K6wWr|ZsdnCsTu-wObV%FX{nm|F)f;QKv$^?R@^g5n{`!#R4i90)$nJ-5o#Kw zA1@}JBtFGdPV54PRe%tt+05}glu~(kz7TmCN$GD4KO?oLuW!}kTd{oowqp-0Og|(H<%>0Ywjp&XR zZpQV`Uz1uM9Xk;Whrf`G$SMiVKO&c|T>nmW+2}sMUm%oUM?e&_6-*L6oGx1n6jL9S2%x7%f-vOu?b5CBswq!;c#cz9kzq(>A*_?b(F8u=KG{1=T# qvNC0{*gObndM=xO_B(KW|K(rfef3)D`jT$|0000XKAc$sZMWU7CjOJj=FFM-zTfxlHc0Sxz*~!!Ed6B1dmk;YZ`@I3 zIdS2K3SVio(g-22r9cH){o|?c?=>CR*FD&G^&8-L9->qL32aw1K3ht`%ZukQXO;uN+)9Vq>RC9p01bYi$OVd=ugLm}`Zsr0t*dWn0Jcu$ zXDWagu=bS=TN3fIa zKcl4(D5dcNg%@Z-Q+Rm^jB{yrML(lEFSKQVZewf403LAu;@OtYGbav?#cY9XB9k(T z_@Q$VrQMPO#}dSB$(a)e$1a|2=>*OjTO|S908Td@*f)6VdcPmDCAKAyLLh`NX^&Db zWdskoji~=`-WJh~z=7!tj$DQcZE3=~(cO>zcB<23$ceJ-=fTWo- zI#u+=0OTRYfOfYp>7|ASf{K_$McKF(vq%jM1a4o_1KQ1;DV@Xg8&O_4;ELPZ(?5JO zwW7?4QXYhnecO@<0mC;_f!o{D4_q;Grd6>30Z}m>{qC#Jp7-utOH4Ls@7}$4iT?Zh zX3q4|T2I<0Q8`ctxUTE!WHPC>*80eiBl_gYle)LJR|BpYQ(ml}Vrn3-9FHui0+9Ko zTU7d?xFUSi_=L1-t;gS>1BxiVQUD4{n4Pf{l?*WcFDMnD*j12M2sGE!)V$5ao2~|$ znd0c3OvQc~<&^+xfER$>z(UhM2z*U+_PfBy_=$!5%rpaO<6smx1vHrc(?sX~Z8N55 z%`^jfl@nbypEl38fE17^G~wTVoQ{_S%7D0e&JwNtg3GUvpML=JAW}?fsU%DQ0000< KMNUMnLSTYpY+_RY literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/AddInSamples/AddInSample/resources/32x32-disabled.png b/usr/autodesk/CPP/AddInSamples/AddInSample/resources/32x32-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..992c4d7d7ddc8840671856f3ebfc74c3f429c8ce GIT binary patch literal 1300 zcmV+v1?&2WP)XKAc$sZMWU7CjOJj=FFM-zTfxlHc0Sxz*~!!Ed6B1dmk;YZ`@I3 zIdS2K3SVio(g-22r9cH){o|?c?=>CR*FD&G^&8-L9->qL32aw1K3ht`%ZukQXO;uN+)9Vq>RC9p01bYi$OVd=ugLm}`Zsr0t*dWn0Jcu$ zXDWagu=bS=TN3fIa zKcl4(D5dcNg%@Z-Q+Rm^jB{yrML(lEFSKQVZewf403LAu;@OtYGbav?#cY9XB9k(T z_@Q$VrQMPO#}dSB$(a)e$1a|2=>*OjTO|S908Td@*f)6VdcPmDCAKAyLLh`NX^&Db zWdskoji~=`-WJh~z=7!tj$DQcZE3=~(cO>zcB<23$ceJ-=fTWo- zI#u+=0OTRYfOfYp>7|ASf{K_$McKF(vq%jM1a4o_1KQ1;DV@Xg8&O_4;ELPZ(?5JO zwW7?4QXYhnecO@<0mC;_f!o{D4_q;Grd6>30Z}m>{qC#Jp7-utOH4Ls@7}$4iT?Zh zX3q4|T2I<0Q8`ctxUTE!WHPC>*80eiBl_gYle)LJR|BpYQ(ml}Vrn3-9FHui0+9Ko zTU7d?xFUSi_=L1-t;gS>1BxiVQUD4{n4Pf{l?*WcFDMnD*j12M2sGE!)V$5ao2~|$ znd0c3OvQc~<&^+xfER$>z(UhM2z*U+_PfBy_=$!5%rpaO<6smx1vHrc(?sX~Z8N55 z%`^jfl@nbypEl38fE17^G~wTVoQ{_S%7D0e&JwNtg3GUvpML=JAW}?fsU%DQ0000< KMNUMnLSTYpY+_RY literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/AddInSamples/AddInSample/resources/32x32.png b/usr/autodesk/CPP/AddInSamples/AddInSample/resources/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..d72912d3959895abc26e8a0a63ccd10db73cedbd GIT binary patch literal 1234 zcmV;@1TFiCP)!_4cKooc#cnN3(7MsUIKp$`k_zg&l&zY%GemdSGSipKZvKw>)uNU!dm;!dGF0s~CdXkG$x zz_l}-JsI21i6-~VD$l+$n?Ag zN-^`@qRc%@`=}5HkHqY@j_!*wEgn&UwbkO7St+K2nd)N2hq(G0u|9A7H~X>zrfr!XU<2KK@nklh zxaXj%Kvjbk(Wa_FRS{1NJALtF7U%|S5%CJP_jzX^k4fN4@AdxML-$4;R2Z!2OjBWo z?u|IT*ZXe+SIn3>;rC4Fpcm7LFTUKnBt9@+WM_f{2M#}{i9|wxr16RP<@Q?w&?$Y?QYGq|Z(U#M2mfmzPd+QHB2svQ zc9>)3S1O<+lv0Hve4}Ckg(av|fbTCO0~hG1udi=m_DNTO4$5r3#ZdCYWQNn!>}r5| zpaJ+CSZeOy0rsNz{v?osG9M$;Fy9QMO@MKr9cVW9W9WVVU*qE&^UXjW5%gj6adSNa w{0(HLJNe?SP=Ezg0oCSu0^R#F+RqR7e;3hUp*t<8 literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/AddInSamples/SpurGear/Resources/GearEnglish.png b/usr/autodesk/CPP/AddInSamples/SpurGear/Resources/GearEnglish.png new file mode 100644 index 0000000000000000000000000000000000000000..b7190fd0d5823227f59bb1657e6d73f3f9a4e87e GIT binary patch literal 11340 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 Ctf2V- literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/AddInSamples/SpurGear/Resources/SpurGear/16x16.png b/usr/autodesk/CPP/AddInSamples/SpurGear/Resources/SpurGear/16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..c12e3740fc021ce6302a3e4ae582b6ce216d48d1 GIT binary patch literal 965 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAP>{XE z)7O>#9vhFinsnikq+4Ji*N76w(vpn)B8HXg&UgTYcuIgmE~&-IMVSR9nfZAP!kmiA zKyfaRxO09%Wl?5&MhU|j{xeoUQ9iI}QEDPcsX|F+ZYqQ6cYaQw3@1n?I6tkVJh3R1 zA-3Q@NI5sy@XX@moJ63~B8Ke;w)6vqIY7eUiA8ytdFc!Xq@T3|#n>VGON)|I8NU8+ zehpLRoS&PUnpeW`?aZ|OKruFuvXIP@oK%Jt?=Gn`FfdKk*tNas2=D zH*a!`FPc3!yKd)mS43o&=gEErj-{oG8y8;co$eSHmDwsO%3Au+RXi}fcGZu@M!`!< zF7${jT_UZowTiWP+uXS)%l2*CynS`&?Jdt=wSNEq@818<&nq>YIKFAS26{zI>wTlm zaNy0y6%~nv3(NnWer~5IXZ$^WSJdanzqc>G_eyGi*y^dpUqg;D9xr@X`G5Aml_yWe zwI7c25EM<+w&+<;*-t})wmS2B8_Y~`enTOxJS^clGv(s+YGH&PSM3=`#5w(gj zPxbyDyI$%sN#o?E7$=U4PZ%$~+;T2W`*Eua)1nCn%6i-@v|A3WpI`BQe*3JTjb9Q! zzI$-s>Dj4MpPt*pBWGV_VPyXOmyPH0g^496Y8D#tM9k%rIiFnlGdVU&b+%l8y6Jhx z>f=Ad{*kR)uYS92-kz2*>s-^4 z5K-1Du>~0!TXnp0&90c6^p?(j`|4)lgL>=ohrcd7@X0&Ga3I5E!c-9pJ+AVp;<~!( z$D;hV@uj>oJ$(4E!Stv)X&zPq)r&_y2NvtKEYgtZb@S-7sIco=w(Rj`wr0gmj~A?1 zp>gGI@w-KL-`%)zx>e<5fC#JDYTmT&weOz3=-#+SfKfrH^NOC{p4S4dnp>;)a4H5& zQDJdBaxI?k_Qo6P_ci0=&ftCrd@xCUm`)*jxWz|pg6nF5E9OJLK*6ekOjmeX%rJ{NqI@852wougGQ&8avm z-GBZat7|u2?5}@+u6Wk6+_3DM%deT;_b4v@tl}E@s-AJTwg88WVvB*^^z2;wv-Zc| W%dc0j@u&i(Rt8U3KbLh*2~7av0i9C- literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/AddInSamples/SpurGear/Resources/SpurGear/16x16@2x.png b/usr/autodesk/CPP/AddInSamples/SpurGear/Resources/SpurGear/16x16@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..efa3cd1ff5f13540169175a2e922a5c291c87ef4 GIT binary patch literal 2058 zcmXxldpy(o9|!R7*k;p+xfPPj4y!X!E@_8^7W1Q)gj^28*mhioVJc;j&U9g_<>Wer z=8{}Oa!WMY;z%PAm5>}pLhHnS)9>;7E!5GfOlW$A|nJ{Mu$mpA+Z!1oe~`dsKE`4WUjdBPSLcaSV}mV4peRxVr8oQQ)5ZQ z&8R+|5=jEA*0#cB6Zq!jM06NEkr+z?0%+3B_?Dl`DRChYL|HTzXzZxZlre0Ry@|0= zl&El^LudMu%oP52KRz~u1guC?=l&maijIsVMbUv(A*Wqt(9M`9g&siy?k&7Dk%0(* z*um51VmBu_LTzn3zdiBbXyVNBfBt!mAIq^x3*7|{c7=tOxWCLk#5EfMkN7^c%wP40 zl!m_C_*~C+b<*)`G`QOEvYrwpMU&^iE`rj%u6L|-VD-UfmN_=y8BxsQoMftRRT6cc z?tr@b9-FoLBOd!UZlYhDR4}n@n^uhec3xZ3j(rwfa}=K~T-$OexgZnba8E~1Pp^r# zRG3<<@7w(N@eyU+PvW+nfTO#jA=_n!r6yJy%W2*l)ac#mMLd#zEa+SUw0g%z%&n0K zcrs%nmFW`tWZ8d$=};lUt{(!P@$Hi&jqQ?^BJp#6!D{}Fd%Rksr+hZPjDXfWE(fpT zD4F6k$H4gFnn#e)MzPJ%^2Y^nImE{T65hYDvREjkQwhQnQgK;f+=YDN^l+unSy~4eU+)c1^fWM=rY&`n zDl4kw3i~>Ot+}Po;2aWHlofOe`hG;^u0L{lnJDb*b5IA{HqWsJ0ewMjQcTRiB+cfm zIRx1TYi~^`St@{ zNH{GI1O)BfZXiI?v8G=nwqJ^Y{DD7rhb!gvX)n%V!e+wkcIMfOdF8P|`)oiw0&Q*W z{M7iap3r?&{Riv%y=Q*EWLYQ|3aQ1Umd@TZ7$hIOXzKdlq*pPIr+QAh&G^Fp#n+Sh zJ=3vGU#bN~F31dz&dK}$Ba$e_*~ATn3?lFFVA*)|qSVp)u;R))Y>Sj*CGXZUnL~dN z>wFh82ilF=>R~vJxhkSKlD|j1@Yas+32O4+BlQks^j4r1-Hg?QVS@o6po9GJ(A-0U zI;1$~66Pk&R0Zf?X4Hr1P|GW_QFxB&p`eqhQR6KnR4u&%tKK|ofd5bc2#hlfkt}uH zgkKvPqSD@af#kqHLPA~yx4qUyK)+WGJy+q!utjZuBy`5j^x3TqEd}NoxBiGfOaCtZy6(0UcF{5a`t>JF4<7ge zK?`EUH&DrQw9b`>DMm*6aeI)OT3Qa2c=D)72?q*ZVhmGLG*lUr;m*fouOXsPf13Ca zQG|Al*A6`ebx=|1wyhn(G$fu?^&5S&S51*wGD}$2y4~8^dgk}Q`9?#zVfo2qOZSPk z)6{NI(18GilamT~8$x%(`YcqIaV|Ljo-o30HSC@EF_Z|cw07Q?`+`aI5q%JFJ`DCu zfo<}wQcx)u6-A>soKDS$0J{XOtv!~Nfpf`DYsT)6Sl#^q zqi_n8P~W(9er%+sSo!&Q9rvky6H>Xq0vXugnyaBUY;rtcvg_Kl0NQ>_Zl^CRPha2s zoW`v^0iS*6>!ux%m%FiMfz9u@6gw0zZK{;sSS*~`QdF;=*GC24cQ4{D5#5d+HN1Jn zNc(DWW4O3yqpWbdCqxASwX>{J0MeeSzH0Wzqdi8*=nT1nWAb2l9ZUY{C)(#sacUSj z$6YheR??PB%&}VQvO4ki`1nF{?ArLC-I>)wy$!*s{xc@$#MaxcG zLv@i$#Iv?JmO3`#IeXnN3}3&AM`pk+!BoYAH`fPz*o@Nu#7*C*=Ws zeD)&(+Q)~J4^2s&SlL(*^6U`=UppU8_w_1b l+NHB0YuH(N1qNYtr;6<-rWMEQrR>WC@VKLg?>h!v_%EJ9wMGB{ literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/AddInSamples/SpurGear/Resources/SpurGear/32x32.png b/usr/autodesk/CPP/AddInSamples/SpurGear/Resources/SpurGear/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..efa3cd1ff5f13540169175a2e922a5c291c87ef4 GIT binary patch literal 2058 zcmXxldpy(o9|!R7*k;p+xfPPj4y!X!E@_8^7W1Q)gj^28*mhioVJc;j&U9g_<>Wer z=8{}Oa!WMY;z%PAm5>}pLhHnS)9>;7E!5GfOlW$A|nJ{Mu$mpA+Z!1oe~`dsKE`4WUjdBPSLcaSV}mV4peRxVr8oQQ)5ZQ z&8R+|5=jEA*0#cB6Zq!jM06NEkr+z?0%+3B_?Dl`DRChYL|HTzXzZxZlre0Ry@|0= zl&El^LudMu%oP52KRz~u1guC?=l&maijIsVMbUv(A*Wqt(9M`9g&siy?k&7Dk%0(* z*um51VmBu_LTzn3zdiBbXyVNBfBt!mAIq^x3*7|{c7=tOxWCLk#5EfMkN7^c%wP40 zl!m_C_*~C+b<*)`G`QOEvYrwpMU&^iE`rj%u6L|-VD-UfmN_=y8BxsQoMftRRT6cc z?tr@b9-FoLBOd!UZlYhDR4}n@n^uhec3xZ3j(rwfa}=K~T-$OexgZnba8E~1Pp^r# zRG3<<@7w(N@eyU+PvW+nfTO#jA=_n!r6yJy%W2*l)ac#mMLd#zEa+SUw0g%z%&n0K zcrs%nmFW`tWZ8d$=};lUt{(!P@$Hi&jqQ?^BJp#6!D{}Fd%Rksr+hZPjDXfWE(fpT zD4F6k$H4gFnn#e)MzPJ%^2Y^nImE{T65hYDvREjkQwhQnQgK;f+=YDN^l+unSy~4eU+)c1^fWM=rY&`n zDl4kw3i~>Ot+}Po;2aWHlofOe`hG;^u0L{lnJDb*b5IA{HqWsJ0ewMjQcTRiB+cfm zIRx1TYi~^`St@{ zNH{GI1O)BfZXiI?v8G=nwqJ^Y{DD7rhb!gvX)n%V!e+wkcIMfOdF8P|`)oiw0&Q*W z{M7iap3r?&{Riv%y=Q*EWLYQ|3aQ1Umd@TZ7$hIOXzKdlq*pPIr+QAh&G^Fp#n+Sh zJ=3vGU#bN~F31dz&dK}$Ba$e_*~ATn3?lFFVA*)|qSVp)u;R))Y>Sj*CGXZUnL~dN z>wFh82ilF=>R~vJxhkSKlD|j1@Yas+32O4+BlQks^j4r1-Hg?QVS@o6po9GJ(A-0U zI;1$~66Pk&R0Zf?X4Hr1P|GW_QFxB&p`eqhQR6KnR4u&%tKK|ofd5bc2#hlfkt}uH zgkKvPqSD@af#kqHLPA~yx4qUyK)+WGJy+q!utjZuBy`5j^x3TqEd}NoxBiGfOaCtZy6(0UcF{5a`t>JF4<7ge zK?`EUH&DrQw9b`>DMm*6aeI)OT3Qa2c=D)72?q*ZVhmGLG*lUr;m*fouOXsPf13Ca zQG|Al*A6`ebx=|1wyhn(G$fu?^&5S&S51*wGD}$2y4~8^dgk}Q`9?#zVfo2qOZSPk z)6{NI(18GilamT~8$x%(`YcqIaV|Ljo-o30HSC@EF_Z|cw07Q?`+`aI5q%JFJ`DCu zfo<}wQcx)u6-A>soKDS$0J{XOtv!~Nfpf`DYsT)6Sl#^q zqi_n8P~W(9er%+sSo!&Q9rvky6H>Xq0vXugnyaBUY;rtcvg_Kl0NQ>_Zl^CRPha2s zoW`v^0iS*6>!ux%m%FiMfz9u@6gw0zZK{;sSS*~`QdF;=*GC24cQ4{D5#5d+HN1Jn zNc(DWW4O3yqpWbdCqxASwX>{J0MeeSzH0Wzqdi8*=nT1nWAb2l9ZUY{C)(#sacUSj z$6YheR??PB%&}VQvO4ki`1nF{?ArLC-I>)wy$!*s{xc@$#MaxcG zLv@i$#Iv?JmO3`#IeXnN3}3&AM`pk+!BoYAH`fPz*o@Nu#7*C*=Ws zeD)&(+Q)~J4^2s&SlL(*^6U`=UppU8_w_1b l+NHB0YuH(N1qNYtr;6<-rWMEQrR>WC@VKLg?>h!v_%EJ9wMGB{ literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/AddInSamples/SpurGear/Resources/SpurGear/32x32@2x.png b/usr/autodesk/CPP/AddInSamples/SpurGear/Resources/SpurGear/32x32@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd0d3dd857393ebea2a86f60b2f201da8f75d9b GIT binary patch literal 4997 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#define _USE_MATH_DEFINES +#include +#include + + +#if defined(_WINDOWS) || defined(_WIN32) || defined(_WIN64) +#include +#else +#include +#endif + +using namespace adsk::core; +using namespace adsk::fusion; + + +// Globals +Ptr _app; +Ptr _ui; +std::string _units = ""; + +// Global command input declarations. +Ptr _imgInputEnglish; +Ptr _imgInputMetric; +Ptr _standard; +Ptr _pressureAngle; +Ptr _pressureAngleCustom; +Ptr _backlash; +Ptr _diaPitch; +Ptr _module; +Ptr _numTeeth; +Ptr _rootFilletRad; +Ptr _thickness; +Ptr _holeDiam; +Ptr _pitchDiam; +Ptr _errMessage; + +bool getCommandInputValue(Ptr commandInput, std::string unitType, double *value); +bool is_digits(const std::string &str); +Ptr drawGear(Ptr design, double diametralPitch, int numTeeth, double thickness, double rootFilletRad, double pressureAngle, double backlash, double holeDiam); + + +bool checkReturn(Ptr returnObj) +{ + if (returnObj) + return true; + else + if (_app && _ui) + { + std::string errDesc; + _app->getLastError(&errDesc); + _ui->messageBox(errDesc); + return false; + } + else + return false; +} + +// Event handler for the execute event. +class GearCommandExecuteEventHandler : public adsk::core::CommandEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + double diaPitch = 0.0; + if( _standard->selectedItem()->name() == "English") + { + diaPitch = _diaPitch->value(); + } + else if (_standard->selectedItem()->name() == "Metric") + { + diaPitch = 25.4 / _module->value(); + } + + // Save the current values as attributes. + Ptr des = _app->activeProduct(); + Ptr attribs = des->attributes(); + attribs->add("SpurGear", "standard", _standard->selectedItem()->name()); + attribs->add("SpurGear", "pressureAngle", _pressureAngle->selectedItem()->name()); + attribs->add("SpurGear", "pressureAngleCustom", std::to_string(_pressureAngleCustom->value())); + attribs->add("SpurGear", "diaPitch", std::to_string(diaPitch)); + attribs->add("SpurGear", "numTeeth", _numTeeth->value()); + attribs->add("SpurGear", "rootFilletRad", std::to_string(_rootFilletRad->value())); + attribs->add("SpurGear", "thickness", std::to_string(_thickness->value())); + attribs->add("SpurGear", "holeDiam", std::to_string(_holeDiam->value())); + attribs->add("SpurGear", "backlash", std::to_string(_backlash->value())); + + // Get the current values. + double pressureAngle = 0.0; + if (_pressureAngle->selectedItem()->name() == "Custom") + { + pressureAngle = _pressureAngleCustom->value(); + } + else + { + if (_pressureAngle->selectedItem()->name() == "14.5 deg") + { + pressureAngle = 14.5 * (M_PI/180.0); + } + else if (_pressureAngle->selectedItem()->name() == "20 deg") + { + pressureAngle = 20.0 * (M_PI/180.0); + } + else if (_pressureAngle->selectedItem()->name() == "25 deg") + { + pressureAngle = 25.0 * (M_PI/180); + } + } + + int numTeeth = std::stoi(_numTeeth->value()); + double rootFilletRad = _rootFilletRad->value(); + double thickness = _thickness->value(); + double holeDiam = _holeDiam->value(); + double backlash = _backlash->value(); + + // Create the gear. + Ptr gearComp; + gearComp = drawGear(des, diaPitch, numTeeth, thickness, rootFilletRad, pressureAngle, backlash, holeDiam); + + if (gearComp) + { + std::string desc = ""; + if (_standard->selectedItem()->name() == "English") + { + desc = "Spur Gear; Diametrial Pitch: " + std::to_string(diaPitch) + "; "; + } + else if (_standard->selectedItem()->name() == "Metric") + { + desc = "Spur Gear; Module: " + std::to_string(25.4 / diaPitch) + "; "; + } + + desc += "Num Teeth: " + std::to_string(numTeeth) + "; "; + desc += "Pressure Angle: " + std::to_string(pressureAngle * (180/M_PI)) + "; "; + + desc += "Backlash: " + des->unitsManager()->formatInternalValue(backlash, _units, true); + gearComp->description(desc); + } + else + { + eventArgs->executeFailed(true); + eventArgs->executeFailedMessage("Unexpected failure while constructing the gear."); + } + } +} _gearCommandExecute; + + +class GearCommandInputChangedHandler : public adsk::core::InputChangedEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + Ptr changedInput = eventArgs->input(); + + if (changedInput->id() == "standard") + { + if (_standard->selectedItem()->name() == "English") + { + _imgInputMetric->isVisible(false); + _imgInputEnglish->isVisible(true); + + _diaPitch->isVisible(true); + _module->isVisible(false); + + _diaPitch->value(25.4 / _module->value()); + + _units = "in"; + } + else if (_standard->selectedItem()->name() == "Metric") + { + _imgInputMetric->isVisible(true); + _imgInputEnglish->isVisible(false); + + _diaPitch->isVisible(false); + _module->isVisible(true); + + _module->value(25.4 / _diaPitch->value()); + + _units = "mm"; + } + + // Set each one to it's current value because otherwised if the user + // has edited it, the value won't update in the dialog because + // apparently it remembers the units when the value was edited. + // Setting the value using the API resets this. + _backlash->value(_backlash->value()); + _backlash->unitType(_units); + _rootFilletRad->value(_rootFilletRad->value()); + _rootFilletRad->unitType(_units); + _thickness->value(_thickness->value()); + _thickness->unitType(_units); + _holeDiam->value(_holeDiam->value()); + _holeDiam->unitType(_units); + } + + // Update the pitch diameter value. + double diaPitch = 0; + if (_standard->selectedItem()->name() == "English") + { + double value; + if (getCommandInputValue(_diaPitch, "", &value)) + { + diaPitch = value; + } + } + else if (_standard->selectedItem()->name() == "Metric") + { + double value; + if (getCommandInputValue(_module, "", &value)) + { + diaPitch = 25.4 / value; + } + } + + if (diaPitch != 0) + { + if (is_digits(_numTeeth->value())) + { + double numTeeth = std::stoi(_numTeeth->value()); + double pitchDia = numTeeth/diaPitch; + + // The pitch dia has been calculated in inches, but this expects cm as the input units. + Ptr des = _app->activeProduct(); + std::string pitchDiaText = des->unitsManager()->formatInternalValue(pitchDia * 2.54, _units, true); + _pitchDiam->text(pitchDiaText); + } + else + { + _pitchDiam->text(""); + } + } + else + { + _pitchDiam->text(""); + } + + if (changedInput->id() == "pressureAngle") + { + if (_pressureAngle->selectedItem()->name() == "Custom") + { + _pressureAngleCustom->isVisible(true); + } + else + { + _pressureAngleCustom->isVisible(false); + } + } + } +} _gearCommandInputChanged; + + +class GearCommandValidateInputsEventHandler : public adsk::core::ValidateInputsEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + _errMessage->text(""); + + // Verify that at lesat 4 teath are specified. + int numTeeth; + if (!is_digits(_numTeeth->value())) + { + _errMessage->text("The number of teeth must be a whole number."); + eventArgs->areInputsValid(false); + return; + } + else + { + numTeeth = std::stoi(_numTeeth->value()); + } + + if (numTeeth < 4) + { + _errMessage->text("The number of teeth must be 4 or more."); + eventArgs->areInputsValid(false); + return; + } + + // Calculate some of the gear sizes to use in validation. + double diaPitch = 0.0; + if (_standard->selectedItem()->name() == "English") + { + double value; + if (!getCommandInputValue(_diaPitch, "", &value)) + { + eventArgs->areInputsValid(false); + return; + } + else + { + diaPitch = value; + } + } + else if (_standard->selectedItem()->name() == "Metric") + { + double value; + if (!getCommandInputValue(_module, "", &value)) + { + eventArgs->areInputsValid(false); + return; + } + else + { + diaPitch = 25.4 / value; + } + } + + double diametralPitch = diaPitch / 2.54; + double pitchDia = numTeeth / diametralPitch; + + double dedendum; + if (diametralPitch < (20.0 *(M_PI/180.0))-0.000001) + { + dedendum = 1.157 / diametralPitch; + } + else + { + double circularPitch = M_PI / diametralPitch; + if (circularPitch >= 20.0) + { + dedendum = 1.25 / diametralPitch; + } + else + { + dedendum = (1.2 / diametralPitch) + (.002 * 2.54); + } + } + + double rootDia = pitchDia - (2.0 * dedendum); + + double pressureAngle = 0.0; + if (_pressureAngle->selectedItem()->name() == "Custom") + { + pressureAngle = _pressureAngleCustom->value(); + } + else + { + if (_pressureAngle->selectedItem()->name() == "14.5 deg") + pressureAngle = 14.5 * (M_PI/180.0); + else if (_pressureAngle->selectedItem()->name() == "20 deg") + pressureAngle = 20.0 * (M_PI/180.0); + else if (_pressureAngle->selectedItem()->name() == "25 deg") + pressureAngle = 25.0 * (M_PI/180.0); + } + + double baseCircleDia = pitchDia * cos(pressureAngle); + double baseCircleCircumference = 2.0 * M_PI * (baseCircleDia / 2.0); + + Ptr des = _app->activeProduct(); + + double holeDiam; + double value; + if (!getCommandInputValue(_holeDiam, _units, &value)) + { + eventArgs->areInputsValid(false); + return; + } + else + { + holeDiam = value; + } + + if (holeDiam >= (rootDia - 0.01)) + { + _errMessage->text("The center hole diameter is too large. It must be less than " + des->unitsManager()->formatInternalValue(rootDia - 0.01, _units, true)); + eventArgs->areInputsValid(false); + return; + } + + double toothThickness = baseCircleCircumference / (numTeeth * 2); + if (_rootFilletRad->value() > toothThickness * 0.4) + { + _errMessage->text("The root fillet radius is too large. It must be less than " + des->unitsManager()->formatInternalValue(toothThickness * 0.4, _units, true)); + eventArgs->areInputsValid(false); + return; + } + } +} _gearCommandValidateInputs; + + +class SpurGearCommandCreatedEventHandler : public adsk::core::CommandCreatedEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + // Verify that a Fusion design is active. + Ptr des = _app->activeProduct(); + if (!checkReturn(des)) + { + _ui->messageBox("A Fusion design must be active when invoking this command."); + return; + } + + std::string defaultUnits = des->unitsManager()->defaultLengthUnits(); + + // Determine whether to use inches or millimeters as the intial default. + if (defaultUnits == "in" || defaultUnits == "ft") + { + _units = "in"; + } + else + { + _units = "mm"; + } + + // Define the default values and get the previous values from the attributes. + std::string standard; + if (_units == "in") + { + standard = "English"; + } + else + { + standard = "Metric"; + } + + Ptr standardAttrib = des->attributes()->itemByName("SpurGear", "standard"); + if (checkReturn(standardAttrib)) + standard = standardAttrib->value(); + + if (standard == "English") + { + _units = "in"; + } + else + { + _units = "mm"; + } + + std::string pressureAngle = "20 deg"; + Ptr pressureAngleAttrib = des->attributes()->itemByName("SpurGear", "pressureAngle"); + if (checkReturn(pressureAngleAttrib)) + { + pressureAngle = pressureAngleAttrib->value(); + } + + double pressureAngleCustom = 20 * (M_PI/180.0); + Ptr pressureAngleCustomAttrib = des->attributes()->itemByName("SpurGear", "pressureAngleCustom"); + if (checkReturn(pressureAngleCustomAttrib)) + { + pressureAngleCustom = std::stod(pressureAngleCustomAttrib->value()); + } + + std::string diaPitch = "2"; + Ptr diaPitchAttrib = des->attributes()->itemByName("SpurGear", "diaPitch"); + if (checkReturn(diaPitchAttrib)) + { + diaPitch = diaPitchAttrib->value(); + } + double metricModule = 25.4 / std::stod(diaPitch); + + std::string backlash = "0"; + Ptr backlashAttrib = des->attributes()->itemByName("SpurGear", "backlash"); + if (checkReturn(backlashAttrib)) + backlash = backlashAttrib->value(); + + std::string numTeeth = "24"; + Ptr numTeethAttrib = des->attributes()->itemByName("SpurGear", "numTeeth"); + if (checkReturn(numTeethAttrib)) + numTeeth = numTeethAttrib->value(); + + std::string rootFilletRad = std::to_string(.0625 * 2.54); + Ptr rootFilletRadAttrib = des->attributes()->itemByName("SpurGear", "rootFilletRad"); + if (checkReturn(rootFilletRadAttrib)) + rootFilletRad = rootFilletRadAttrib->value(); + + std::string thickness = std::to_string(0.5 * 2.54); + Ptr thicknessAttrib = des->attributes()->itemByName("SpurGear", "thickness"); + if (checkReturn(thicknessAttrib)) + thickness = thicknessAttrib->value(); + + std::string holeDiam = std::to_string(0.5 * 2.54); + Ptr holeDiamAttrib = des->attributes()->itemByName("SpurGear", "holeDiam"); + if (checkReturn(holeDiamAttrib)) + holeDiam = holeDiamAttrib->value(); + + Ptr cmd = eventArgs->command(); + cmd->isExecutedWhenPreEmpted(false); + Ptr inputs = cmd->commandInputs(); + if (!checkReturn(inputs)) + return; + + // Define the command dialog. + _imgInputEnglish = inputs->addImageCommandInput("gearImageEnglish", "", "Resources/GearEnglish.png"); + if (!checkReturn(_imgInputEnglish)) + return; + _imgInputEnglish->isFullWidth(true); + + _imgInputMetric = inputs->addImageCommandInput("gearImageMetric", "", "Resources/GearMetric.png"); + if (!checkReturn(_imgInputMetric)) + return; + _imgInputMetric->isFullWidth(true); + + _standard = inputs->addDropDownCommandInput("standard", "Standard", TextListDropDownStyle); + if (!checkReturn(_standard)) + return; + + if (standard == "English") + { + _standard->listItems()->add("English", true); + _standard->listItems()->add("Metric", false); + _imgInputMetric->isVisible(false); + } + else + { + _standard->listItems()->add("English", false); + _standard->listItems()->add("Metric", true); + _imgInputEnglish->isVisible(false); + } + + _pressureAngle = inputs->addDropDownCommandInput("pressureAngle", "Pressure Angle", TextListDropDownStyle); + if (!checkReturn(_pressureAngle)) + return; + + if (pressureAngle == "14.5 deg") + { + _pressureAngle->listItems()->add("14.5 deg", true); + } + else + { + _pressureAngle->listItems()->add("14.5 deg", false); + } + + if (pressureAngle == "20 deg") + { + _pressureAngle->listItems()->add("20 deg", true); + } + else + { + _pressureAngle->listItems()->add("20 deg", false); + } + + if (pressureAngle == "25 deg") + { + _pressureAngle->listItems()->add("25 deg", true); + } + else + { + _pressureAngle->listItems()->add("25 deg", false); + } + + if (pressureAngle == "Custom") + { + _pressureAngle->listItems()->add("Custom", true); + } + else + { + _pressureAngle->listItems()->add("Custom", false); + } + + _pressureAngleCustom = inputs->addValueInput("pressureAngleCustom", "Custom Angle", "deg", ValueInput::createByReal(pressureAngleCustom)); + if (!checkReturn(_pressureAngleCustom)) + return; + if (pressureAngle != "Custom") + { + _pressureAngleCustom->isVisible(false); + } + + _diaPitch = inputs->addValueInput("diaPitch", "Diametral Pitch", "", ValueInput::createByString(diaPitch)) ; + + _module = inputs->addValueInput("module", "Module", "", ValueInput::createByReal(metricModule)) ; + if (!checkReturn(_module)) + return; + + if (standard == "English") + { + _module->isVisible(false); + } + else if (standard == "Metric") + { + _diaPitch->isVisible(false); + } + + _numTeeth = inputs->addStringValueInput("numTeeth", "Number of Teeth", numTeeth); + if (!checkReturn(_pressureAngleCustom)) + return; + + _backlash = inputs->addValueInput("backlash", "Backlash", _units, ValueInput::createByReal(std::stod(backlash))); + if (!checkReturn(_backlash)) + return; + + _rootFilletRad = inputs->addValueInput("rootFilletRad", "Root Fillet Radius", _units, ValueInput::createByReal(std::stod(rootFilletRad))); + if (!checkReturn(_rootFilletRad)) + return; + + _thickness = inputs->addValueInput("thickness", "Gear Thickness", _units, ValueInput::createByReal(std::stod(thickness))); + if (!checkReturn(_thickness)) + return; + + _holeDiam = inputs->addValueInput("holeDiam", "Hole Diameter", _units,ValueInput::createByReal(std::stod(holeDiam))); + if (!checkReturn(_holeDiam)) + return; + + _pitchDiam = inputs->addTextBoxCommandInput("pitchDiam", "Pitch Diameter", "", 1, true); + if (!checkReturn(_pitchDiam)) + return; + + _errMessage = inputs->addTextBoxCommandInput("errMessage", "", "", 2, true); + if (!checkReturn(_errMessage)) + return; + _errMessage->isFullWidth(true); + + // Connect to the command related events. + Ptr inputChangedEvent = cmd->inputChanged(); + if (!inputChangedEvent) + return; + bool isOk = inputChangedEvent->add(&_gearCommandInputChanged); + if (!isOk) + return; + + Ptr validateInputsEvent = cmd->validateInputs(); + if (!validateInputsEvent) + return; + isOk = validateInputsEvent->add(&_gearCommandValidateInputs); + if (!isOk) + return; + + Ptr executeEvent = cmd->execute(); + if (!executeEvent) + return; + isOk = executeEvent->add(&_gearCommandExecute); + if (!isOk) + return; + } +} _gearCommandCreated; + + +extern "C" XI_EXPORT bool run(const char* context) +{ + _app = Application::get(); + if (!_app) + return false; + + _ui = _app->userInterface(); + if (!_ui) + return false; + + // Create a command definition and add a button to the CREATE panel. + Ptr cmdDef = _ui->commandDefinitions()->addButtonDefinition("adskSpurGearCPPAddIn", "Spur Gear", "Creates a spur gear component", "Resources/SpurGear"); + if (!checkReturn(cmdDef)) + return false; + + Ptr createPanel = _ui->allToolbarPanels()->itemById("SolidCreatePanel"); + if (!checkReturn(createPanel)) + return false; + + Ptr gearButton = createPanel->controls()->addCommand(cmdDef); + if (!checkReturn(gearButton)) + return false; + + // Connect to the command created event. + Ptr commandCreatedEvent = cmdDef->commandCreated(); + if (!checkReturn(commandCreatedEvent)) + return false; + + bool isOk = commandCreatedEvent->add(&_gearCommandCreated); + if (!isOk) + return false; + + std::string strContext = context; + if (strContext.find("IsApplicationStartup", 0) != std::string::npos) + { + if (strContext.find("false", 0) != std::string::npos) + { + _ui->messageBox("The \"Spur Gear\" command has been added\nto the CREATE panel of the MODEL workspace."); + } + } + + return true; +} + +extern "C" XI_EXPORT bool stop(const char* context) +{ + Ptr createPanel = _ui->allToolbarPanels()->itemById("SolidCreatePanel"); + if (!checkReturn(createPanel)) + return false; + + Ptr gearButton = createPanel->controls()->itemById("adskSpurGearCPPAddIn"); + if (checkReturn(gearButton)) + gearButton->deleteMe(); + + Ptr cmdDef = _ui->commandDefinitions()->itemById("adskSpurGearCPPAddIn"); + if (checkReturn(cmdDef)) + cmdDef->deleteMe(); + + return true; +} + + +bool is_digits(const std::string &str) +{ + return str.find_first_not_of("0123456789") == std::string::npos; +} + + +/* + * Verfies that a value command input has a valid expression and returns the + * value if it does. Otherwise it returns False. This works around a + * problem where when you get the value from a ValueCommandInput it causes the + * current expression to be evaluated and updates the display. Some new functionality + * is being added in the future to the ValueCommandInput object that will make + * this easier and should make this function obsolete. + */ +bool getCommandInputValue(Ptr commandInput, std::string unitType, double *value) +{ + Ptr valCommandInput = commandInput; + if (!commandInput) + { + *value = 0; + return false; + } + + // Verify that the expression is valid. + Ptr des = _app->activeProduct(); + Ptr unitsMgr = des->unitsManager(); + + if (unitsMgr->isValidExpression(valCommandInput->expression(), unitType)) + { + *value = unitsMgr->evaluateExpression(valCommandInput->expression(), unitType); + return true; + } + else + { + *value = 0; + return false; + } +} + + +// Calculate points along an involute curve. +Ptr involutePoint(double baseCircleRadius, double distFromCenterToInvolutePoint) +{ + // Calculate the other side of the right-angle triangle defined by the base circle and the current distance radius. + // This is also the length of the involute chord as it comes off of the base circle. + double triangleSide = sqrt(pow(distFromCenterToInvolutePoint, 2.0) - pow(baseCircleRadius, 2.0)); + + // Calculate the angle of the involute. + double alpha = triangleSide / baseCircleRadius; + + // Calculate the angle where the current involute point is. + double theta = alpha - acos(baseCircleRadius / distFromCenterToInvolutePoint); + + // Calculate the coordinates of the involute point. + double x = distFromCenterToInvolutePoint * cos(theta); + double y = distFromCenterToInvolutePoint * sin(theta); + + // Create a point to return. + return( adsk::core::Point3D::create(x, y, 0) ); +} + + +// Builds a spur gear. +Ptr drawGear(Ptr design, double diametralPitch, int numTeeth, double thickness, double rootFilletRad, double pressureAngle, double backlash, double holeDiam) +{ + // The diametral pitch is specified in inches but everthing + // here expects all distances to be in centimeters, so convert + // for the gear creation. + diametralPitch = diametralPitch / 2.54; + + // Compute the various values for a gear. + double pitchDia = (double)numTeeth / diametralPitch; + + //addendum = 1.0 / diametralPitch + double dedendum; + if (diametralPitch < (20 *(M_PI/180.0))-0.000001) + { + dedendum = 1.157 / diametralPitch; + } + else + { + double circularPitch = M_PI / diametralPitch; + if (circularPitch >= 20.0) + { + dedendum = 1.25 / diametralPitch; + } + else + { + dedendum = (1.2 / diametralPitch) + (.002 * 2.54); + } + } + + double rootDia = pitchDia - (2.0 * dedendum); + + double baseCircleDia = pitchDia * cos(pressureAngle); + double outsideDia = (double)(numTeeth + 2) / diametralPitch; + + // Create a new component by creating an occurrence. + Ptr occs = design->rootComponent()->occurrences(); + if (!checkReturn(occs)) + return nullptr; + + Ptr mat = adsk::core::Matrix3D::create(); + if (!checkReturn(mat)) + return nullptr; + + Ptr newOcc = occs->addNewComponent(mat); + if (!checkReturn(newOcc)) + return nullptr; + + Ptr newComp = newOcc->component(); + if (!checkReturn(newComp)) + return nullptr; + + // Create a new sketch. + Ptr sketches = newComp->sketches(); + if (!checkReturn(sketches)) + return nullptr; + + Ptr xyPlane = newComp->xYConstructionPlane(); + if (!checkReturn(xyPlane)) + return nullptr; + + Ptr baseSketch = sketches->add(xyPlane); + if (!checkReturn(xyPlane)) + return nullptr; + + // Draw a circle for the base. + baseSketch->sketchCurves()->sketchCircles()->addByCenterRadius(adsk::core::Point3D::create(0,0,0), rootDia/2.0); + if (!checkReturn(baseSketch)) + return nullptr; + + // Draw a circle for the center hole, if the value is greater than 0. + Ptr prof = nullptr; + if (holeDiam - (_app->pointTolerance() * 2) > 0) + { + Ptr circ = baseSketch->sketchCurves()->sketchCircles()->addByCenterRadius(adsk::core::Point3D::create(0,0,0), holeDiam/2.0); + if (!checkReturn(circ)) + return nullptr; + + // Find the profile that uses both circles. + for (Ptr tempProf : baseSketch->profiles()) + { + if (tempProf->profileLoops()->count() == 2) + { + prof = tempProf; + break; + } + } + } + else + { + // Use the single profile. + prof = baseSketch->profiles()->item(0); + } + + if (!checkReturn(prof)) + return nullptr; + + //////// Extrude the circle to create the base of the gear. + + // Create an extrusion input to be able to define the input needed for an extrusion + // while specifying the profile and that a new component is to be created + Ptr extrudes = newComp->features()->extrudeFeatures(); + if (!checkReturn(extrudes)) + return nullptr; + + Ptr extInput = extrudes->createInput(prof, NewBodyFeatureOperation); + if (!checkReturn(extInput)) + return nullptr; + + // Define that the extent is a distance extent of 5 cm. + Ptr distance = adsk::core::ValueInput::createByReal(thickness); + if (!checkReturn(distance)) + return nullptr; + + bool result = extInput->setDistanceExtent(false, distance); + if (!result) + return nullptr; + + // Create the extrusion. + Ptr baseExtrude = extrudes->add(extInput); + if (!checkReturn(baseExtrude)) + return nullptr; + + // Create a second sketch for the tooth. + Ptr toothSketch = sketches->add(xyPlane); + if (!checkReturn(toothSketch)) + return nullptr; + + // Calculate points along the involute curve. + int involutePointCount = 15; + double involuteIntersectionRadius = baseCircleDia / 2.0; + Ptr *involutePoints = new Ptr[involutePointCount]; + std::unique_ptr[]> involutePointsDeleter(involutePoints); + double involuteSize = (outsideDia - baseCircleDia) / 2.0; + for (int i=0; i newPoint = involutePoint(baseCircleDia / 2.0, involuteIntersectionRadius); + involutePoints[i] = newPoint; + } + + // Get the point along the tooth that's at the pictch diameter and then + // calculate the angle to that point. + Ptr pitchInvolutePoint = involutePoint(baseCircleDia / 2.0, pitchDia / 2.0); + double pitchPointAngle = atan(pitchInvolutePoint->y() / pitchInvolutePoint->x()); + + // Determine the angle defined by the tooth thickness as measured at + // the pitch diameter circle. + double toothThicknessAngle = (2.0 * M_PI) / (2.0 * (double)numTeeth); + + // Determine the angle needed for the specified backlash. + double backlashAngle = (backlash / (pitchDia / 2.0)) * 0.25; + + // Determine the angle to rotate the curve. + double rotateAngle = -((toothThicknessAngle/2.0) + pitchPointAngle - backlashAngle); + + // Rotate the involute so the middle of the tooth lies on the x axis. + double cosAngle = cos(rotateAngle); + double sinAngle = sin(rotateAngle); + for (int i=0; ix() * cosAngle - involutePoints[i]->y() * sinAngle; + double newY = involutePoints[i]->x() * sinAngle + involutePoints[i]->y() * cosAngle; + involutePoints[i] = adsk::core::Point3D::create(newX, newY, 0); + } + + // Create a new set of points with a negated y. This effectively mirrors the original + // points about the X axis. + Ptr *involute2Points = new Ptr[involutePointCount]; + std::unique_ptr[]> involute2PointsDeleter(involute2Points); + for (int i=0; ix(), -involutePoints[i]->y(), 0); + } + + double *curve1Angle = new double[involutePointCount]; + std::unique_ptr curve1AngleDeleter(curve1Angle); + for (int i=0; iy() / involutePoints[i]->x()); + } + + double *curve2Angle = new double[involutePointCount]; + std::unique_ptr curve2AngleDeleter(curve2Angle); + for (int i=0; iy() / involute2Points[i]->x()); + } + + toothSketch->isComputeDeferred(true); + + // Create and load an object collection with the points. + Ptr pointSet = adsk::core::ObjectCollection::create(); + for (int i=0; iadd(involutePoints[i]); + } + + // Create the first spline. + Ptr spline1 = toothSketch->sketchCurves()->sketchFittedSplines()->add(pointSet); + if (!checkReturn(spline1)) + return nullptr; + + // Add the involute points for the second spline to an ObjectCollection. + pointSet = adsk::core::ObjectCollection::create(); + for (int i=0; iadd(involute2Points[i]); + } + + // Create the second spline. + Ptr spline2 = toothSketch->sketchCurves()->sketchFittedSplines()->add(pointSet); + if (!checkReturn(spline2)) + return nullptr; + + // Draw the arc for the top of the tooth. + Ptr midPoint = adsk::core::Point3D::create((outsideDia / 2.0), 0, 0); + Ptr topArc = toothSketch->sketchCurves()->sketchArcs()->addByThreePoints(spline1->endSketchPoint(), midPoint, spline2->endSketchPoint()); + if (!checkReturn(topArc)) + return nullptr; + + // Check to see if involute goes down to the root or not. If not, then + // create lines to connect the involute to the root. + if (baseCircleDia < rootDia) + { + Ptr bottomLine = toothSketch->sketchCurves()->sketchLines()->addByTwoPoints(spline2->startSketchPoint(), spline1->startSketchPoint()); + if (!checkReturn(bottomLine)) + return nullptr; + } + else + { + Ptr rootPoint1 = adsk::core::Point3D::create((rootDia / 2 - 0.001) * cos(curve1Angle[0] ), (rootDia / 2) * sin(curve1Angle[0]), 0); + Ptr line1 = toothSketch->sketchCurves()->sketchLines()->addByTwoPoints(rootPoint1, spline1->startSketchPoint()); + if (!checkReturn(line1)) + return nullptr; + + Ptr rootPoint2 = adsk::core::Point3D::create((rootDia / 2 - 0.001) * cos(curve2Angle[0]), (rootDia / 2) * sin(curve2Angle[0]), 0); + Ptr line2 = toothSketch->sketchCurves()->sketchLines()->addByTwoPoints(rootPoint2, spline2->startSketchPoint()); + if (!checkReturn(line2)) + return nullptr; + + Ptr bottomLine = toothSketch->sketchCurves()->sketchLines()->addByTwoPoints(line1->startSketchPoint(), line2->startSketchPoint()); + if (!checkReturn(bottomLine)) + return nullptr; + + // Make the lines tangent to the spline so the root fillet will behave correctly. + if (!line1->isFixed(true)) + return nullptr; + + if (!line2->isFixed(true)) + return nullptr; + + Ptr geomConstraints = toothSketch->geometricConstraints(); + if (!checkReturn(geomConstraints)) + return nullptr; + + Ptr tangent = geomConstraints->addTangent(spline1, line1); + if (!checkReturn(tangent)) + return nullptr; + + tangent = geomConstraints->addTangent(spline2, line2); + if (!checkReturn(tangent)) + return nullptr; + } + + toothSketch->isComputeDeferred(false); + + ////// Extrude the tooth. + + // Get the profile defined by the tooth. + prof = toothSketch->profiles()->item(0); + if (!checkReturn(prof)) + return nullptr; + + // Create an extrusion input to be able to define the input needed for an extrusion + // while specifying the profile and that a new component is to be created + extInput = extrudes->createInput(prof, JoinFeatureOperation); + if (!checkReturn(extInput)) + return nullptr; + + // Define that the extent is a distance extent of 5 cm. + distance = adsk::core::ValueInput::createByReal(thickness); + if (!checkReturn(distance)) + return nullptr; + + result = extInput->setDistanceExtent(false, distance); + if (!result) + return nullptr; + + // Create the extrusion. + Ptr toothExtrude = extrudes->add(extInput); + if (!checkReturn(toothExtrude)) + return nullptr; + + Ptr baseFillet; + if (rootFilletRad > 0) + { + ////// Find the edges between the base cylinder and the tooth. + + // Get the outer cylindrical face from the base extrusion by checking the number + // of edges and if it's 2 get the other one. + Ptr cylFace = baseExtrude->sideFaces()->item(0); + if (cylFace->edges()->count() == 2) + { + cylFace = baseExtrude->sideFaces()->item(1); + } + if (!checkReturn(cylFace)) + return nullptr; + + // Get the two linear edges, which are the connection between the cylinder and tooth. + Ptr edges = adsk::core::ObjectCollection::create(); + for (Ptr edge : cylFace->edges()) + { + Ptr tempLine = edge->geometry(); + if (tempLine) + { + edges->add(edge); + } + } + + // Create a fillet input to be able to define the input needed for a fillet. + Ptr fillets = newComp->features()->filletFeatures(); + if (!checkReturn(fillets)) + return nullptr; + + Ptr filletInput = fillets->createInput(); + if (!checkReturn(filletInput)) + return nullptr; + + // Define that the extent is a distance extent of 5 cm. + Ptr radius = adsk::core::ValueInput::createByReal(rootFilletRad); + if (!checkReturn(radius)) + return nullptr; + + result = filletInput->addConstantRadiusEdgeSet(edges, radius, false); + if (!result) + return nullptr; + + // Create the extrusion. + baseFillet = fillets->add(filletInput); + if (!checkReturn(baseFillet)) + return nullptr; + } + + // Create a pattern of the tooth extrude and the base fillet. + Ptr circularPatterns = newComp->features()->circularPatternFeatures(); + if (!checkReturn(circularPatterns)) + return nullptr; + + Ptr entities = adsk::core::ObjectCollection::create(); + entities->add(toothExtrude); + if (baseFillet) + { + entities->add(baseFillet); + } + + Ptr cylFace = baseExtrude->sideFaces()->item(0); + if (!checkReturn(cylFace)) + return nullptr; + + Ptr patternInput = circularPatterns->createInput(entities, cylFace); + if (!checkReturn(patternInput)) + return nullptr; + + Ptr numTeethInput = adsk::core::ValueInput::createByString(std::to_string(numTeeth)); + if (!checkReturn(numTeethInput)) + return nullptr; + + patternInput->quantity(numTeethInput); + patternInput->patternComputeOption(adsk::fusion::PatternComputeOptions::IdenticalPatternCompute); + Ptr pattern = circularPatterns->add(patternInput); + if (!checkReturn(pattern)) + return nullptr; + + // Create an extra sketch that contains a circle of the diametral pitch. + Ptr diametralPitchSketch = sketches->add(xyPlane); + if (!checkReturn(diametralPitchSketch)) + return nullptr; + + Ptr diametralPitchCircle = diametralPitchSketch->sketchCurves()->sketchCircles()->addByCenterRadius(adsk::core::Point3D::create(0,0,0), pitchDia/2.0); + if (!checkReturn(diametralPitchCircle)) + return nullptr; + + diametralPitchCircle->isConstruction(true); + diametralPitchCircle->isFixed(true); + + // Group everything used to create the gear in the timeline. + Ptr timelineGroups = design->timeline()->timelineGroups(); + if (!checkReturn(timelineGroups)) + return nullptr; + + int newOccIndex = newOcc->timelineObject()->index(); + int pitchSketchIndex = diametralPitchSketch->timelineObject()->index(); + + Ptr timelineGroup = timelineGroups->add(newOccIndex, pitchSketchIndex); + if (!checkReturn(timelineGroup)) + return nullptr; + + timelineGroup->name("Spur Gear"); + + // Add an attribute to the component with all of the input values. This might + // be used in the future to be able to edit the gear. + std::string gearValues = "{"; + gearValues += "'pressureAngle': '" + std::to_string(pressureAngle) + "',"; + gearValues += "'numTeeth': '" + std::to_string(numTeeth) + "',"; + gearValues += "'backlash': '" + std::to_string(backlash) + "',"; + gearValues += "'holeDiam': '" + std::to_string(holeDiam) + "',"; + gearValues += "'thickness': '" + std::to_string(thickness) + "',"; + gearValues += "'rootFilletRad': '" + std::to_string(rootFilletRad) + "',"; + gearValues += "'diametralPitch': '" + std::to_string(diametralPitch * 2.54) + "'}"; + Ptr attrib = newComp->attributes()->add("SpurGear", "Values", gearValues); + if (!checkReturn(attrib)) + return nullptr; + + // Set the name of the component. + newComp->name("Spur Gear (" + std::to_string(numTeeth) + " teeth)"); + + return newComp; +} + + + +#ifdef XI_WIN + +#include + +BOOL APIENTRY DllMain(HMODULE hmodule, DWORD reason, LPVOID reserved) +{ + switch (reason) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +#endif // XI_WIN diff --git a/usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.dll b/usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.dll new file mode 100644 index 0000000000000000000000000000000000000000..5569e6b270fdd5b66a700d99840e806d6fa78152 GIT binary patch literal 353648 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 z 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

L0&hY!N7=pa4cvVgNkst4d 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 `Y-t6kQ`QWrbb`!O+2{VQ_4UB50W;A2^ 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

00tzGqce=m|6HdHQup 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 literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.manifest b/usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.manifest new file mode 100644 index 0000000..7024506 --- /dev/null +++ b/usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.manifest @@ -0,0 +1,15 @@ +{ + "autodeskProduct": "Fusion360", + "type": "addin", + "author": "", + "description": { + "": "" + }, + "supportedOS": "windows|mac", + "editEnabled": true, + "id": "0892cd63-96ba-473f-8600-aee5547d8205", + "version": "", + "runOnStartup": false, + "sourcewindows": "SpurGear.vcxproj", + "sourcemac": "SpurGear.xcodeproj" +} \ No newline at end of file diff --git a/usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.vcxproj b/usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.vcxproj new file mode 100644 index 0000000..8219d58 --- /dev/null +++ b/usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.vcxproj @@ -0,0 +1,107 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {D7CBB035-8CC0-4576-9C72-5076E079586B} + Win32Proj + SpurGear + + + + DynamicLibrary + true + v140 + Unicode + + + DynamicLibrary + false + v140 + true + Unicode + + + + + + + + + + + + + false + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + false + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;SIMPLE_EXPORTS;%(PreprocessorDefinitions) + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/include + + + Windows + true + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/lib + core.lib;fusion.lib;cam.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /R /Y "$(SolutionDir)$(Configuration)\$(ProjectName).dll" "$(SolutionDir)" + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;SIMPLE_EXPORTS;%(PreprocessorDefinitions) + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/include + + + Windows + true + true + true + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/lib + core.lib;fusion.lib;cam.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /R /Y "$(SolutionDir)$(Configuration)\$(ProjectName).dll" "$(SolutionDir)" + + + + + NotUsing + NotUsing + + + + + true + true + + + + + + \ No newline at end of file diff --git a/usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.xcodeproj/project.pbxproj b/usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c707caa --- /dev/null +++ b/usr/autodesk/CPP/AddInSamples/SpurGear/SpurGear.xcodeproj/project.pbxproj @@ -0,0 +1,269 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 2BB196C61AD5940800164CD3 /* SpurGear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2BB196C51AD5940800164CD3 /* SpurGear.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 2BB196BE1AD586AA00164CD3 /* SpurGear.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = SpurGear.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; + 2BB196C51AD5940800164CD3 /* SpurGear.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpurGear.cpp; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2BB196BB1AD586AA00164CD3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2BB196B51AD586AA00164CD3 = { + isa = PBXGroup; + children = ( + 2BB196C51AD5940800164CD3 /* SpurGear.cpp */, + 2BB196BF1AD586AA00164CD3 /* Products */, + ); + sourceTree = ""; + }; + 2BB196BF1AD586AA00164CD3 /* Products */ = { + isa = PBXGroup; + children = ( + 2BB196BE1AD586AA00164CD3 /* SpurGear.dylib */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 2BB196BC1AD586AA00164CD3 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 2BB196BD1AD586AA00164CD3 /* SpurGear */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2BB196C21AD586AA00164CD3 /* Build configuration list for PBXNativeTarget "SpurGear" */; + buildPhases = ( + 2BB196BA1AD586AA00164CD3 /* Sources */, + 2BB196BB1AD586AA00164CD3 /* Frameworks */, + 2BB196BC1AD586AA00164CD3 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SpurGear; + productName = SpurGear; + productReference = 2BB196BE1AD586AA00164CD3 /* SpurGear.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 2BB196B61AD586AA00164CD3 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0500; + ORGANIZATIONNAME = Autodesk; + }; + buildConfigurationList = 2BB196B91AD586AA00164CD3 /* Build configuration list for PBXProject "SpurGear" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 2BB196B51AD586AA00164CD3; + productRefGroup = 2BB196BF1AD586AA00164CD3 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 2BB196BD1AD586AA00164CD3 /* SpurGear */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 2BB196BA1AD586AA00164CD3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2BB196C61AD5940800164CD3 /* SpurGear.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 2BB196C01AD586AA00164CD3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/include", + ); + LIBRARY_SEARCH_PATHS = "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib"; + MACOSX_DEPLOYMENT_TARGET = 11.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 2BB196C11AD586AA00164CD3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/include", + ); + LIBRARY_SEARCH_PATHS = "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib"; + MACOSX_DEPLOYMENT_TARGET = 11.0; + SDKROOT = macosx; + }; + name = Release; + }; + 2BB196C31AD586AA00164CD3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(EFFECTIVE_PLATFORM_NAME)"; + EXECUTABLE_EXTENSION = dylib; + EXECUTABLE_PREFIX = ""; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(PYTHONINC)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); + INSTALL_PATH = "$(SRCROOT)"; + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = ""; + OTHER_LDFLAGS = ( + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/core.dylib", + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/fusion.dylib", + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/cam.dylib", + ); + PRELINK_LIBS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SYMROOT = "$(SRCROOT)"; + }; + name = Debug; + }; + 2BB196C41AD586AA00164CD3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(EFFECTIVE_PLATFORM_NAME)"; + EXECUTABLE_EXTENSION = dylib; + EXECUTABLE_PREFIX = ""; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(PYTHONINC)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); + INSTALL_PATH = "$(SRCROOT)"; + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = ""; + OTHER_LDFLAGS = ( + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/core.dylib", + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/fusion.dylib", + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/cam.dylib", + ); + PRELINK_LIBS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SYMROOT = "$(SRCROOT)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2BB196B91AD586AA00164CD3 /* Build configuration list for PBXProject "SpurGear" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BB196C01AD586AA00164CD3 /* Debug */, + 2BB196C11AD586AA00164CD3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2BB196C21AD586AA00164CD3 /* Build configuration list for PBXNativeTarget "SpurGear" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BB196C31AD586AA00164CD3 /* Debug */, + 2BB196C41AD586AA00164CD3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 2BB196B61AD586AA00164CD3 /* Project object */; +} diff --git a/usr/autodesk/CPP/Default/DEFAULT.cpp b/usr/autodesk/CPP/Default/DEFAULT.cpp new file mode 100644 index 0000000..729fcfa --- /dev/null +++ b/usr/autodesk/CPP/Default/DEFAULT.cpp @@ -0,0 +1,45 @@ + +#include +#include +#include + +using namespace adsk::core; +using namespace adsk::fusion; +using namespace adsk::cam; + +Ptr app; +Ptr ui; + +extern "C" XI_EXPORT bool run(const char* context) +{ + app = Application::get(); + if (!app) + return false; + + ui = app->userInterface(); + if (!ui) + return false; + + ui->messageBox("Hello script"); + + return true; +} + +#ifdef XI_WIN + +#include + +BOOL APIENTRY DllMain(HMODULE hmodule, DWORD reason, LPVOID reserved) +{ + switch (reason) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +#endif // XI_WIN diff --git a/usr/autodesk/CPP/Default/DEFAULT.dll b/usr/autodesk/CPP/Default/DEFAULT.dll new file mode 100644 index 0000000000000000000000000000000000000000..104c860b7f4c2edd7bfd9d7952738e149c41433f GIT binary patch literal 18288 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 L@cuHL literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Default/DEFAULT.dylib b/usr/autodesk/CPP/Default/DEFAULT.dylib new file mode 100644 index 0000000000000000000000000000000000000000..c6489270a16a04ec2e7e4fde583bb8bbf36f458a GIT binary patch literal 11244 zcmeHNe`p-X6`r%~SaBTdOl{)gs67|U*mZiVvt-APNqe$&&5EeX*^*o1;tqRzE9vU{ z<=s8|WN2!z4G}`ENFfy5mO!D<{83z5S}08sO+aoaRB54@CfG?y%ehX#CD4Eixqjd7 zth9HMOp4?7pL;Mf?|bv+&D*zgH?uSIhdb|mxK@Zrn-Jmwq>V^X2rh{zI3YfXR9z*6 zlq0F*Bc7-+^VJq*3d4k0gT#^~rE67PpZ9U2z4Us&?jI4qBwoF!PH;X9rF7g%##sp!GWQtQ~d+Me@YBOlCmda9un_9a@IzKcFeJC zM>Dd8Tu~d$Wo*Nq(E7^de9ko7T&Wlvu9V9q+tvCiZYgUyrxuvl7b^}GdiHf|edz)1 za5}9G8-;S-aGeVs2CKD5a@4g*n5@kSoOo*LuvAoSw z@qSD6eIEF6loz{%7{_4aoRSUv*B^vS;s>lfbDYi~v{ z(@&;u>z8IbF1`S5eX3obn&c#?PtMg}*C$`mCr{S&sVC>LV9*cTaJ%$Nb@xGiYOOw% zY_HGjlbyd{&80WohxDm7eG2VvKs^18TJ3$$Ugry{{t110uZ?L6b@RXCR8Y&Jn~tx{ zcI--B(dSaL5TSqAIDZw~zf$uNcbz^}dFxht;*DE7^y$j$`t-4%CVrPn%m$rYsqLVv zuvqH^^Ro!p+qIX_{JCrTg;({jo`nCe=+mhh9;cRp{8kKtTU&kU6-wV>x6>&+%3ST5 z&)+7WB|mwi_Ggqc4aE4JytxVT(T-2|3qf4_F<|Wn$h_#L^~rzhQwJHW=wh(u5DFN* z@M^o~*j(+m^?Lok(SIKLGc#SjPoNv3{b=}L~^76lW`8&u5r#ruoqHnm~HH~s+oSxqNI}DCLM(#~=-z4`(a<7rQ zO73lPzae*r+|S8HVd3UW;LzXYdC@k68iB=+Ph`0K`jBt{iR;bx2+ksHM)GQ227`5v zXoE2^hja?bqx$8|Z4U>Fj-3!isKUOMm+MwOUy3>2+K_tGeiVuEW0Z(#hBzW3M_BNi zfZw;r0g^}u@$E+r^+9x@`@^>s$9lo zOVo-$D*~+uv?9=oKq~^R2(%*5ia;v@tq8Ot(277S0{^E7Y}~em+YaIrNh#%6wJLG^ z?Uaf}KIcxzGu`6I>FCU+Bu=`r-hsQ!;LI2YuhWDBQ=hHH6F@ApDv zRt=f4#&SgoU(9iKo!o?{Ip&|HAGMqcj=&++DV0=*fojf$%%h0JF3u{uQWVijPHb)y z^ILFWdM)PH0?n?9Zs^{lpty5={TlGxCtDrJP-17tBW^2^yv;u{6lBRLA|J-QF)@m5 zuSd`R@EBESD2^<+f3Xex_7LVC=tU|jy4-{}pu=$evrQQ4-agnKG9VU1$ikTY&+tGO z^a0wl{{T~eI}*0cJR)ZMFlPG~Rr>>o1ltFg`fML;OA)hu7_&Y1+ek-L`v3>+yZ!0~ z|HGK=xlc#>j%pv^kJ>)iH~W)nAK;)p&u2-*^gqCFLx0C=f6tKh?<>r`L(&@5v7UQ~ zq({KVJkHN(FUw5PR@8qga(*HHClwCjSy4EM&o31Yp7#Ub4X_vZzXqds17yK{mq!#1 z{M)5);NL;u4zv%(W0IJArRs(E1EU%ieH!uc!V{eHF{0qpToYdJonkNkUOIieU~hL* z{pXwTNRz&XZa5YaNc_?EBE^wOx__VC*Be$V3CX|9kN0Lru4v{fSxY;NnJRog zB+SRh|5u&H9t{4is?@33qW^YhoY=~*J_6%y-%mHcSM$jIa^#EAb4exMpx qV2y!WX)Q{vk8Krtug27nKGC@HY+OVt6kdTsw9LAF$%-9w(0>5SEchV+ literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Default/DEFAULT.manifest b/usr/autodesk/CPP/Default/DEFAULT.manifest new file mode 100644 index 0000000..9907a3b --- /dev/null +++ b/usr/autodesk/CPP/Default/DEFAULT.manifest @@ -0,0 +1,10 @@ +{ + "autodeskProduct":"Fusion360", + "type":"script", + "author":"Autodesk Inc.", + "description":{ + "":"This is sample script." + }, + "supportedOS":"windows|mac", + "editEnabled": true +} \ No newline at end of file diff --git a/usr/autodesk/CPP/Default/DEFAULT.vcxproj b/usr/autodesk/CPP/Default/DEFAULT.vcxproj new file mode 100644 index 0000000..48df10c --- /dev/null +++ b/usr/autodesk/CPP/Default/DEFAULT.vcxproj @@ -0,0 +1,107 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {D7CBB035-8CC0-4576-9C72-5076E079586B} + Win32Proj + DEFAULT + + + + DynamicLibrary + true + v110 + Unicode + + + DynamicLibrary + false + v110 + true + Unicode + + + + + + + + + + + + + false + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + false + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;SIMPLE_EXPORTS;%(PreprocessorDefinitions) + ../include + + + Windows + true + ../lib + core.lib;fusion.lib;cam.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /R /Y "$(SolutionDir)$(Configuration)\$(ProjectName).dll" "$(SolutionDir)" + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;SIMPLE_EXPORTS;%(PreprocessorDefinitions) + ../include + + + Windows + true + true + true + ../lib + core.lib;fusion.lib;cam.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /R /Y "$(SolutionDir)$(Configuration)\$(ProjectName).dll" "$(SolutionDir)" + + + + + NotUsing + NotUsing + + + + + true + true + + + + + + \ No newline at end of file diff --git a/usr/autodesk/CPP/Default/DEFAULT.xcodeproj/project.pbxproj b/usr/autodesk/CPP/Default/DEFAULT.xcodeproj/project.pbxproj new file mode 100644 index 0000000..fdf8ba5 --- /dev/null +++ b/usr/autodesk/CPP/Default/DEFAULT.xcodeproj/project.pbxproj @@ -0,0 +1,269 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 2BB196C61AD5940800164CD3 /* DEFAULT.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2BB196C51AD5940800164CD3 /* DEFAULT.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 2BB196BE1AD586AA00164CD3 /* DEFAULT.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = "DEFAULT.dylib"; sourceTree = BUILT_PRODUCTS_DIR; }; + 2BB196C51AD5940800164CD3 /* DEFAULT.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "DEFAULT.cpp"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2BB196BB1AD586AA00164CD3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2BB196B51AD586AA00164CD3 = { + isa = PBXGroup; + children = ( + 2BB196C51AD5940800164CD3 /* DEFAULT.cpp */, + 2BB196BF1AD586AA00164CD3 /* Products */, + ); + sourceTree = ""; + }; + 2BB196BF1AD586AA00164CD3 /* Products */ = { + isa = PBXGroup; + children = ( + 2BB196BE1AD586AA00164CD3 /* DEFAULT.dylib */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 2BB196BC1AD586AA00164CD3 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 2BB196BD1AD586AA00164CD3 /* DEFAULT */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2BB196C21AD586AA00164CD3 /* Build configuration list for PBXNativeTarget "DEFAULT" */; + buildPhases = ( + 2BB196BA1AD586AA00164CD3 /* Sources */, + 2BB196BB1AD586AA00164CD3 /* Frameworks */, + 2BB196BC1AD586AA00164CD3 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "DEFAULT"; + productName = "DEFAULT"; + productReference = 2BB196BE1AD586AA00164CD3 /* DEFAULT.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 2BB196B61AD586AA00164CD3 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0500; + ORGANIZATIONNAME = Autodesk; + }; + buildConfigurationList = 2BB196B91AD586AA00164CD3 /* Build configuration list for PBXProject "DEFAULT" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 2BB196B51AD586AA00164CD3; + productRefGroup = 2BB196BF1AD586AA00164CD3 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 2BB196BD1AD586AA00164CD3 /* DEFAULT */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 2BB196BA1AD586AA00164CD3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2BB196C61AD5940800164CD3 /* DEFAULT.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 2BB196C01AD586AA00164CD3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$SRCROOT/../include", + ); + LIBRARY_SEARCH_PATHS = "$SRCROOT/../lib"; + MACOSX_DEPLOYMENT_TARGET = 11.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 2BB196C11AD586AA00164CD3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$SRCROOT/../include", + ); + LIBRARY_SEARCH_PATHS = "$SRCROOT/../lib"; + MACOSX_DEPLOYMENT_TARGET = 11.0; + SDKROOT = macosx; + }; + name = Release; + }; + 2BB196C31AD586AA00164CD3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(EFFECTIVE_PLATFORM_NAME)"; + EXECUTABLE_EXTENSION = dylib; + EXECUTABLE_PREFIX = ""; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(PYTHONINC)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); + INSTALL_PATH = "$(SRCROOT)"; + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = ""; + OTHER_LDFLAGS = ( + "$SRCROOT/../lib/core.dylib", + "$SRCROOT/../lib/fusion.dylib", + "$SRCROOT/../lib/cam.dylib", + ); + PRELINK_LIBS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SYMROOT = "$(SRCROOT)"; + }; + name = Debug; + }; + 2BB196C41AD586AA00164CD3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(EFFECTIVE_PLATFORM_NAME)"; + EXECUTABLE_EXTENSION = dylib; + EXECUTABLE_PREFIX = ""; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(PYTHONINC)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); + INSTALL_PATH = "$(SRCROOT)"; + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = ""; + OTHER_LDFLAGS = ( + "$SRCROOT/../lib/core.dylib", + "$SRCROOT/../lib/fusion.dylib", + "$SRCROOT/../lib/cam.dylib", + ); + PRELINK_LIBS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SYMROOT = "$(SRCROOT)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2BB196B91AD586AA00164CD3 /* Build configuration list for PBXProject "DEFAULT" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BB196C01AD586AA00164CD3 /* Debug */, + 2BB196C11AD586AA00164CD3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2BB196C21AD586AA00164CD3 /* Build configuration list for PBXNativeTarget "DEFAULT" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BB196C31AD586AA00164CD3 /* Debug */, + 2BB196C41AD586AA00164CD3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 2BB196B61AD586AA00164CD3 /* Project object */; +} diff --git a/usr/autodesk/CPP/DefaultAddIn/DEFAULT.cpp b/usr/autodesk/CPP/DefaultAddIn/DEFAULT.cpp new file mode 100644 index 0000000..27255ac --- /dev/null +++ b/usr/autodesk/CPP/DefaultAddIn/DEFAULT.cpp @@ -0,0 +1,58 @@ + +#include +#include +#include + + +using namespace adsk::core; +using namespace adsk::fusion; +using namespace adsk::cam; + +Ptr app; +Ptr ui; + +extern "C" XI_EXPORT bool run(const char* context) +{ + app = Application::get(); + if (!app) + return false; + + ui = app->userInterface(); + if (!ui) + return false; + + ui->messageBox("Hello addin"); + + return true; +} + +extern "C" XI_EXPORT bool stop(const char* context) +{ + if (ui) + { + ui->messageBox("Stop addin"); + ui = nullptr; + } + + return true; +} + + +#ifdef XI_WIN + +#include + +BOOL APIENTRY DllMain(HMODULE hmodule, DWORD reason, LPVOID reserved) +{ + switch (reason) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +#endif // XI_WIN diff --git a/usr/autodesk/CPP/DefaultAddIn/DEFAULT.dll b/usr/autodesk/CPP/DefaultAddIn/DEFAULT.dll new file mode 100644 index 0000000000000000000000000000000000000000..2be29f2e469eddb20c2c78cf8ae21481d92bb79f GIT binary patch literal 18800 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 z zpNh^JZ@9ugVy``~Z!{}qG@VSQQ@V@F`PioHslpNS+VeicY~;L}NK$sRcitG<)ZR@l zsL9ENdX1HEOg$$Yr`HzQcOr4UyL{$`@b%=ZY|dxrlfF(XZ)ejfUosL;`EuE4i4hF9 z``W@`-zKXsl26#dSgbwe+Z4Jk*wfM79NUwK_X=^b5Q8nSNWVCjbtnTUHJMF9tU{NW zi-e#YpAGsl4tyQT?n^KfIDIziVIjm=&w~#i8vFd# z)#-;@zZbvu6L)M}0iH7lXJa)W@jdEbl%#s301|cStFhn}yfF+B$YvsTexpTfgo!bm?Ka*UYt6) zq<#3Q>Gfo?^+UQfQ0Fwm=3Ym$*f8`aq70M8F}`2i{`%(ZuS56uq@z{Q-|J+uzi;VQ z)nCWRRZF3{`M?_uLtj8!!z~jHmxiXy$48Hdb- zlDW&38TUV5xDNvDBWIc;gHNOJ5o2h_lsTIJmDv!=pBUOPZjSaGM!jdk|4hg~(J}lc zf;GBtys#Z=?4__3m6HqnFMaWtx<jd+?4ON6g{L!Z#2C1P)`cZ+4=o{6A^3^k%z~c8Fkoi?(K^TcWP$J1zP`TZ zh6{(-BEp4lBQHFF%(2}yPdi78#iHtW@{D_&Ug+*swiCAvJ!m#ZmoNScis2Uv9Wajp zZ=aFtcIB?7-0+L8gVQVNMRDaRtfk`0KRfwfo%{_a|GSgF?d0zu?-*VFBNV}|;>z!! z9P5X=n0^%|`>$Z_x2)aE+ViYE%i7bdz0BHAS$mtcM_Fq`bf&O6JRa5q=QJ*`95_XL88v%NaA?~9;D6-0JP}P zN5NT&+9Y+t$hZ!kBj6&Yfd^0;KUUxgf}bE`G#o-5R6O|D;Gn2+T;a?(#0qU6CHfo^ zZ9hYBAJT2CkctP-t2syih_3>JtMW8_(@G@LO_5kEjxA`HozAE_wLXT#vPqRIP%tY26+27UTUGWLc$oR)7l$yM*)W ztxkxd0}%e&!O^^Had#jbp_hRY?)H&00N?&8G&(lJZ*7suS-=OsCarVak zHJ-0N&-h54N?&8G&v_vc(|<2!|6@x3exq9XeJ`dy&lXAFRr(rheRs9Y^zX&g z*XMKvrLVEp?{UqS`q#L&R)|Y*va9c#oUbs?JxQx{yTYGTnCGA*eq(5IYHqfr0<-@Z zGetdU|F|(&n(wbDtmo?mg?0Qt4BsfPFEVF2q+g0F2V5L~wNX@BP+<(AOrScq_i| zyBEFrcp~Q8Y9*{l&MMu=aJe`2e#VO0xhqrYY%-GY4YaP4>(-WJ(n9hT{hmE&ZuZ4f z(L_FG`P%SX==1y(dh5;oA6yrktz6q1w9~n4;yBH}uhkGi!twb6> z^uF$NI)R_scuL8s8!XKOQCqh-7b5Vh@AC`^7bAST{l28rq=n=%Q@wz~IZtWe0=Pt2virmXY# zVqrcWtj3OpyO2aAwG$hbL;|-k)t+X~kVEp`tuv^=`760ga4I@;7d_G7|xuOZ+pvQ qT=tB3{s2(w1Kaw)Ut{_qE#K~!@7xvgZu`M{mp@Ch{w6uUm*QXSjRy+= literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/DefaultAddIn/DEFAULT.manifest b/usr/autodesk/CPP/DefaultAddIn/DEFAULT.manifest new file mode 100644 index 0000000..5861b21 --- /dev/null +++ b/usr/autodesk/CPP/DefaultAddIn/DEFAULT.manifest @@ -0,0 +1,10 @@ +{ + "autodeskProduct":"Fusion360", + "type":"addin", + "author":"Autodesk Inc.", + "description":{ + "":"This is sample script." + }, + "supportedOS":"windows|mac", + "editEnabled": true +} \ No newline at end of file diff --git a/usr/autodesk/CPP/DefaultAddIn/DEFAULT.vcxproj b/usr/autodesk/CPP/DefaultAddIn/DEFAULT.vcxproj new file mode 100644 index 0000000..48df10c --- /dev/null +++ b/usr/autodesk/CPP/DefaultAddIn/DEFAULT.vcxproj @@ -0,0 +1,107 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {D7CBB035-8CC0-4576-9C72-5076E079586B} + Win32Proj + DEFAULT + + + + DynamicLibrary + true + v110 + Unicode + + + DynamicLibrary + false + v110 + true + Unicode + + + + + + + + + + + + + false + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + false + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;SIMPLE_EXPORTS;%(PreprocessorDefinitions) + ../include + + + Windows + true + ../lib + core.lib;fusion.lib;cam.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /R /Y "$(SolutionDir)$(Configuration)\$(ProjectName).dll" "$(SolutionDir)" + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;SIMPLE_EXPORTS;%(PreprocessorDefinitions) + ../include + + + Windows + true + true + true + ../lib + core.lib;fusion.lib;cam.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /R /Y "$(SolutionDir)$(Configuration)\$(ProjectName).dll" "$(SolutionDir)" + + + + + NotUsing + NotUsing + + + + + true + true + + + + + + \ No newline at end of file diff --git a/usr/autodesk/CPP/DefaultAddIn/DEFAULT.xcodeproj/project.pbxproj b/usr/autodesk/CPP/DefaultAddIn/DEFAULT.xcodeproj/project.pbxproj new file mode 100644 index 0000000..17a5465 --- /dev/null +++ b/usr/autodesk/CPP/DefaultAddIn/DEFAULT.xcodeproj/project.pbxproj @@ -0,0 +1,269 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 2BB196C61AD5940800164CD3 /* DEFAULT.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2BB196C51AD5940800164CD3 /* DEFAULT.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 2BB196BE1AD586AA00164CD3 /* DEFAULT.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = DEFAULT.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; + 2BB196C51AD5940800164CD3 /* DEFAULT.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DEFAULT.cpp; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2BB196BB1AD586AA00164CD3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2BB196B51AD586AA00164CD3 = { + isa = PBXGroup; + children = ( + 2BB196C51AD5940800164CD3 /* DEFAULT.cpp */, + 2BB196BF1AD586AA00164CD3 /* Products */, + ); + sourceTree = ""; + }; + 2BB196BF1AD586AA00164CD3 /* Products */ = { + isa = PBXGroup; + children = ( + 2BB196BE1AD586AA00164CD3 /* DEFAULT.dylib */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 2BB196BC1AD586AA00164CD3 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 2BB196BD1AD586AA00164CD3 /* DEFAULT */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2BB196C21AD586AA00164CD3 /* Build configuration list for PBXNativeTarget "DEFAULT" */; + buildPhases = ( + 2BB196BA1AD586AA00164CD3 /* Sources */, + 2BB196BB1AD586AA00164CD3 /* Frameworks */, + 2BB196BC1AD586AA00164CD3 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = DEFAULT; + productName = DEFAULT; + productReference = 2BB196BE1AD586AA00164CD3 /* DEFAULT.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 2BB196B61AD586AA00164CD3 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0500; + ORGANIZATIONNAME = Autodesk; + }; + buildConfigurationList = 2BB196B91AD586AA00164CD3 /* Build configuration list for PBXProject "DEFAULT" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 2BB196B51AD586AA00164CD3; + productRefGroup = 2BB196BF1AD586AA00164CD3 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 2BB196BD1AD586AA00164CD3 /* DEFAULT */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 2BB196BA1AD586AA00164CD3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2BB196C61AD5940800164CD3 /* DEFAULT.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 2BB196C01AD586AA00164CD3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$SRCROOT/../include", + ); + LIBRARY_SEARCH_PATHS = "$SRCROOT/../lib"; + MACOSX_DEPLOYMENT_TARGET = 11.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 2BB196C11AD586AA00164CD3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$SRCROOT/../include", + ); + LIBRARY_SEARCH_PATHS = "$SRCROOT/../lib"; + MACOSX_DEPLOYMENT_TARGET = 11.0; + SDKROOT = macosx; + }; + name = Release; + }; + 2BB196C31AD586AA00164CD3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(EFFECTIVE_PLATFORM_NAME)"; + EXECUTABLE_EXTENSION = dylib; + EXECUTABLE_PREFIX = ""; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(PYTHONINC)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); + INSTALL_PATH = "$(SRCROOT)"; + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = ""; + OTHER_LDFLAGS = ( + "$SRCROOT/../lib/core.dylib", + "$SRCROOT/../lib/fusion.dylib", + "$SRCROOT/../lib/cam.dylib", + ); + PRELINK_LIBS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SYMROOT = "$(SRCROOT)"; + }; + name = Debug; + }; + 2BB196C41AD586AA00164CD3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(EFFECTIVE_PLATFORM_NAME)"; + EXECUTABLE_EXTENSION = dylib; + EXECUTABLE_PREFIX = ""; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(PYTHONINC)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); + INSTALL_PATH = "$(SRCROOT)"; + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = ""; + OTHER_LDFLAGS = ( + "$SRCROOT/../lib/core.dylib", + "$SRCROOT/../lib/fusion.dylib", + "$SRCROOT/../lib/cam.dylib", + ); + PRELINK_LIBS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SYMROOT = "$(SRCROOT)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2BB196B91AD586AA00164CD3 /* Build configuration list for PBXProject "DEFAULT" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BB196C01AD586AA00164CD3 /* Debug */, + 2BB196C11AD586AA00164CD3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2BB196C21AD586AA00164CD3 /* Build configuration list for PBXNativeTarget "DEFAULT" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BB196C31AD586AA00164CD3 /* Debug */, + 2BB196C41AD586AA00164CD3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 2BB196B61AD586AA00164CD3 /* Project object */; +} diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.cpp b/usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.cpp new file mode 100644 index 0000000..6b1bcc3 --- /dev/null +++ b/usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.cpp @@ -0,0 +1,1537 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace adsk::core; +using namespace adsk::fusion; +using namespace adsk::cam; + +namespace { + const double pi = 4.0* atan(1.0); +} + +Ptr _app; +Ptr _ui; +Ptr _des; +Ptr _cgGroups; +Ptr _anchorPt; + +// Global +const std::string _commandId = "CustomGraphicsSample_CPP"; +const std::string _colorEffect_solid_id = "SolidColorEfect"; +const std::string _colorEffect_basicMaterial_id = "BasicMaterialColorEffect"; +const std::string _colorEffect_appearance_id = "AppearanceColorEffect"; +const std::string _colorEffect_vertex_id = "VertexColorEffect"; +const std::string _pointSetImage = "resources/16x16.png"; +const std::string _solidLine_id = "Solid Line"; +const std::string _centerLine_id = "Center Line"; +const std::string _dashedLine_id = "Dashed Line"; +const std::string _dotLine_id = "Dot Line"; +const std::string _phantomLine_id = "Phantom Line"; +const std::string _tracksLine_id = "Tracks Line"; +const std::string _zigZagLine_id = "ZigZag Line"; +int _numTeeth = 5; +double _thickness = 0.5 * 2.54; +double _scaleFactor = 10; // _scaleFactor is used to limit the size of pixel-scaled model + +// Global command inputs +Ptr _customGraphicsObj; +Ptr _colorEffects; +Ptr _red; +Ptr _green; +Ptr _blue; +Ptr _opacity; +Ptr _glossiness; +Ptr _selection; +Ptr _transform; +Ptr _materialLibList; +Ptr _appearanceList; +Ptr _appearanceFilter; +Ptr _coordTable; +Ptr _add; +Ptr _addStrip; +Ptr _delete; +Ptr _isLineStrip; +Ptr _lineStylePattern; +Ptr _lineStyleWeight; +Ptr _lineStyleScale; + +Ptr _viewPlacementGroup; +Ptr _viewCorner; +Ptr _viewScaleGroup; +Ptr _pixelScale; +Ptr _billboardingGroup; +Ptr _billboardingStyle; + +Ptr _text; +Ptr _textSize; +Ptr _textStyle; +Ptr _textFont; + +// Create the command definition. +static Ptr createCommandDefinition() +{ + Ptr commandDefinitions = _ui->commandDefinitions(); + if (!commandDefinitions) + return nullptr; + + // Be fault tolerant in case the command is already added. + Ptr cmDef = commandDefinitions->itemById(_commandId); + if (!cmDef) + { + cmDef = commandDefinitions->addButtonDefinition(_commandId, + "CustomGraphicsSample", + "Custom Graphics Sample"); + } + + return cmDef; +} + +// Add a row representing a coordinate (x, y, z) +static void addRow(Ptr tableInput) +{ + if (!tableInput) + return; + + static size_t rowNumber = 0; + std::stringstream rowId; + rowId << rowNumber; + Ptr tableChildInputs = tableInput->commandInputs(); + Ptr xValueInput = tableChildInputs->addValueInput(tableInput->id() + "_x" + rowId.str(), "Value", "cm", ValueInput::createByReal(static_cast(rowNumber))); + Ptr yValueInput = tableChildInputs->addValueInput(tableInput->id() + "_y" + rowId.str(), "Value", "cm", ValueInput::createByReal(static_cast(rowNumber))); + Ptr zValueInput = tableChildInputs->addValueInput(tableInput->id() + "_z" + rowId.str(), "Value", "cm", ValueInput::createByReal(static_cast(rowNumber))); + + int row = tableInput->rowCount(); + tableInput->addCommandInput(xValueInput, row, 0); + tableInput->addCommandInput(yValueInput, row, 1); + tableInput->addCommandInput(zValueInput, row, 2); + + rowNumber = rowNumber + 1; +} + +static void addLineStrip(Ptr tableInput) +{ + if (!tableInput) + return; + + static size_t stripNumber = 0; + std::stringstream stripId; + stripId << stripNumber; + + Ptr tableChildInputs = tableInput->commandInputs(); + Ptr strInput = tableChildInputs->addStringValueInput(tableInput->id() + "_strip" + stripId.str(), "Line Strip", "-- Line Strip --"); + if (!strInput) + return; + strInput->isReadOnly(true); + + int row = tableInput->rowCount(); + tableInput->addCommandInput(strInput, row, 0, 0, 2); + + stripNumber = stripNumber + 1; +} + +static void replaceItems(Ptr cmdInput, std::vector newItems) +{ + if (!cmdInput) + return; + Ptr listItems = cmdInput->listItems(); + if (!listItems) + return; + listItems->clear(); + Ptr itemNone = listItems->add("None", true); + if (!itemNone) + return; + itemNone->isSelected(true); + + if (newItems.size() > 0) { + for (std::string str : newItems) { + listItems->add(str, false); + } + if (listItems->count() > 1) { + Ptr item1 = listItems->item(1); + Ptr item0 = listItems->item(0); // item "None" + if (!item1 || !item0) + return; + item1->isSelected(true); + item0->deleteMe(); + } + } +} + +static std::vector getAppearancesFromLib(const std::string& libName, const std::string& filterExp) +{ + std::vector appearanceList; + + static std::map> appearanceMap; + if (appearanceMap.find(libName) != appearanceMap.end()) { + appearanceList = appearanceMap[libName]; + } + else { + if (!_app) + return std::vector(); + + // get appearances according to libName + Ptr matLibs = _app->materialLibraries(); + if (!matLibs) + return std::vector(); + Ptr matLib = matLibs->itemByName(libName); + if (!matLib) + return std::vector(); + Ptr appearances = matLib->appearances(); + if (!appearances) + return std::vector(); + + for (int i = 0; i < appearances->count(); ++i) { + if(Ptr appear = appearances->item(i)) + appearanceList.push_back(appear->name()); + } + appearanceMap[libName] = appearanceList; + } + + // apply filter + std::string lowerFilterExp(filterExp); + if (!filterExp.empty()) { + std::transform(filterExp.begin(), filterExp.end(), lowerFilterExp.begin(), ::tolower); + std::vector filteredList; + for (std::string appearanceName : appearanceList) { + std::string lowerName(appearanceName); + std::transform(appearanceName.begin(), appearanceName.end(), lowerName.begin(), ::tolower); + if (lowerName.find(lowerFilterExp) != std::string::npos) { + filteredList.push_back(appearanceName); + } + } + appearanceList = filteredList; + } + + return appearanceList; +} + +static bool hasAppearance(Ptr lib) +{ + if (!lib) + return false; + Ptr appearances = lib->appearances(); + if (!appearances || appearances->count() == 0) + return false; + + return true; +} + +static std::vector getMaterialLibNames() +{ + if (!_app) + return std::vector(); + Ptr libs = _app->materialLibraries(); + if (!libs) + return std::vector(); + + std::vector libNames; + for (int i = 0; i < libs->count(); ++i) { + if (Ptr lib = libs->item(i)) { + if (hasAppearance(lib)) { + libNames.push_back(lib->name()); + } + } + } + return libNames; +} + +static Ptr getAppearance(const std::string& libName, const std::string& appearanceName) +{ + if (appearanceName.empty() || appearanceName == "None" || !_app) + return nullptr; + + if (!_des) + return nullptr; + + Ptr appearances = _des->appearances(); + if (appearances) { + Ptr appearance = appearances->itemByName(appearanceName); + if (appearance) + return appearance; + } + + Ptr libs = _app->materialLibraries(); + if (!libs) + return nullptr; + Ptr lib = libs->itemByName(libName); + if (!lib) + return nullptr; + appearances = lib->appearances(); + if (!appearances) + return nullptr; + Ptr appearance = appearances->itemByName(appearanceName); + return appearance; +} + +static void applyLinesProperties(Ptr cgLines) +{ + if (!cgLines) + return; + if (_lineStylePattern && _lineStylePattern->selectedItem()) { + if (_lineStylePattern->selectedItem()->name() == _solidLine_id) + cgLines->lineStylePattern(continuousLineStylePattern); + else if (_lineStylePattern->selectedItem()->name() == _centerLine_id) + cgLines->lineStylePattern(centerLineStylePattern); + else if (_lineStylePattern->selectedItem()->name() == _dashedLine_id) + cgLines->lineStylePattern(dashedLineStylePattern); + else if (_lineStylePattern->selectedItem()->name() == _dotLine_id) + cgLines->lineStylePattern(dotLineStylePattern); + else if (_lineStylePattern->selectedItem()->name() == _dashedLine_id) + cgLines->lineStylePattern(dashedLineStylePattern); + else if (_lineStylePattern->selectedItem()->name() == _phantomLine_id) + cgLines->lineStylePattern(phantomLineStylePattern); + else if (_lineStylePattern->selectedItem()->name() == _tracksLine_id) + cgLines->lineStylePattern(tracksLineStylePattern); + else if (_lineStylePattern->selectedItem()->name() == _zigZagLine_id) + cgLines->lineStylePattern(zigzagLineStylePattern); + } + + if (_lineStyleWeight) + cgLines->weight(static_cast(_lineStyleWeight->valueOne())); + if (_lineStyleScale) + cgLines->lineStyleScale(static_cast(_lineStyleScale->valueOne())); +} + +static void applyColorEffect(Ptr cgEnt) +{ + if (!_des) + return; + if (!_colorEffects) + return; + + Ptr selected = _colorEffects->selectedItem(); + if (!selected) + return; + + std::string colorEffectName = selected->name(); + Ptr colorEffect = nullptr; + if (colorEffectName == _colorEffect_solid_id) { + int red = 255, green = 0, blue = 0; + if (_red) + red = _red->valueOne(); + if (_green) + green = _green->valueOne(); + if (_blue) + blue = _blue->valueOne(); + + if (Ptr solidColor = Color::create(red, green, blue, 255)) { + colorEffect = CustomGraphicsSolidColorEffect::create(solidColor); + } + } + else if (colorEffectName == _colorEffect_basicMaterial_id) { + Ptr diffuseColor = Color::create(0, 255, 0, 255); + Ptr ambientColor = Color::create(255, 0, 0, 255); + Ptr specularColor = Color::create(0, 0, 255, 255); + Ptr emissiveColor = Color::create(0, 0, 0, 255); + double glossiness = 5.0, opacity = 1.0; + if (_glossiness) + glossiness = _glossiness->valueOne(); + if (_opacity) + opacity = _opacity->valueOne(); + if (diffuseColor && ambientColor && specularColor && emissiveColor) { + colorEffect = CustomGraphicsBasicMaterialColorEffect::create(diffuseColor, ambientColor, specularColor, emissiveColor, glossiness, opacity); + } + } + else if (colorEffectName == _colorEffect_appearance_id) { + if (!_appearanceList || !_materialLibList) + return; + Ptr appearanceSelected = _appearanceList->selectedItem(); + Ptr libSelected = _materialLibList->selectedItem(); + if (!appearanceSelected || !libSelected) + return; + std::string appearanceName = appearanceSelected->name(); + std::string libName = libSelected->name(); + Ptr appearance = getAppearance(libName, appearanceName); + if (appearance) { + Ptr desAppearances = _des->appearances(); + if (!desAppearances) + return; + if (!desAppearances->itemByName(appearanceName)) { + appearance = desAppearances->addByCopy(appearance, appearanceName); + } + colorEffect = CustomGraphicsAppearanceColorEffect::create(appearance); + } + } + else if (colorEffectName == _colorEffect_vertex_id) { + colorEffect = CustomGraphicsVertexColorEffect::create(); + } + + if (colorEffect && cgEnt) + cgEnt->color(colorEffect); +} + +static void getCoordinatesFromTable(Ptr tableInput, std::vector& vecCoords, std::vector& vecStripLen) +{ + vecCoords.clear(); + vecStripLen.clear(); + if (_coordTable) { + int stripLen = 0; + for (int i = 0; i < _coordTable->rowCount(); ++i) { + if (Ptr xValueInput = tableInput->getInputAtPosition(i, 0)) { + Ptr yValueInput = tableInput->getInputAtPosition(i, 1); + Ptr zValueInput = tableInput->getInputAtPosition(i, 2); + if (yValueInput && zValueInput) { + vecCoords.push_back(xValueInput->value()); + vecCoords.push_back(yValueInput->value()); + vecCoords.push_back(zValueInput->value()); + ++stripLen; + } + } + else if (Ptr lineStripInput = tableInput->getInputAtPosition(i, 0)) { + vecStripLen.push_back(stripLen); + stripLen = 0; + } + } + vecStripLen.push_back(stripLen); + } +} + +static void changeColorEffectVisibility(const std::string& strColorEffectName) +{ + if (_red) + _red->isVisible(false); + if (_green) + _green->isVisible(false); + if (_blue) + _blue->isVisible(false); + if (_opacity) + _opacity->isVisible(false); + if (_glossiness) + _glossiness->isVisible(false); + if (_appearanceList) + _appearanceList->isVisible(false); + if (_materialLibList) + _materialLibList->isVisible(false); + if (_appearanceFilter) + _appearanceFilter->isVisible(false); + + if (strColorEffectName == _colorEffect_solid_id) { + if (_red) + _red->isVisible(true); + if (_green) + _green->isVisible(true); + if (_blue) + _blue->isVisible(true); + } + else if (strColorEffectName == _colorEffect_basicMaterial_id) { + if (_opacity) + _opacity->isVisible(true); + if (_glossiness) + _glossiness->isVisible(true); + } + else if (strColorEffectName == _colorEffect_appearance_id) { + if (_appearanceList) + _appearanceList->isVisible(true); + if (_materialLibList) + _materialLibList->isVisible(true); + if (_appearanceFilter) + _appearanceFilter->isVisible(true); + } +} + +static void changeLineStyleInputsVisibility(const std::string& patternName) +{ + if (patternName == _solidLine_id) + _lineStyleScale->isVisible(false); + else + _lineStyleScale->isVisible(true); +} + +static void changeCGObjVisibility(const std::string& strObjName) +{ + if (_colorEffects) { + if (Ptr listItems = _colorEffects->listItems()) { + listItems->clear(); + listItems->add(_colorEffect_solid_id, true); + listItems->add(_colorEffect_basicMaterial_id, false); + listItems->add(_colorEffect_appearance_id, false); + } + _colorEffects->isVisible(false); + } + if (_selection) { + _selection->clearSelection(); + _selection->clearSelectionFilter(); + _selection->setSelectionLimits(0, 0); + _selection->isVisible(false); + _selection->isEnabled(false); + } + if (_text) + _text->isVisible(false); + if (_coordTable) + _coordTable->isVisible(false); + if (_isLineStrip) + _isLineStrip->isVisible(false); + if (_lineStylePattern) + _lineStylePattern->isVisible(false); + if (_lineStyleWeight) + _lineStyleWeight->isVisible(false); + if (_lineStyleScale) + _lineStyleScale->isVisible(false); + + changeColorEffectVisibility("None"); + + _viewPlacementGroup->isVisible(false); + _viewScaleGroup->isVisible(false); + _billboardingGroup->isVisible(false); + + if (strObjName == "Mesh") { + if (_colorEffects) { + _colorEffects->isVisible(true); + if (Ptr listItems = _colorEffects->listItems()) { + listItems->add(_colorEffect_vertex_id, false); + } + changeColorEffectVisibility(_colorEffect_solid_id); + _viewPlacementGroup->isVisible(true); + _viewScaleGroup->isVisible(true); + _billboardingGroup->isVisible(true); + } + } + else if (strObjName == "Lines") { + changeColorEffectVisibility(_colorEffect_solid_id); + _lineStylePattern->isVisible(true); + _lineStyleWeight->isVisible(true); + if (_lineStylePattern->selectedItem()->name() == _solidLine_id) { + _lineStyleScale->isVisible(true); + } + _viewPlacementGroup->isVisible(true); + _viewScaleGroup->isVisible(true); + _billboardingGroup->isVisible(true); + } + else if (strObjName == "Curve") { + if (_selection) { + _selection->isVisible(true); + _selection->isEnabled(true); + _selection->tooltip("select a sketch curve"); + _selection->commandPrompt("select a sketch curve"); + _selection->addSelectionFilter("SketchCurve"); + _selection->setSelectionLimits(1, 1); + changeColorEffectVisibility(_colorEffect_solid_id); + _lineStyleWeight->isVisible(true); + } + _viewPlacementGroup->isVisible(true); + _viewScaleGroup->isVisible(true); + _billboardingGroup->isVisible(true); + } + else if (strObjName == "BRep") { + if (_colorEffects) + _colorEffects->isVisible(true); + if (_selection) { + _selection->isVisible(true); + _selection->isEnabled(true); + _selection->tooltip("select a BRep body"); + _selection->commandPrompt("select a BRep body"); + _selection->addSelectionFilter("Bodies"); + _selection->setSelectionLimits(1, 1); + changeColorEffectVisibility(_colorEffect_solid_id); + } + _viewPlacementGroup->isVisible(true); + _viewScaleGroup->isVisible(true); + _billboardingGroup->isVisible(true); + } + else if (strObjName == "Text") { + if (_text) + _text->isVisible(true); + if (_textSize) + _textSize->isVisible(true); + if (_textStyle) + _textStyle->isVisible(true); + if (_textFont) + _textFont->isVisible(true); + } + else if (strObjName == "PointSet - Custom") { + if (_coordTable) + _coordTable->isVisible(true); + if (_addStrip) + _addStrip->isEnabled(false); + } + else if (strObjName == "Lines - Custom") { + if (_coordTable) + _coordTable->isVisible(true); + if (_isLineStrip) + _isLineStrip->isVisible(true); + if (_addStrip) + _addStrip->isEnabled(true); + changeColorEffectVisibility(_colorEffect_solid_id); + _lineStylePattern->isVisible(true); + _lineStyleWeight->isVisible(true); + if (_lineStylePattern->selectedItem()->name() == _solidLine_id) { + _lineStyleScale->isVisible(true); + } + } +} + +static Ptr rotate2D(double rad, Ptr vec) +{ + if (!vec) + return Vector2D::create(); + double x = vec->x(); + double y = vec->y(); + + double newX = x * cos(rad) - y * sin(rad); + double newY = x * sin(rad) + y * cos(rad); + return Vector2D::create(newX, newY); +} + +static void calculateCoordinates(int numTeeth, + /*out*/std::vector& rPts0, /*out*/std::vector& hPts0,/*out*/std::vector& pPts0,/*out*/std::vector& oPts0, + /*out*/std::vector& rPts1, /*out*/std::vector& hPts1,/*out*/std::vector& pPts1,/*out*/std::vector& oPts1, + /*out*/std::vector& vecCoords, /*out*/std::vector& vecColors) +{ + if (numTeeth < 3) + return; + // holeDia < rootDia < pitchDia < outsideDia + double holeDia = 0.5 * 2.54, diametralPitch = 2 / 2.54; + double pitchDia = _numTeeth / diametralPitch; + double dedendum = 1.157 / diametralPitch; + if (fabs((20 * (pi / 180)) - diametralPitch) < 1e-6) { + double circularPitch = pi / diametralPitch; + if (circularPitch >= 20) + dedendum = 1.25 / diametralPitch; + else + dedendum = (1.2 / diametralPitch) + (.002 * 2.54); + } + double rootDia = pitchDia - (2 * dedendum); + double outsideDia = (_numTeeth + 2) / diametralPitch; + + Ptr vecRootRadi = Vector2D::create(rootDia / 2, 0); + Ptr vecHoleRadi = Vector2D::create(holeDia / 2, 0); + Ptr vecPitchRadi = Vector2D::create(pitchDia / 2, 0); + Ptr vecOutRadi = Vector2D::create(outsideDia / 2, 0); + double unitRadian = pi / numTeeth; + + for (int i = 0; i < 2 * numTeeth; ++i) { + if (Ptr pos = rotate2D(unitRadian * (i - 0.5), vecRootRadi)) { + double x = pos->x(), y = pos->y(); + rPts0.push_back(static_cast(vecCoords.size() / 3)); + rPts1.push_back(static_cast(vecCoords.size() / 3 + 1)); + vecCoords.insert(vecCoords.end(), { x, y, 0, x, y, _thickness }); + vecColors.insert(vecColors.end(), { 255,0,255,128, 255,0,255,128 }); + } + } + for (int i = 0; i < 2 * numTeeth; ++i) { + if (Ptr pos = rotate2D(unitRadian * (i - 0.5), vecHoleRadi)) { + double x = pos->x(), y = pos->y(); + hPts0.push_back(static_cast(vecCoords.size() / 3)); + hPts1.push_back(static_cast(vecCoords.size() / 3 + 1)); + vecCoords.insert(vecCoords.end(), { x, y, 0, x, y, _thickness }); + vecColors.insert(vecColors.end(), { 255,0,0,128, 255,0,0,128 }); + } + } + for (int i = 0; i < 2 * numTeeth; ++i) { + if (Ptr pos = rotate2D(unitRadian * (i - 0.5), vecPitchRadi)) { + double x = pos->x(), y = pos->y(); + pPts0.push_back(static_cast(vecCoords.size() / 3)); + pPts1.push_back(static_cast(vecCoords.size() / 3 + 1)); + vecCoords.insert(vecCoords.end(), { x, y, 0, x, y, _thickness }); + vecColors.insert(vecColors.end(), { 0,0,255,128, 0,0,255,128 }); + } + } + for (int i = 0; i < numTeeth; ++i) { + if (Ptr pos = rotate2D(unitRadian * i * 2, vecOutRadi)) { + double x = pos->x(), y = pos->y(); + oPts0.push_back(static_cast(vecCoords.size() / 3)); + oPts1.push_back(static_cast(vecCoords.size() / 3 + 1)); + vecCoords.insert(vecCoords.end(), { x, y, 0, x, y, _thickness }); + vecColors.insert(vecColors.end(), { 0,255,255,128, 0,255,255,128 }); + } + } +} + +static std::vector calculateStripLen(int numTeeth) +{ + if (numTeeth < 3) + return std::vector(); + + std::vector vecStripLen; + for (int i = 0; i < numTeeth; ++i) + vecStripLen.push_back(6); + for (int i = 0; i < 2*numTeeth; ++i) + vecStripLen.push_back(21); + for (int i = 0; i < numTeeth; ++i) + vecStripLen.push_back(24); + for (int i = 0; i < 2*numTeeth; ++i) + vecStripLen.push_back(6); + return vecStripLen; +} + +static std::vector calculateTriangles(int numTeeth, + std::vector rPts0, std::vector hPts0, std::vector pPts0, std::vector oPts0, + std::vector rPts1, std::vector hPts1, std::vector pPts1, std::vector oPts1) +{ + if (numTeeth < 3) + return std::vector(); + + std::vector vertexIndexList; + // triangles between teeth + for (int i = 0; i < numTeeth; ++i) { + int idx0 = (2 * i + 1) % (2 * numTeeth); + int idx1 = (2 * i + 2) % (2 * numTeeth); + int rPtA0 = rPts0[idx0]; + int rPtB0 = rPts0[idx1]; + int rPtA1 = rPts1[idx0]; + int rPtB1 = rPts1[idx1]; + vertexIndexList.insert(vertexIndexList.end(), { rPtA0,rPtB0,rPtB1, rPtB1,rPtA1,rPtA0 }); + } + + // triangles on surface0 + for (int i = 0; i < numTeeth; ++i) { + int rPtA = rPts0[i * 2]; + int rPtB = rPts0[i * 2 + 1]; + int rPtC = rPts0[(i * 2 + 2) % (2 * numTeeth)]; + int hPtA = hPts0[i * 2]; + int hPtB = hPts0[i * 2 + 1]; + int hPtC = hPts0[(i * 2 + 2) % (2 * numTeeth)]; + int pPtA = pPts0[i * 2]; + int pPtB = pPts0[i * 2 + 1]; + int oPt = oPts0[i]; + vertexIndexList.insert(vertexIndexList.end(), + { hPtB,hPtC,rPtC, rPtC,rPtB,hPtB, + rPtA,rPtB,pPtB, pPtB,pPtA,rPtA, + hPtA,hPtB,rPtB, rPtB,rPtA,hPtA, + pPtA,pPtB,oPt }); + } + + // triangles on surface1 + for (int i = 0; i < numTeeth; ++i) { + int rPtA = rPts1[i * 2]; + int rPtB = rPts1[i * 2 + 1]; + int rPtC = rPts1[(i * 2 + 2) % (2 * numTeeth)]; + int hPtA = hPts1[i * 2]; + int hPtB = hPts1[i * 2 + 1]; + int hPtC = hPts1[(i * 2 + 2) % (2 * numTeeth)]; + int pPtA = pPts1[i * 2]; + int pPtB = pPts1[i * 2 + 1]; + int oPt = oPts1[i]; + vertexIndexList.insert(vertexIndexList.end(), + { hPtC,hPtB,rPtB, rPtB,rPtC,hPtC, + rPtB,rPtA,pPtA, pPtA,pPtB,rPtB, + hPtB,hPtA,rPtA, rPtA,rPtB,hPtB, + pPtB,pPtA,oPt }); + } + + // triangles on teeth + for (int i = 0; i < numTeeth; ++i) { + int rPtA0 = rPts0[i * 2]; + int rPtB0 = rPts0[i * 2 + 1]; + int pPtA0 = pPts0[i * 2]; + int pPtB0 = pPts0[i * 2 + 1]; + int rPtA1 = rPts1[i * 2]; + int rPtB1 = rPts1[i * 2 + 1]; + int pPtA1 = pPts1[i * 2]; + int pPtB1 = pPts1[i * 2 + 1]; + int oPt0 = oPts0[i]; + int oPt1 = oPts1[i]; + vertexIndexList.insert(vertexIndexList.end(), + { rPtA1, rPtA0, pPtA0, pPtA0, pPtA1, rPtA1, + pPtA1, pPtA0, oPt0, oPt0, oPt1, pPtA1, + rPtB0, rPtB1, pPtB1, pPtB1, pPtB0, rPtB0, + pPtB0, pPtB1, oPt1, oPt1, oPt0, pPtB0 }); + } + + // triangles on inner face + for (int i = 0; i < 2 * numTeeth; ++i) { + int hPtA0 = hPts0[i]; + int hPtB0 = hPts0[(i + 1) % (2 * numTeeth)]; + int hPtA1 = hPts1[i]; + int hPtB1 = hPts1[(i + 1) % (2 * numTeeth)]; + vertexIndexList.insert(vertexIndexList.end(), + { hPtA1,hPtB1,hPtB0, hPtB0,hPtA0,hPtA1 }); + } + + return vertexIndexList; +} + +static Ptr drawMesh(const Ptr& cgGroup) +{ + // Calculate mesh coordinates + std::vector rPts0, hPts0, pPts0, oPts0, rPts1, hPts1, pPts1, oPts1; + std::vector vecColors; + std::vector vecCoords; + calculateCoordinates(_numTeeth, rPts0, hPts0, pPts0, oPts0, rPts1, hPts1, pPts1, oPts1, vecCoords, vecColors); + Ptr coordinates = CustomGraphicsCoordinates::create(vecCoords); + if (!coordinates) + return nullptr; + coordinates->colors(vecColors); + + // Calculate mesh triangles + std::vector vertexIndexList = calculateTriangles(_numTeeth, rPts0, hPts0, pPts0, oPts0, rPts1, hPts1, pPts1, oPts1); + // Add Custom Graphics mesh + if (!cgGroup) + return nullptr; + return cgGroup->addMesh(coordinates, vertexIndexList, std::vector(), std::vector()); +} + +static Ptr drawLines(const Ptr& cgGroup) +{ + if (!cgGroup) + return nullptr; + + // Calculate lines coordinates + std::vector rPts0, hPts0, pPts0, oPts0, rPts1, hPts1, pPts1, oPts1; + std::vector vecColors; + std::vector vecCoords; + calculateCoordinates(_numTeeth, rPts0, hPts0, pPts0, oPts0, rPts1, hPts1, pPts1, oPts1, vecCoords, vecColors); + Ptr coordinates = CustomGraphicsCoordinates::create(vecCoords); + if (!coordinates) + return nullptr; + + // Calculate lines triangles + std::vector vertexIndexList = calculateTriangles(_numTeeth, rPts0, hPts0, pPts0, oPts0, rPts1, hPts1, pPts1, oPts1); + + // Calculate lines strip length + std::vector vecStripLen = calculateStripLen(_numTeeth); + + Ptr cgLines = cgGroup->addLines(coordinates, vertexIndexList, true, vecStripLen); + return cgLines; +} + +static Ptr drawPointSet(const Ptr& cgGroup) +{ + if (!cgGroup) + return nullptr; + + // Calculate coordinates + std::vector rPts0, hPts0, pPts0, oPts0, rPts1, hPts1, pPts1, oPts1; + std::vector vecColors; + std::vector vecCoords; + calculateCoordinates(_numTeeth, rPts0, hPts0, pPts0, oPts0, rPts1, hPts1, pPts1, oPts1, vecCoords, vecColors); + Ptr coordinates = CustomGraphicsCoordinates::create(vecCoords); + if (!coordinates) + return nullptr; + + return cgGroup->addPointSet(coordinates, std::vector(), UserDefinedCustomGraphicsPointType, _pointSetImage); +} + +// CommandExecuted event handler. +class OnExecuteEventHandler : public adsk::core::CommandEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + // get selection entity first since it's fragile and any creation/edit operations will clear the selection. + Ptr selEntity = nullptr; + if (_selection && _selection->selectionCount() > 0) { + if (Ptr sel0 = _selection->selection(0)) { + selEntity = sel0->entity(); + } + } + + if (_customGraphicsObj) { + if (!_cgGroups) + return; + Ptr cgGroup = _cgGroups->add(); + if (!cgGroup) + return; + + if (!_anchorPt) + _anchorPt = Point3D::create(); + + Ptr cgEnt = nullptr; + Ptr selectedCGObj = _customGraphicsObj->selectedItem(); + if (!selectedCGObj) + return; + std::string cgObjName = selectedCGObj->name(); + if (cgObjName == "Mesh") { + cgEnt = drawMesh(cgGroup); + _anchorPt->setWithArray({ 0, 0, _thickness / 2 }); + } + else if (cgObjName == "Lines") { + cgEnt = drawLines(cgGroup); + _anchorPt->setWithArray({ 0, 0, _thickness / 2 }); + applyLinesProperties(cgEnt); + } + else if (cgObjName == "PointSet") { + cgEnt = drawPointSet(cgGroup); + } + else if (cgObjName == "BRep") { + if (Ptr body = selEntity->cast()) { + cgEnt = cgGroup->addBRepBody(body); + } + } + else if (cgObjName == "Curve") { + if (Ptr skCurve = selEntity->cast()) { + if (Ptr sk = skCurve->parentSketch()) { + Ptr curv = nullptr; + if (Ptr skArc = skCurve->cast()) + curv = skArc->geometry(); + else if (Ptr skEllipArc = skCurve->cast()) + curv = skEllipArc->geometry(); + else if (Ptr skCircle = skCurve->cast()) + curv = skCircle->geometry(); + else if (Ptr skEllipse = skCurve->cast()) + curv = skEllipse->geometry(); + else if (Ptr skLine = skCurve->cast()) + curv = skLine->geometry(); + else if (Ptr skSpline = skCurve->cast()) + curv = skSpline->geometry(); + + if (curv) { + curv->transformBy(sk->transform()); + Ptr cgCurve = cgGroup->addCurve(curv); + cgEnt = cgCurve; + if (cgCurve) + cgCurve->weight(static_cast(_lineStyleWeight->valueOne())); + } + } + } + } + else if (cgObjName == "Text") { + if (_text) { + std::string font = _textFont ? _textFont->value() : "Arial"; + double size = _textSize ? _textSize->value() : 1.0; + cgEnt = cgGroup->addText(_text->value(), font, size, Matrix3D::create()); + if (!cgEnt) + cgEnt = cgGroup->addText(_text->value(), "Arial", size, Matrix3D::create()); + Ptr cgText = cgEnt; + if (cgText && _textStyle) { + Ptr items = _textStyle->listItems(); + if (items) { + for (size_t i = 0; i < items->count(); ++i) { + Ptr item = items->item(i); + if (!item) + continue; + if (item->name() == "Bold") + cgText->isBold(item->isSelected()); + else if (item->name() == "Italic") + cgText->isItalic(item->isSelected()); + else if (item->name() == "UnderLine") + cgText->isUnderline(item->isSelected()); + else if (item->name() == "StrikeThrough") + cgText->isStrikeThrough(item->isSelected()); + } + } + } + } + } + else if (cgObjName == "PointSet - Custom") { + if (_coordTable) { + std::vector vecCoords; + std::vector vecStripLen; + getCoordinatesFromTable(_coordTable, vecCoords, vecStripLen); + Ptr coordinates = CustomGraphicsCoordinates::create(vecCoords); + cgEnt = cgGroup->addPointSet(coordinates, std::vector(), UserDefinedCustomGraphicsPointType, _pointSetImage); + } + } + else if (cgObjName == "Lines - Custom") { + if (_coordTable) { + std::vector vecCoords; + std::vector vecStripLen; + getCoordinatesFromTable(_coordTable, vecCoords, vecStripLen); + Ptr coordinates = CustomGraphicsCoordinates::create(vecCoords); + bool isLineStrip = true; + if (_isLineStrip) + isLineStrip = _isLineStrip->value(); + cgEnt = cgGroup->addLines(coordinates, std::vector(), isLineStrip, vecStripLen); + applyLinesProperties(cgEnt); + } + } + + // add attributes to the custom graphics entity + if (cgEnt) { + // color effect + if (!cgEnt->cast() && !cgEnt->cast()) // do not apply effect to point set and text node + applyColorEffect(cgEnt); + // transform + Ptr transMat = Matrix3D::create(); + double transformDistance = 1.0; + if (_transform) + transformDistance = _transform->value(); + Ptr origin = Point3D::create(transformDistance, 0, 0); + if (transMat && origin) { + transMat->setWithCoordinateSystem(origin, Vector3D::create(1, 0, 0), Vector3D::create(0, 1, 0), Vector3D::create(0, 0, 1)); + cgEnt->transform(transMat); + } + // calculate _scaleFactor and _anchorPt for viewPlacement, viewScale and billboarding attributes based on the bounding box of custom graphics entity + if (Ptr bbox = cgEnt->boundingBox()) { + Ptr maxPt = bbox->maxPoint(); + Ptr minPt = bbox->minPoint(); + if (maxPt && minPt) { + _scaleFactor = 100 / minPt->distanceTo(maxPt); + _anchorPt->setWithArray({ (minPt->x() + maxPt->x()) / 2, (minPt->y() + maxPt->y()) / 2, (minPt->z() + maxPt->z()) / 2 }); + } + } + // view placement + if (_viewPlacementGroup && _viewPlacementGroup->isVisible() && _viewPlacementGroup->isEnabledCheckBoxChecked() && _viewCorner && _viewCorner->selectedItem()) + { + Ptr viewPt = Point2D::create(100, 100); + // upper left corner by default + ViewCorners corner = ViewCorners::upperLeftViewCorner; + Ptr selected = _viewCorner->selectedItem(); + if (selected->name() == "Upper Right") + corner = ViewCorners::upperRightViewCorner; + else if (selected->name() == "Lower Left") + corner = ViewCorners::lowerLeftViewCorner; + else if (selected->name() == "Lower Right") + corner = ViewCorners::lowerRightViewCorner; + Ptr attr = CustomGraphicsViewPlacement::create(_anchorPt, corner, viewPt); + cgEnt->viewPlacement(attr); + } + // view scale + if (_viewScaleGroup && _viewScaleGroup->isVisible() && _viewScaleGroup->isEnabledCheckBoxChecked() && _pixelScale) + { + Ptr attr = CustomGraphicsViewScale::create(_scaleFactor * _pixelScale->valueOne(), _anchorPt); + cgEnt->viewScale(attr); + } + // billboarding + if (_billboardingGroup && _billboardingGroup->isVisible() && _billboardingGroup->isEnabledCheckBoxChecked() && _billboardingStyle && _billboardingStyle->selectedItem()) + { + // screen style by default + CustomGraphicsBillBoardStyles bbStyle = CustomGraphicsBillBoardStyles::ScreenBillBoardStyle; + Ptr selected = _billboardingStyle->selectedItem(); + if (selected->name() == "Axis") + bbStyle = CustomGraphicsBillBoardStyles::AxialBillBoardStyle; + else if (selected->name() == "Right Reading") + bbStyle = CustomGraphicsBillBoardStyles::RightReadingBillBoardStyle; + Ptr attr = CustomGraphicsBillBoard::create(_anchorPt); + attr->axis(Vector3D::create(0, 1, 0)); + attr->billBoardStyle(bbStyle); + cgEnt->billBoarding(attr); + } + } + } + } +}; + +// InputChange event handler. +class OnInputChangedEventHander : public adsk::core::InputChangedEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + if (!eventArgs) + return; + + Ptr changedInput = eventArgs->input(); + if (!changedInput) + return; + + std::string changedInputId = changedInput->id(); + if (changedInputId == _commandId + "_cgObj") { + if (_customGraphicsObj) { + if (Ptr selectedItem = _customGraphicsObj->selectedItem()) { + changeCGObjVisibility(selectedItem->name()); + } + } + } + else if (changedInputId == _commandId + "_colorEffects") { + if (_colorEffects) { + if (Ptr selectedItem = _colorEffects->selectedItem()) { + changeColorEffectVisibility(selectedItem->name()); + } + } + } + else if (changedInputId == _commandId + "_appearanceFilter" || changedInputId == _commandId + "_materialLib") { + std::string libName(""), filterExp(""); + if (_materialLibList) { + if (Ptr selectedItem = _materialLibList->selectedItem()) { + libName = selectedItem->name(); + } + } + if (_appearanceFilter) { + filterExp = _appearanceFilter->value(); + } + std::vector appearanceNames = getAppearancesFromLib(libName, filterExp); + if (_appearanceList) { + replaceItems(_appearanceList, appearanceNames); + } + } + else if (_coordTable && changedInputId == _coordTable->id() + "_add") { + addRow(_coordTable); + } + else if (_coordTable && changedInputId == _coordTable->id() + "_addStrip") { + addLineStrip(_coordTable); + } + else if (_coordTable && changedInputId == _coordTable->id() + "_delete") { + int selectedRowNo = _coordTable->selectedRow(); + if (selectedRowNo == -1) { + _ui->messageBox("Select one row to delete"); + } + else { + _coordTable->deleteRow(selectedRowNo); + } + } + else if (_lineStylePattern && changedInputId == _commandId + "_LSPattern") { + changeLineStyleInputsVisibility(_lineStylePattern->selectedItem()->name()); + } + } +}; + +// CommandDestroyed event handler +class OnDestroyEventHandler : public adsk::core::CommandEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + adsk::terminate(); + } +}; + +// CommandCreated event handler. +class CommandCreatedEventHandler : public adsk::core::CommandCreatedEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + if (eventArgs) + { + Ptr command = eventArgs->command(); + if (command) + { + Ptr onDestroy = command->destroy(); + if (!onDestroy) + return; + bool isOk = onDestroy->add(&onDestroyHandler_); + if (!isOk) + return; + + Ptr onInputChanged = command->inputChanged(); + if (!onInputChanged) + return; + isOk = onInputChanged->add(&onInputChangedHandler_); + if (!isOk) + return; + + Ptr onExecute = command->execute(); + if (!onExecute) + return; + isOk = onExecute->add(&onExecuteHandler_); + if (!isOk) + return; + + Ptr onExecutePtrview = command->executePreview(); + if (!onExecutePtrview) + return; + isOk = onExecutePtrview->add(&onExecuteHandler_); + if (!isOk) + return; + + Ptr inputs = command->commandInputs(); + if (!inputs) + return; + + // menu for different kinds of custom graphics + _customGraphicsObj = inputs->addDropDownCommandInput(_commandId + "_cgObj", "Custom Graphics Object", DropDownStyles::TextListDropDownStyle); + if (_customGraphicsObj) { + Ptr listItems = _customGraphicsObj->listItems(); + if (listItems) { + listItems->add("Mesh", true); + listItems->add("Lines", false); + listItems->add("PointSet", false); + listItems->add("Curve", false); + listItems->add("BRep", false); + listItems->add("Text", false); + listItems->add("Lines - Custom", false); + listItems->add("PointSet - Custom", false); + } + } + + // coordinates table used by 'Lines - Custom' and 'PointSet - Custom' + _coordTable = inputs->addTableCommandInput(_commandId + "_table", "Coordinates Table", 3, "1:1:1"); + if (_coordTable) { + _coordTable->maximumVisibleRows(10); + addRow(_coordTable); + Ptr addButtonInput = inputs->addBoolValueInput(_coordTable->id() + "_add", "Add", false, "", true); + if (addButtonInput) { + _coordTable->addToolbarCommandInput(addButtonInput); + addButtonInput->isVisible(false); + } + Ptr addStripButtonInput = inputs->addBoolValueInput(_coordTable->id() + "_addStrip", "Add Strip", false, "", true); + if (addStripButtonInput) { + _coordTable->addToolbarCommandInput(addStripButtonInput); + addStripButtonInput->isVisible(false); + } + Ptr deleteButtonInput = inputs->addBoolValueInput(_coordTable->id() + "_delete", "Delete", false, "", true); + if (deleteButtonInput) { + _coordTable->addToolbarCommandInput(deleteButtonInput); + deleteButtonInput->isVisible(false); + } + _coordTable->isVisible(false); + } + + // specific for 'Lines - Custom' + _isLineStrip = inputs->addBoolValueInput(_commandId + "_isLineStrip", "Use LineStrip", true, "", true); + if (_isLineStrip) { + _isLineStrip->isVisible(false); + } + + // color effects for custom graphics Mesh/BRep + _colorEffects = inputs->addDropDownCommandInput(_commandId + "_colorEffects", "Color Effect", DropDownStyles::TextListDropDownStyle); + if (_colorEffects) { + Ptr listItems = _colorEffects->listItems(); + if (listItems) { + listItems->add(_colorEffect_solid_id, true); + listItems->add(_colorEffect_basicMaterial_id, false); + listItems->add(_colorEffect_appearance_id, false); + listItems->add(_colorEffect_vertex_id, false); + } + } + + // RGB for solid colors + _red = inputs->addIntegerSliderCommandInput(_commandId + "_red", "Red", 0, 255); + if (_red) + _red->valueOne(255); + _green = inputs->addIntegerSliderCommandInput(_commandId + "_green", "Green", 0, 255); + if (_green) + _green->valueOne(0); + _blue = inputs->addIntegerSliderCommandInput(_commandId + "_blue", "Blue", 0, 255); + if (_blue) + _blue->valueOne(0); + + // specific for basic material color effect + _glossiness = inputs->addFloatSliderCommandInput(_commandId + "_glossiness", "Glossiness", "", 0, 128); + if (_glossiness) { + _glossiness->valueOne(128); + _glossiness->isVisible(false); + } + _opacity = inputs->addFloatSliderCommandInput(_commandId + "_opacity", "Opacity", "", 0, 1); + if (_opacity) { + _opacity->valueOne(1); + _opacity->isVisible(false); + } + + // for appearance color effect + std::string defaultMatLibName(""); + _materialLibList = inputs->addDropDownCommandInput(_commandId + "_materialLib", "Material Library", DropDownStyles::TextListDropDownStyle); + if (_materialLibList) { + Ptr listItems = _materialLibList->listItems(); + if (listItems) { + std::vector matLibNames = getMaterialLibNames(); + for (std::string libName : matLibNames) { + listItems->add(libName, false); + } + if (listItems->count() > 0) { + Ptr item0 = listItems->item(0); + if (item0) { + item0->isSelected(true); + defaultMatLibName = item0->name(); + } + } + } + _materialLibList->isVisible(false); + } + _appearanceList = inputs->addDropDownCommandInput(_commandId + "_appearanceList", "Appearance", DropDownStyles::TextListDropDownStyle); + if (_appearanceList && !defaultMatLibName.empty()) { + Ptr listItems = _appearanceList->listItems(); + if (listItems) { + std::vector defaultAppearanceList = getAppearancesFromLib(defaultMatLibName, ""); + for (std::string appearanceName : defaultAppearanceList) { + listItems->add(appearanceName, false); + } + if (listItems->count() > 0) { + Ptr item0 = listItems->item(0); + if (item0) { + item0->isSelected(true); + } + } + } + _appearanceList->isVisible(false); + } + _appearanceFilter = inputs->addStringValueInput(_commandId + "_appearanceFilter", "Filter"); + if (_appearanceFilter) { + _appearanceFilter->isVisible(false); + } + + // selection input for custom graphics BRep/Curve + _selection = inputs->addSelectionInput(_commandId + "_sel", "Selection", ""); + if (_selection) { + _selection->setSelectionLimits(0, 1); + _selection->isVisible(false); + _selection->isEnabled(false); + } + + // for custom graphics text + std::string txt = "{standard text}\\P{\\H1.5x;height:1.5x}\\P{\\C1;color:red}\\P{\\H1;height:1 unit}\\P{\\T2;char spacing:2}\\P{\\Q45;obliquing angle:45deg}\\P{\\W2;char width:2x}\\P{\\\\fArial;font:Arial}\\~{\\\\fTimes;font:Times}\\~{\\\\fCalibri;font:Calibri}\\P{\\Ooverline\\o}\\~{\\Lunderline\\l}"; + _text = inputs->addStringValueInput(_commandId + "_text", "Text", txt); + if (_text) + _text->isVisible(false); + _textSize = inputs->addValueInput(_commandId + "_textSize", "Size", "cm", ValueInput::createByReal(1)); + if (_textSize) + _textSize->isVisible(false); + _textStyle = inputs->addButtonRowCommandInput(_commandId + "_textStyle", "Style", true); + if (_textStyle) + { + Ptr items = _textStyle->listItems(); + if (items) + { + items->add("Bold", false, "./resources/text_bold"); + items->add("Italic", false, "./resources/text_italic"); + items->add("UnderLine", false, "./resources/text_underline"); + items->add("StrikeThrough", false, "./resources/text_strikethrough"); + } + _textStyle->isVisible(false); + } + _textFont = inputs->addStringValueInput(_commandId + "_textFont", "Font", "Arial"); + if (_textFont) + _textFont->isVisible(false); + + // transform for all custom graphics entity + if (Ptr transformDistance = adsk::core::ValueInput::createByReal(0)) { + _transform = inputs->addDistanceValueCommandInput(_commandId + "_transform", "Transform", transformDistance); + if (_transform) { + Ptr origin = adsk::core::Point3D::create(0, 0, 0); + Ptr direction = adsk::core::Vector3D::create(1, 0, 0); + if (origin && direction) { + _transform->setManipulator(origin, direction); + } + } + } + + // for custom graphics line style pattern + _lineStylePattern = inputs->addDropDownCommandInput(_commandId + "_LSPattern", "Line Style Pattern", DropDownStyles::TextListDropDownStyle); + if (_lineStylePattern) { + Ptr listItems = _lineStylePattern->listItems(); + if (listItems) { + listItems->add(_solidLine_id, true); + listItems->add(_centerLine_id, false); + listItems->add(_dashedLine_id, false); + listItems->add(_dotLine_id, false); + listItems->add(_phantomLine_id, false); + listItems->add(_tracksLine_id, false); + listItems->add(_zigZagLine_id, false); + } + _lineStylePattern->isVisible(false); + } + + // for line style weight + _lineStyleWeight = inputs->addIntegerSliderCommandInput(_commandId + "_LSWeight", "Line Style Weight", 1, 20); + _lineStyleWeight->valueOne(1); + _lineStyleWeight->isVisible(false); + + // for line style scale + _lineStyleScale = inputs->addIntegerSliderCommandInput(_commandId + "_LSScale", "Line Style Scale", 1, 100); + _lineStyleScale->valueOne(10); + _lineStyleScale->isVisible(false); + + // for view placement attribute + _viewPlacementGroup = inputs->addGroupCommandInput(_commandId + "_VPGroup", "View Placement"); + if (_viewPlacementGroup) + { + _viewPlacementGroup->isEnabledCheckBoxDisplayed(true); + _viewPlacementGroup->isEnabledCheckBoxChecked(false); + if (Ptr childInputs = _viewPlacementGroup->children()) + { + _viewCorner = childInputs->addButtonRowCommandInput(_commandId + "_viewCorner", "corner", false); + if(_viewCorner) + { + if (Ptr listItems = _viewCorner->listItems()) + { + listItems->add("Upper Left", false, "./resources/upperLeft"); + listItems->add("Upper Right", false, "./resources/upperRight"); + listItems->add("Lower Left", false, "./resources/lowerLeft"); + listItems->add("Lower Right", false, "./resources/lowerRight"); + } + } + } + } + + // for view scale attribute + _viewScaleGroup = inputs->addGroupCommandInput(_commandId + "_VSGroup", "View Scale"); + if (_viewScaleGroup) + { + _viewScaleGroup->isEnabledCheckBoxDisplayed(true); + _viewScaleGroup->isEnabledCheckBoxChecked(false); + if (Ptr childInputs = _viewScaleGroup->children()) + { + _pixelScale = childInputs->addFloatSliderCommandInput(_commandId + "_pixelScale", "pixel scale", "", 0.5,5,false); + if (_pixelScale) + { + _pixelScale->valueOne(1); + _pixelScale->setText("Smaller", "Larger"); + } + } + } + + // for billboarding attribute + _billboardingGroup = inputs->addGroupCommandInput(_commandId + "_BBGroup", "Billboarding"); + if (_billboardingGroup) + { + _billboardingGroup->isEnabledCheckBoxDisplayed(true); + _billboardingGroup->isEnabledCheckBoxChecked(false); + if (Ptr childInputs = _billboardingGroup->children()) + { + _billboardingStyle = childInputs->addButtonRowCommandInput(_commandId + "_billboardingStyle", "style", false); + if (_billboardingStyle) + { + if (Ptr listItems = _billboardingStyle->listItems()) + { + listItems->add("Screen", false, "./resources/One"); + listItems->add("Axis", false, "./resources/Two"); + listItems->add("Right Reading", false, "./resources/Three"); + } + } + } + } + // + } + } + } +private: + OnExecuteEventHandler onExecuteHandler_; + OnDestroyEventHandler onDestroyHandler_; + OnInputChangedEventHander onInputChangedHandler_; +} cmdCreated_; + +extern "C" XI_EXPORT bool run(const char* context) +{ + _app = Application::get(); + if (!_app) + return false; + + _ui = _app->userInterface(); + if (!_ui) + return false; + + Ptr doc = _app->activeDocument(); + if (!doc) + return false; + + Ptr prods = doc->products(); + if (!prods) + return false; + + Ptr prod = prods->itemByProductType("DesignProductType"); + if (!prod) + return false; + + _des = prod->cast(); + if (!_des) + return false; + + // get the entry for custom graphics + Ptr activeProd = _app->activeProduct(); + if (!activeProd) + return false; + + Ptr cam = activeProd->cast(); + if (cam) { + _cgGroups = cam->customGraphicsGroups(); + } + else { + Ptr rootComp = _des->rootComponent(); + if (!rootComp) + return false; + _cgGroups = rootComp->customGraphicsGroups(); + } + if (!_cgGroups) + return false; + + Ptr command = createCommandDefinition(); + if (!command) + return false; + + Ptr commandCreatedEvent = command->commandCreated(); + if (!commandCreatedEvent) + return false; + commandCreatedEvent->add(&cmdCreated_); + command->execute(); + + // prevent this module from being terminate when the script returns, because we are waiting for event handlers to fire + adsk::autoTerminate(false); + + return true; +} + +#ifdef XI_WIN + +#include + +BOOL APIENTRY DllMain(HMODULE hmodule, DWORD reason, LPVOID reserved) +{ + switch (reason) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +#endif // XI_WIN diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.dll b/usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.dll new file mode 100644 index 0000000000000000000000000000000000000000..38ffe066ea054b52ab4e4531a839dbea4ac05c21 GIT binary patch literal 152944 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özXKKWR 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 literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.dylib b/usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.dylib new file mode 100644 index 0000000000000000000000000000000000000000..3ecf3cbeb5826151e610c891f0f5bdd6a22fd8a2 GIT binary patch literal 709728 zcmeEv4R~eK)&Cvbimy&aO+`_u`bax!GHPB?4H*ma4UDR_D!IyyW!b z7ssqM>>XuxR!uUMQPiWN7-f+?`po~#-n^#y3!3LIQhmI?&mL{|su?K!$2!82|8EU^ zC!cV_y!kCB%x_*YZ^?1T7vtOXShKgq3^T#{ID2`^D$SdB!f6W^=L1-5uks?Z_v6S2 z>*M0LroF{W7M-&2xhESdZ9h~dD1w0r=G^7p0Z@#NvAJ7VGVrM*IFL@JZHVo z-bMwsSe!TS#N(D6muD8|qb{;n6&YlG9pm`4Q%^l@p|@CUuj$5UoD@v{LVN{mnV2{4 z_{I5EWzGEd|IF+)7c^X(J&wB+{>_^==b%FmnZ5r(M?^?_%ub>@qEWqZ2dgs=1zjXI zL%kFKDq=pRlM>U9Ts(i#;^|9HKXv+{^G{#0=(L5?4_~rq{&A-+o?gG`v~SEmVaej@ zv+56;zIf3I)Au`V(fnA8%>C-?ryqXYsm%-KFP^^N>5G?~cIttPj%#i@<%Gq?oshZf ziDxZ1<#=?i|F%ygTB}(Ce)^dL?MCiK```x>H~O1oq5^}r?BQgh4uhY=jy|+KolJaZ z>qMgJ(hUEMa?xk9r>{xz}H;bbmK$<|32&Mk&R73>+p{liFML?j{i^8Eowe)NmCrXhJzL^ znZM|y<4%}Aqk3FG-e>y*PG5Y=X$vQ?@;=+|H*4+$je(TynGcUYvBBptP%utTU%Y5K z^2UEBOq;grj0iRLYYO!fPac#jKKd35jZlHej&ANRe37CbS#xwI_A#)3~pSP z-B*6>y_2`wKap5Neh6;J*Csz^9qq4JNBh0j(f*E|*WUlu>uA6AI@-TowRZb^tpoov z>u7(-j%&An$2!_yv5xjvtfT$3b+kWw9qo@DwYmeX7>uCSt zI`F@}uJN(`+WUWI9ql(+NB`>@-+QgY|0~wj|2pt*@<|+GtY!Ycz2TbvpSx-hhbmY? zdQ#!i?o>Kg_TGE%xhXj7Oog?Ze;*Apy<**olduskd(?AXZ@>2*6kfd~nQ*&9xqH&& zpc29rv+qiboCQ^Cr5{VBXLqINE_dI8`p9CjYjbSVs1BBPpu+?@Or=-2&2WkZlh;Fx zKFM`&74+HR7FeGF+t)#PT%Sqnvm@VUE&F^AhmSCN5ZkOWl{WM__OA8075mJn>P|(u zEm#eS+-z5oeS8{ziACpD&OV=~l_O`taNL(_@VL#TXfPc(ZzUDxTIgSDm3M%-n%g zdhQU)gQ?7H(qa5__&17wW2u#OI#2{ftYC2^|BndG9ZaPkh5bR;Po={F`f}yRHei?i zahI8##F<`-Q<*F!?˟K=v%=D7wk~pu9(A7@4 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

XVk*c86@r_ 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Έz z#Hk<6DSER%`8LOT4wtLOdJbb*giyS|fuyU)`d@g8#`+<~`p&-USTB#;{-iqA%i~)g z#>mW7>s3Sc`d@x9zP!|iqh}a!Nn%yP?Dt7=85EC4&qFZ4a|tlkzaQ2gvkyOw^ZKvl zZRoL{sK)w#t=2^t>tDr0Z#%3GFrTNwr~5z@V?DjHA(%i2V?95~v0lN@JIP_`85cfI zWBrKutt?NB^^f|N#`?J`)o4IeQ+h!bj46Im025qdSUi)bvBVe#VuwvSOc)+3w&%1w ziw5hA^^O`XIK2SmpfLgLd>a$M-~?tf#9o))V=^?7aziB}a8Ht^tH)!yvI3 zi`9Z>U<`!F1QXfAU=3LK4$LG1GN9l%D6C>hqL3H{%z(z4wr@||yPPqx~6KD4y;N_O7X^K-GS@4@xosCBvsFf=jMXG(yIO;jpC#b!!?ip>m zni8OwXo^t&^wVWMkiaW?u&12!;RN*3ObO6SGi6YlHbp&zwmt~R{4N2y2c`sQy-f++ zrgd1P0Nqhj0?Y|mJpyEHxf#&%vml|HM1h!;v6}!RT~h+&Wy=&GFPjn|FPkEi^-?YC zg#=zPZLb1+P*VbQtV|iCmx+>If`D;*5+L)M5}<2oN?^TI%@IHorUdY9y$CP>k(&W? z8rDmX_0n%Q0Y+w~1TfAqML4>xw|eWAR_lPY?Bh>iTmM=n%xyg%OKm;#YfD?tP|dcU z65ZBQXiHn~oF3YGh6=WSdPHB3Npi~`zPh4i4j)5XPcbcR{T@Ux`|>`v^>nL7Y|IYm z|BY$`(bm5Ttk$-kRd4ps-(Xv>wyV{Z%~+Ii$8 zwW9O-lBt-O%q4}&LCh#n%Vw?^GQ%3-m#;?fuX~TaWD68EcRshK@Tb#A;X+;w##OWp^*Vv4i0| z5gu9b>cO z?wk8_7m=j8h$rG96p{yO>HYM3a@8h1@zp1) z1gM)$3DEAFB9vQtNCfOF-PFDd2WdR7t$v;t2n@SFj0WNgdLb&E_Vb{z3r z1n=|kHVX}qlLz$wM%Aw9d|U-Tt=$XNm1lm1 z-3vMv-HXrh>!jOyPDO3}<9EyEaV}Q|nww=*q8NLVmAz@Uuz3_eyYqYGf41a*#s104 zu7GoBrW@pEPkvWXRh#kNFRM-COR~p58WR|Uh)r8Fl($fn(B_oAv=sivMx?3F6VtR7xLYI zQT!G3SqRGh7{v@g_^sS`y_IilyFcxi=gEAW@7U=492f=iz%885zvD|yFJ~Wp{#5oE zmXWsi<>yEJs^=jex0y}x>30L<=gIyFp0llpwm*J;-l;B+ou|<=EGU1(DC7PQoyW8J zLcxjOBi!EeWIrbftbVATeq9dNe!dW@3!W*y@%<@_o7(PM_%^=a2KT4zeK|iYUZi9A z^7|Hw`$bOs)JL(})qyvmIz4~t(9k7#-aC!EL8oyyXz8xdUAQZB7w!thFWxl|oZl6H zdS|>FwP1s7!%lWB>ufV-Bo&{av|B_-nU5m>ZFY*)g^ z(=%Q=QJLI3QPg`NVWr2g<-4^p(e}|V;Jczm%LN1}xEuFfuL%>Bt9^KrN-`^LUo6dn z10s7Xg0DUj?ocDnu)hTJp?7Dzg7a%A9nCsloZmYNH_FMbfm`!F%4b&g-2ihs#AW@o zPi>#)7aEGM-U%x%_}!UaE)nVF6Rd>e`jntn1ssYl#(%t}7MRm?OKJj437QgMTc{}k zwuO?48~u!3eEAkaQWKTbMZr=?ZuJ4XnW|Mp)dg{#9~?CRP zhFkHQm|N7A?Tm37x*C)0$4gR_ni{q9xTrcl>Mr-{;USfn$-VoF46|PurrOLf`;}q# z=NZOY8Jb0jKo?<1T?Ax;mS(-&WnfFzy#G`hVwv5r%h1I!6};pZz%wk~v8XOW+r_r! z4k5!JTL|*be1jh|JMHh81)?n!iY&m)!)LI@6vln*jl0P1DPtK)KHXDp=^{hz%XTA_ zI?QPw>3ncN0x#^+CrkwxlbRA>GR%}gJ;YuF%6o`GzzXFg?jpDJjiI$Qy9wMwTsKG1 z+7-v^Likfk<#1qExEytv*YI8;IY!u%bG?CQ@JwR^o<3g{r&Kf;+w zhKtnhLWO;jEL$kk-0j}121db*(?60Jy)wI$;(hq08T%+O^qKZu!-9P-TH&O@pxLM4 zhzn9$@5kJC!^GY2z0=MswII+Kz?uwA_uu*UUp6~GuhNE(ZGQtV*^Tc&X9nYI`D@s$ z=TO#zRTR93WOg5Xh-&n1JStHK^jLJHzJF)FPT{i?;1lVmu}H{v4L)ZNg|uq)mVzC; zfAwT}uQvHnhoTWx2x;fYUC}V2Xp>58?1OQwy$p*P1!~mHF~hiF58;^88WNysjR`~m znQ0HBdei?za!{CxI3*1^;~Hi9g6RW&efTpWA2^xmiB)PFGZuK`NAQ(8cBV?o_KzTw zAyl1d%%1kQ&3+(#W@kPW3P>AFboOS5%=LKi!BWgv5sB1BLoj`WS19JJPAO)BRFaB` zkuoVP2#Fa5YR1f2!<=EBa7@KWfD|*zBtzqj{5NK#nBgK$$c1!H>U4%;=#sq+S7u2k zxneGUuoOchu+u&Tt2kIHp!4Kw24OdNEdIi|J66x?ebT|YD z3VI9#fp;=^)#x!)$@_!L*>>ra%Wu);Qn+9@0s4`RKF|n`Y^kTDM##21$QRMku0|)5 z^IQf|j3bu#bla73dobOeT)4eNsd*4(rrRFP=pA>jTblLg10C;s)8QU)u)xPbU^RN6 z16>TU*`+AYMTHpx{TUtN=OP0r7Dr|n=m8G&3c6kX*rNmeAsw!Og9Ck9f$r}>Lv)*e zb4jh?O^>ES_gnMy))eS|4%ADxzxl1wz&Hdtaz8k{w>y8+r~>sm(D&%}#~TFtA|1{z z0zFEBPEw%ArlnCA4NTI_L)f^9GSne+lbV<~5|R}92x8ivDHt+gPRefmh5^Fi?O1}x zw>!L@gDW5_UbI>@35c&l#n8of<28aB_gZB4eLMX$#7gSkesM7S*8gHd+o1pK6sRCC zdW?1U3p%FTZtg|u-txz}N_Mg6r`v7>w;J6<(H9hMr`heha=Vdk&n?_ewA({&;TzKd zRyx7VDsBua>5Yn@PO2LHl)?KE17De}WlZ>IpFut?veloN)JvnP==zeH&A*Ek6FDNkh&_ozBQAbM*C{PoipL-U(m*#5>`;Az9OizN%-Y zqo|&lz-$77gKv4u{`~%`p6N6D4CQfm3S=+?wO6I@qx<`Dd3&3~Dugl&g|s&;i(4|VzXF|=I$H~hngJr|n|n^}3w8ahr*8FAxRw_&hP%l~lp**gn6bKNY@F+-tR7pmy?2rOf&Z269 zxYln<5Z4Aw5lTbFXk5wDj>jU&V@~pjLZpIrtGqG08IJcDo%gq2g zALkEejNFW5onBgvj*ypWiGaLJKwdUw!-}-m6rrq_N?9)?Ahcqyf)?W^2pzGTL3$Z1 z=_Ls0vnK&EuPH&Rg_rd*V0Qu5q)Z7wSuX-KVsbOY!BjY}99FC|LA#~fn%xLTuiaR^ z^%-fo#=@9Qo`UuvdIA%M?~Sz^K9<&Qm|t7gZWyYV!_)`!+6{%atlc=LhqW6Od>e^| zIzVypN=^9cik3Ni3~M(O)3SCmfCy%9f3BKHR-rhr9bRxoiTEF9_e%A2w&mVj-yyr` zV_;^V75^){(OBHCv(&gy}EH`2+X-DUo=D|byC^r z$3jy$;Hj8_dmv`-ySUV!YiM4j^JF-1JcG$RzJ3;7%1z@bWPTE-UZAO^hiddc$k_*P zY8vJKcT7d@{!qIA3Eiv9_)pnCllk9HG#_AM9)5~$h528grp=r&%o^qh zho2PsRJo$_!*e(aNb8tB{Vo(3z zQb2Yu>HP@ysOQZ#Q<6QCKGSVC;NZyY^%p6H{Z8Qm-=1zhn_nllKCFp}nN7tkT_hwe z)_%dv5AC(RtPzem>X3lA;bR3j_z1@hgfj?uB0=`nOO!&LPJq)xxOYE3n7t5R6e;v6 z1$7F@hLu8|8jz=uDarnVKGSU{Fol;#N@1^4*g?~ubn~7cD~0PyOij$V)+6hr+!ioU zy=L|qwix;e$4p_DJT(>-ZKlxM)ob%&=vapApWmny&XI*)wpj{R*6!YRs@xF9h7c^3h-bv02?;*|; zDPgsvRMy}A*Q_tz!8eYoPEr1EuP^R_2&{HXMuR$UcmKgZ!~H)u^BoPwxZVA8bpO2E zw|)8q#NmaQO)iFDy@&&%do>)Y(dCTpQ_9XiV+lyNeMru4r}HDq&i@K$bbgtF=jaWc z|M{O(Y(9z{)CUS?i49ShhypWPyE4=_Pj`JYeLP~8po|pN?8#Eew%60)Th-F2@r8Qn z+wfAvY>Lizo-BoXhwG_V!NK*^6r^Zy>@iFbj#*Dh0B$S6+g(rX z(Ni=Ifc!DW>Prc}5|-x3O6qnwn7y;EJWl`MQb6`nsqV#i%=0)?lD&^U(`{#WL6_I< zQwlT9P&B3(w{-I-_*Kz!B!vYz$9qPQPK#-K*Uu1Visoi~u z?oW~Xw(X4O*Pd3Yh%R}9;xhn;YIIk{r|dj#=Tqg}N#}Qzou3ZpYIGOySFc4wUr9Uv z;(OFwUJ-Gz40`867@KZEomBSX4~2^8JFai8!%9Z>p_@w;N~nlFL5GjPp{P5*hGJKZ z?u?g0@$aVd&u=+8+#Bhz=}0Nu6$*DJhkF&B?{t^a)M|L&AJgG@I27-Dxx#I7xO3=y z!Upkt3?1%Sj_2bPu7k>XuPjG9C%;=(4kq%c9Ir+;M4?|pCma-NC>jchmc z)?Q1WMu(j{jx-~C74kFAj^hbi>9&W``Md{~!eL62+4XojyZ{cKKR%$C-hx1@ztEIS z=l532G3|Fuw-9hxh@eg?o0$tS{e-7-X6_8Z?>nya#-P@V>F~FeQcO=&On>Q^R_XlV z2OJ&l&*|_{I251b>oHS!v%?M2`GO6?J%SDwmc#wM-uDZKTcPul9q0Stxq=QGT(UJ( z!{zqs1~OlUH$rJYxf9FC_sDrG>L2y1<^D9fClXMNzDxJ_xHg}2UAF=jr<|V2RxD|d z%nqx?i+Fb1D!vH|_dIcv@31rL}edkng+vdDH zr7oXx3IeJYAh@08ygKU+CXbFmMFM`^=DZ6Mp3Vb`B$Ggr*BoQPZJYDXAyA&=AYj=7 z1h>b+R}_p*1@U_F|hxQSCjWEZVq zm=b#aFE@2$cl~jxssG3%+lY&(hCWxW6w%%@`eX;DgdPod>FU=1!QPGrHL|+lLVNZH zh+5O$4(4{_ZaIJNW<(ha7?{^W3z3}#6Q?4+q4j+fykyV%QN9p+cSZJ{43KU+iEbxs z5a<>xu4E4>0$q0@Q}_-C`YzqR+tiQyO$b zLqy0IalDoTs}Z?*EvID>2X(}n-3aCR>nYN?MH~qT?a_3v*K%4Haaz|^60L7k5h!nL zf&i`FBwovDS;Rp+x-6VfUf-Y;Buh}NTWQKZ@#zuyB2McO4qnS?S;WC0cu?;Ul$UfS zlsp~oQ6zbflRWBJ39#mCO3-@BgOfa7N^%fTaS#FK{7nhaGcrXeCz(=^WP{HdX|}J| z!LeA<2_Jipzf|f-bsC?RPgz~2!!z&6skie&3v{ymvA`T3d>}Jr? z#V7*h?Q0M)V^4zCMI1~5*iGQ2i+OVdShO@HK;zCBVa3Z4Talah;}=VQ3wGO!DgFG0W-dlIxR z;~0&xT0*w<_)^Oh#)FTb!!y2DYO_0E z%ZmIQ#sm9t=zQl5!rg?a`|SSZaG$+^;hy4fD|G%0jEsv0AiVD|9lrJ5()(%(H-vDj z`_Zyj($0U!OPdYB6hAqP0{rCzHDgL}yN@;~=lTJ>ugLWz@QP&#^~nNZtpRq{Ece>^BIImrV)KQ!+&;>!qWt7ZMQaNikdMOmByUQ9o{|L!td}lx1h7ajB|unO=Haje8R&VFMRTu(^%C;SoZgZj z7%^{3fc~T@!qE+Z)mtBzG#$8-z56a~2!6tZp(e%JJ|9aB0rP81L%<^3YzQdP4FQF= zGz8A+p&?Mg_u77_0~8lm`{AoATITREGz1jW(h$&kI$Jo44T0Q3LvX$ug5SqdM)rz< z(r6=8%#WwT&)`r@@ZF3cxQ~$fhTSin&)gu~UFmRjIovf0_XDczAGKY+^O0O3Dth)K z{H!Rs`ntcijqo%fFG_W=C!cW!65RI8*)n4sD)bvpMP^ROms# zuW#mz!l53)uX*NdRw)lNXC!W8=4^)PJd-s+;!{53p*u2j#^4Ak_)X26J^siosBm>Q zs4HBZ7uvig{lDML*)+70{r;J(a2dJ$?7YzPzAM(6vJbwfG!+sm-0x#)C+m7isVAI_ zv%-A~m7H!nMCVs;5bhu7uryW*_e_O*v%|fE&Oby;-`?|%=&%llqJn>b!qpJ2ZO#po zY@9{IUgiz6AoUHM^&U`|ljtH79YRvL9Lmf-Qvw`KZb}e; z1^fH@$vAu`es&lH*kDQ9uxo>I(Y2j&#VI@rTpu9d98^J_F~QqN!31GMRNe4+8VlIh zsC}8@d&k93_lO_h_)2`j#I^~1JR~;KbhZYy>(1ZEFnBeCebQY>yfSR}yT&tP8L?TFlz0!UPD+`X0ND+szP|k428{u(K3} z@qnmkLY^a0Nh%6^Ipr3vdCaepoN|C!yUjS9C>%AH*N2J)79H2et6{UYWi-d z8~aA_zo;et7c($Y#w4ZN#;-@_{vPTFWPV-?p63@A^8AvyaACMEpbHnrZOyNv}~Sn4*o{z@{8FZ}uJG}t$^)lsX%Cxi_f zE67)I`ZfGtedfbhZnoY3+lc*n=iUsnrc3h3<2F7#GPx9#r)LY6CXh9I2uY3Q8})?l z$AdW_;}F+(V-0>n69GkbQLR++oy~c=O?>gi7lWmZ|Dp6pH(K0CI%^ieA$o z2kyOshTk2iv`=0Fpc1P0%U7z1<`=kOr+s}u{Af`A1K?|I!V#U&1gfo$)l*NAHtzoK z(8dRz!#X6I$kl<>oCTIgSVn=B^`O5LbRvHCTrjH9>vQk8Asvs@-Y+Rx>A~^le0iGg zQ5a}SZ(J_X7$9g*9GH30A@e|<*wBi7J)&t^QL@mxj7KQ26tc`KGK*-h}3 zE0+B1S${~y{&^nifF9cwD}yIwOWL|Lv!x;%?zpRGrUb~ArUX*#IvE=(R#s5RmXIA3 zYrCihIZ%yEu;PZ_9jH_WSs3{%Ldur%oGPNomZFp`^%M=tV}LfrJ`sgQOMoTCzDSF9 z(p>f?WIZT$G*=N99<5QbveTi!T%+V?*9=jk&&|Cb&||wswN)ZbY53mMs7#tsEXl<2 z0=8%tKnvn;E|sV z5${-ixaG^|-#I#4a<7nFwPdogv;U%y9EqQXzGyljm3re;;tg0y1r5qURPt5n)8J0# zlsSUd`^&bT04??5UEPz|DBb~!Wa#@KqA{)@bvk9cU`p%+;yiya5M)NqhRFrA3DK-M z0`G%FZ)r}}XK9#h@ToYwngoxV z@kLn0ZI5JQx-C|){9d+k=q9`L5;Uwy!yoLNF0A16R^oHIRv!V`_@4e=(Y$nPU+CI@ zeJ~(qs8dT}|CJS02>ZHH*h}%edJ=*#yQ>4-7^loPTnruSyrM$q$3F^dfj3Km?U2Z6KBX0usC4Kpf#Be1j=VEgMbwa z5MZ|7lmLrKrU>OV8A`#&6>xTY|KFTMZRDx$(Q6|Cssd927;`&H0xTh!5?~3*6rsG* zu>J$)nviM|NcEV#3b24;N`M6vQwFUxtRYZ7VHX4p+LHjgOic;UsG1UZrD4Pz0al7k z37{j!D2W8AZ&$;hj9$=zmd{8O24!YW3&Is&kthsy#Ke(iQLlZCAxkw?IzuMr((E=T zDivTul&G2jje#ivPD(XJD6jEl(qg&-C^Sog`AH#C0rC^4iIATN$WNvW((Ez<<(drw zmMlO3y9iSPOc0wAShJZq0_f6|0AU#;OpXiE5a)iyp(cQ7i>SH)T_;lljMz;Py03iV z`)QR1}CV6CvHqE0>|%D!t(9U_rE|0O3}s znkbmbXg#y0RY_E9q%iFwCRJ()(TIzvOKMFD#>N`y+1EqidPRk)YxO#ujgm%Urum^L zgYps$=p~UT?8Gp0SP-sp%B@;P?9+g1*Urdb;v2SZ>VDHfOakFV>d-~ToCvFEEkGCV zo^TK@`FDTfj3Y~N^nQL0HDWlWoUZnZPC6V0tC#={*FZJ)DC}8-)!#+78n+ChRjoE>oHv-PV1+y`; z0J=gVIXiK+Fu{g~5TKZ#@X~kOSR^C?&VsLH^OwvgwIf~!e?|OyCVl`+IYW`Pe&s0x zDs%S8Fr*itcUxQLQ(Rv%Ul2?_;#wwVxMIQ-DsZk~BeUC0R1(ZVa7}z}uOh1x9J(dx z=@!KyRa8*vYYjXA#~ZfPK%Ha-WJ6%T(x09 zw}FvBSrIr&DBbqCXhEV7YcsJ{ft04pb~6=arVK1Aa)!#pHymA7PSgg{NP5u9Rb7v1 zqYJUguGpLR^U}r|dqQbl{5LfD5gE+>GN?D8;FuD`Llc!`*945utH3I73OH5n_e>*W z7l%-iz;fLJJS`L!>-p)DwlkT6mwdS{c%O#%X?ULj&H!hDv*Fz8IXusS7nbx=2FJ$` zq^T0%gGY5}s}69bojnh69a{4NuE2zcxUxK1!fUj)Ipw?y&0_Cku5HN2~0<1z0>Z zC1^1|D)(1L5W_-?B&bCP6hMon1kj=>gL2R?0_8a<2-spz0@Q$}1Q^qp5;zA9nj?Ug zO$pG5F-9<7C8V3r7*&6zgI;ilryv{w8!mqc2cJe0_OeI9OeHl@Dw~!NEmNhqfaWa- zAMEJb`zw-p@l<)hb>$=?~_jhst;3ya)mLVm#6)JBCC@?Rv%G_+jBS*rXSNS2$W~_AfVp@1jyW`1gJht z37pj{<_M6vO$jU<`G@a7#Kz?oAPp&)6EnZ2ZeCPf5Z4z>3F7*qDMDEjeG*>l1r(Yf zffr^9kqXdIm=eHt(3C+{XAc79Rc8>eWKRM#1f~QS^Oz!(t4>Nmk`2WMkkB)8*Q?8v zAU|ZO)+4uCuiOl1NlX#SEoGOImv#V(B$Hr0rx3nx4)vTV0qQwZ2Gw)x-*0~WAYh9< z2~f|O5+Ey>5`=oroIwKWIa2~?7{Z|m0eVSt3lR3=)YjEUu8qsh;L~j|>$XQS>l1P_ z#PzBvLOBnt@m1&;2x=>ULN6qsmsth8y;t2WBT$|df`BOt5WsN5lmML_Q-pF>pcE*; zkUF1+Grns6guc}g)9Z?4eM(uX;bb(bq>5cGqP9lU%x)KBUJ`Yzh{~g);50#}$sRgk zPy>R0tKTC%*`OoNro6WU2GR7i`f0Of@XTtPfQ5`rJW!i2t87}tlVet=6fC}1Hr=!{ z?d*OpB*%><#r-;%s`wOc(%IxJ-J(T2=d-1J25XPsWAM$DceWbN_(FHo9{b;NT!5Gk=sABnN zOiZ00;;SBNvf_f$|;Z&r0 z2Uj!RHQpTk48uA5@GGIrq~TbWmN$G7x(*r%&e;}xdVTZKzds6Js=SbqVmYsE1!MJO ze6w~Q!(u*wjc%J$*2!o-q3NFe;=wTEslc zJj{PEMKMRf^`nBCD3n>b)fVhVit{MRQ9k3pA1Q_6$62zODFIrPvB7tADZjJzJxPFnq zlU;e(Fy~c})FaFQa+9EJ;pNEpA!jioWgj5pf$)T!#cY$k`FK3Tf{z{Deb>;~Q}+zX z?KN_1tkB=r5Rm4fN8NYO&z1YQp^kW5XZJh%(AJVU>RT}@hw6jw+3`=*Swy26>@;TB z4aZ99|9Fyokjx%&6>sKyCmvP99MB`J1hyc~Vj;sIIO>v))n15JwJ`!toZ@Ie95u+- z;WR@$XFvZ0j|k!{Zhv0w;k_cJm;#HGp5(+3+w&#^}Uz0#=D_WbXx1j8+9BEDmNyjIQ*I4 zCYyxpkkAHQvwwvcd_;!IKIdl&%0Bu8W~SfI<8VNa%uHjss!EyZD%hd4XC`&UaLycr zwK-)kD!ubLOva%N!oLeVL`;#{g~;Gb4(743SvD+CnWX+Jm?O{1-E?t~OcXSn#mq2b zfNySi9qOpZS5AdJ-FoG%m79K6;R^0WKZQ{chtTLBp`GXDU2M*%xAw$<&$8iA&2SZ7$fLC2Fya6avWN28chCz zbJD|>$=NE15QOR1d@3wV#(H8bOva*^C_tE+H5IcGmm;8VI}1>gG7`8OMBpfK{#J9j zyuFX}xxABb*Hoprn{a4`cYR@Mx0rrCdamQb&>y8--A<&_w(#jQe%;5tIArs@rumbP zDlhcs-y2a{)R)5aaN7CJ85URV)L6hfm+-uZ=ny$|yMiC4Y%z6vtTKt44OJkwNTz1{ zvv;5?h3wZ`yb|VWbjIOp0xbq)&v{W>fn1?uT4OSF6g#6?lt#us`zZwHrIEg~Z+~2s zJbh+^kXL9y&td8hS1Km_6}`0=L3M3qEWd(}lG>cI>tEOu{8c=!Zgp>I6k@VFeMIW* zLAbo~;dAz0^She-h|efLo4PN;iCT=R1YA8Y0Uf!=<`7_k{*yXgvIOGtlq=W)2V2Kb zQT)>uWHkmZ!;qalyA+19vilCOj=CuiazKxTS==L0Q6W;4klpaR^m${`Cm-pvvO#V3 zKf!C$*=nOHtj#Iw{}_^Tx!o15cj9HpE?NGzytX1EyYQW?t*+1A@(8}nVU`Pi(%^IU zH}Za6&UT%PcNHo75Q_s0l$pwR;TiL%_>8pcVfv-Yyb~io7sAi#Q*);ld8%rkXL2K7Xx(I}vde-&*!1 z-t(Y)50CCIZRj8Rxh?;^Z}Cxom;38J`Rs7t;=UV3H-n4IBQWU5-h>J zUDkav+c_MavVP=9FEx*OJ3Lm<#!RkGp!V$-6%2Sbf9gFbUFyMBC**tcRY!3yCkIz^ zO&-K(3w>QajaA|)1(>{guo73mg?x_2e4|uyVxPnu>_VF~sMUL)SeVo*TEw^g2h4A^ z)1x*jFO3oV9F~`0g(2q7*a4&`=ox+Buq4lBeO)TJCCX0<=bD{?F+lYe-k3jOded(eBRR{4wf zO@V{vS7B*wibHqleew`=QJc`K>w6RtQ^7rX9o)~{nLMSBvELcr<;+TQU!=fsI0+70 zD#{K7cYnZ9=@)nnyxsl-6dM`eZbu{d0QZ&W2C*ii*rsbD0PPQwi<7rNkWn{?*S%x+> zfNgQ~8&ZGx92&x4+xTn2jL#WG)K=tdz$~UI0cNd1K@S2OZh=}S6I~T#4^RZ_p^FS| z3)A+7?BeH20aI2$pEHvHTkT8#l^^(HMpoZ2d$gaGrJktgXarsp2Y>+xQWU5A@qcwo zF0oexQ>HJ!>w`G3z88F~~v|Y}>|3q>|3O+1^WoxYcHQBf0{Jp8JQh|sme!aA_ z=Pim@l@x})1Pr$?{3CIPo8p4udP)}5H7)-&0m`F-)n>#rg|olKjOOh&XE#xpxHNM? z%$ngCcHQq0CEP&CE--GA|#Ld4tyT zrg4qlu|tuc)HeRv0*2-Cm3yTfIEGa-YD|4^778o_qKL{0$Ol$nOBsdv#CB)0@&4x%5BQ}O$o3zV~S9+FKJZty|fvuSP~gDZ_FVCt;Suja6Znkj*oibl*4V7O*VVBydb-+`<-A-B3AKlP+4W_~={l!FV9 z8%+tY8e@u3(nQ!b7j3~i3Qdr}3l|(hfQG`90Mb?R?>-(n~)n*iRCW@dVMJm{FjH%^Wd|8pa668WDSGTZ7^r zE4d4h#aM#E7w#xN1rE!mGqwc?YIMnlp4~bqjs_j?J$z%@`Qg7-yvIo;shBXJaHJ;0 z^dcUrWizJ@Glp5hG2<-(iuXDvfzf3EWM6o+;+^5ySt#+o)UZ)CsnI1%pH+@`_mP(}sm^ROklXiaT5`E%1Qs|BA!yU@b;49H4HN|=H4Y!zpg>SVW|1|;pDOhb$ zOjGEwiWv_6t1a7YMPLeZf2It_D98$kjEvDO8zjQUM+HVbc3X$g!_iOh-vyaZML{N^ zf=pk{f=spwG9OwB@;bDR7xq$i(U5YHGJDlRTSKa)%QW>Wr7wR%mE(AC5%}Oj*rO_@ z!AhYa3I{-m84Wss0E0_Yg4=B+QEEOKi~3&C0-$I1`m5Dq9bF>7At5CYUgrUaPkHDypkI)gxYLmC7u*^>aRoGAfDNu~(p zhLlo}WP?9b65@C;yXxsGf75&ub1@py9%e+03Ke6UPQ&b<^KWRo1U1e0!G?zvtQPIo zXSZH4BT+cT#LO*X)(poefA;Dl>u_JV0&aM6o$gCPWCq~naP&C*clqN}QT|A%{Lxpl z{E@Bl$A^~kXIp__=GXbaM0y!v;KZlmA>)zqLJ|}js6A#*7^;RT!Z919F?r%L)s&T7 z1!RK{SB*PSd4H~)UQLBi*nX6=g!0Ln}|UwXjblN5FZ=tbdbmHb@1 zIWePo!-8SautYd!yl3S}%WI4g6v7x)AEtPZ;W=+e_s|*3YXYr0XJ@y>8;$0s$PMWq zVvLzLq`%zX(vVIeX>3TZ#N}Wicj|^PG^EO;sqSk+LrNW>A*Fx3c7?IJ5YtC_n11Hy zw7!My+NaxOW$``KkTPucbvUB&q`2%;zXwfX10|mue&$QF5Bga(^WXcK6>;`fKeN%x z((p|GXK>>yMx-V6s3Cp&e|SV%@X?qfEaE@H_&?)O-xhh^@94Jo-8kxEe*k}(8YLV~ByQG`U{^T{pPMQecrUO20b0Amgy2)hA^DYvjaKu~Hv8Wnx7Xb?~|A0+Umc}o+7)n`n`SlXi93?7jpP~MOR0aNxQ zz_8Gi04=d8fg93Ua|9T*nG#?`${1lp>WD4Lt!~KmvMgpKxZPV6N}8zmTlf}0p$QVu zgqBB(RnlHBcnVhDFWpUX%MjP)CjOa$Uy{HW;I19H>7=hHAbWYe-; zVCA=pRoH1fHy4HDp;^##_{|@)$=NmKRoEWuunUm&o~#PBqtG-4oOH&3Q&6Kz_AiyT zc5;oQQLX}~okNb+0;08uXf1=iR7u(vhPmbGSS=yfli3W~wkW01QMT{FiWV)o@@CK$ zNOhYg)##FKYl#+`!JqGSGx&_lo6X>j;FZRc8Dh?6@B?YHNt;m3Wm`<_QvyXBHh4rc zNdM5rDAjO5+zeAy7+>r5$u?Qpg~zEGWZ3L0a75EbaoNFh@Ch+ji?G?1ejelVd;P3> z^&Ng@HJV-OXEs^cMSKnuxzGDIHFq?7%hki@?1UAbUHG+}o#-)+zO6KP4)_rcx>We7 z$u+GnqkTOMU$H@_`0DNP!uI&;Yyh#ZMxW1p=MnhkHxvQdr6~eQE`_}V8Olf$-GiY2 zd;H@%`8ayvsJ=U9bV~ z+zohJH{d-0Jm`cy)wU>Q-@J3PpL+TMd7EY-dkE5nAnK={=;t2l;dnnU($6oSEI;df z{-K{&`1~C_uWp6WM%&9)AFu)Ms~g1kV;k@;+kkh$2E21O;BDQ2_WHXB;hYkL-OP6Tukb(EBaqRwN0<;5CO|fy5hLv__6Way6lXIzx7!|JT7!oZr#K$b zB4N1ZGr#oH?)52+Dsp>-IZ+J{CG*{HVq*ChZnx7OA&hK2dJVhU(m?Iej6UrV{8S$Y z!}bVca;l9A(h)$`xjl3g*r6xCWRH--G67=%vg6zyL1Ar=K)JylVM)oVFA~CKpcwzs z{aE%0j>EC+5hgD#+aoaAw_%UKT!4lCX+RvkiC;dckw7PtlSOfKt$Cg~!fuq>Fob5m zI4h*Sxf-8rzU88jRbcnQBoy`t%aU>I+a92DPHkc3eT{%zZ))8X!RzoH&IJ`n_j3Fo zBeRakK;3*shq>3f6kw;9DFGJeO$mHCG*(o=Lsh{Q6+9LFR}$*K_ApGb98b3TuY6Gd zwW$HjD!d z3b^TsQUIU98iymkq5!*VObKBBVoCrje^7^`7vR4Yz^6h1B%}cPYAS$iDS!`B07lED zbZ0XWx{ifC!YmV?UO~N}u>oYW+ZfpfzhU-vKPyZ9qn@>)EO7vzZV{)ChS#P&!k8q! z0RNlz2>tL8{4pg-#30nP;KYaRXU3F0f$g~Sc}T8Bg>1;tBeT}I)Px>W&fgHWDiA%kKUSs)yc|kcx|)0 zO@6j@FKcqG(YDBWrsZ^$`!PK2RXb?>!bWOsSYE_`rjSCO|GFuDjdrwg#R|PKQg4S$wo2f z5ezrxJ!K)d?b#pNe&n-1LBNy+2!6HMpH};l-^}dKvU0A>RSHeWD&>yO{wz`x!5$$9 z_&=Eap%iox3=MrIoExAx9?bR(sQfMPO|BO5EAq%f?)rab_GeC|NwYsc_zNm!XyR9% z{h7B8=K$ILG1f&*H(O{LYsqxRl9r%Gm+UK#58aylYfL*@oc(#8qqXoW&;HEtg(ydS z;pE*FttmYFl`zz!b5f@>T5-B$XSGGEu|@S$tw$ic7_Me8u9(dNWS9Lzvq2$0dn`n- z1?Ka^{mjtW{r${3ExU)GS+Qkz@-rKk?8eg-mM_ijgsubjZ{_jDQQvr^-E$9yeoDgO z=uHR&s$&%wka>tWh@f%$1pHrpPCk?_@y^_UcNqj|3{~=X!3Ml@H{fmEfcF6Kpa3eP zO>A~wr%$>$!OzmoEss;WrJEo5S-SZTKT9|Nis#kWY?My$@IEQ+`>&Hl|3t2}Pf$DT z8t~&Te1OwMug~4`9>YtnRgYo3#OHH%&(Ct=>*YB+(IZv_k*+-GV;poe_k(Cu>5Qc; ze!@%eLVYRZF0<)++QN2CLO}=vYFaEie1|gC_GmfgY)p5D4S?wzzF1bUp$I{E(80n;Xqa!0~oXR&-HIiUeN3( zf7pD(^|%-!f5R{MjNUZfhEm@LDWQ1z{5TAuFa8})mY%$y@$J}MiN90H_XlV%!Er~X z_Aplt{UjOsNxnniF>U_)EAif}lHfOaR!4Vj;c+MlV6B8x<1pcj2yMIWWz0sWe--f2 zmx;CcH0Ccs@0q9OtM^`-=2Q3Gp2 zU=|mJ(d>@hj<~)oXt1-;Y|q6DOBLxDrD5D7p&DM7HbG-t%VwXT6Rep3|AW?m5+n!qQ(FH(PjYZ?iDUc|u41a`R9t{4lfNeICy9@U{S4 z04@R-F|ULCidBh(D-&4INVupGR_r25!HbZ&cCRPS5Ez-0i2;P5uK3|F1W-Kx@CIO_ z|J=`v%%v=s@0SVXD?a}xC^C?GTqT(pKp9KU|H+Z1Q#MtHetcl)$ER%SzH(vX^0x1W ze)vX9{KiQX0$e!as0dQ3~>tpjc|ISdNkm6D3oEyqjNJ zAQLCq%FTd@9aDtz={LRdtE&KuB=?AS2d_HoLZCd!LBKNQ-~d6tV#SmIV@y+o^0FzV zAjt+FQ1)MX)maDQvwyqlJMUV>5m2{M1E?0loPxZl7_M`MB$#$n8uF8BJj_eD(ipHf zLF)-}u5gZBA;IiRBl%#E;R6JVa|8#ix?#OjOQ(0F)``|2x~OhQ+(vbiF`Z{xQNjBi zscsk?A6oF6y6Ws{m$KLNZAKLFMCXH#rMo5n`(1Umf(T|W`0Ov+t~z@N)tqj7{$6w- z?)sPcHS!A#__J|;*R*|=q7ZjNYy$3 z2oxPb-sgNW;A|{xsz9h4b13>A2*fb&&0w09f#A7^0P{psy`}`{LYfkwSrB!(AikWX z8AqoGa0-hl!uIYf@8+fiN2<8CYq$z@9gMTr9L)tlQP+?_RWSwuoTDV%cIRduf%3X0 z2pF^g0j&8=3GQg;hQd)o1+hCf2U2PnOllZk|5my0r}%vkaYdL=99oov+6nTD6V<_X^KNX^6GNP<8$&#v{e-G4byV~i%g zh2F>)(cM{+N5vKX`O%Ing^V6PDDIQ{+%Jzfb8Wg&c?>xoqkH5udC4k!ndyDxDlYv) z)@9aj9e)f~(VgGBu3Ya4d){(PzYqH}d*st;xS*2+)2{}n{( z*8TT0avFEUIJp+xLYJamcFU5z=za2V1P(#2gCpR4^eS=aHTJ3wExC(#{ehwD^8{c( za{JQHir{vnf8PyrRCm000@cADWp{SMaf#ej{YV;gFXpZ0)m!h5k5eeNF$-k=RAkms z@ou$OJ_0X!W)0r&NM>blq(Pv}%3)taQA$)&tnyWvv)3EuBW{$X%@V?i_jC`vf74~{CK(W~%qK>yow zQ+s~O>jKO{9JniIAgXuWXuQXIEZcelGFV%GV&4r*8qe7Vz2z7yPRp{RlAof3{zZM1 z4D>06AH_o6elRX(z!boIO{R2qGE@5;o-~~7gt?I*NC)0#A0D8e`ix&TZ4o1S(?*u= zm`{+G1|ySw<;nSsRW9B}t8L?)(DH|agaX`)3+!xFu$@DVi=p-8p2Ns?j9(gjDv8)? zQWjOctccaZ!C66lo1f2fZ zLy3?xjFflp$F@AgE9|J?N#>Y)h9is;`+-O z>2QcYPRtM$jQI`d?2>s{11Y?f@e(Ik?PE>XB08Mk4E**h`p4=i2=zBd4hz$k~}u^ zM6bft1jxx2w#C9kB{fmVe0Cd8Wkq$|HSl+^ZfN+|5eN1lY zxZNg1X(B6o4c_g{6fC@^sLaU)6f4}Hw(lBNyqI4{_W}IuweZd3a@zU}?ft_gCV^*P zCHVP_owoj4Ul_b0)* zl5G1X&Yh_wo4+VHaqIIy-QM~42TKC`gb1_I{QH75x_;WHKB~_YpO0$d{Ha4jmq5>Z zr*~qKcxOB`1DpZQ?!@&IJ5gN#=YaFT`Caj+ce18(r*tQ+%j>Kcd7Y&?7#P;F#n1lb z{!B*R`Y*eGjygUm*YmrV4i8<6ICV_!y%u&roJvTBuB8zWD!<$WYUo;;{|sHbdYx)a zbsbbr;}!VF^1~5Y<+9=q$_*P6h9)YLdnZs7o=jgW=Gx)jqJaEX3+MPX9_VaizZl!B-y%cc>AW>5}Fsj7>xKNJvt^VRX*o0GjaXMf2+q4zR@Ag%Ki<@2X>4z$b02IXlK--!(eK2pD; zTsIYr92;sZaV(*{G~D(X;s(DW3ao&$Fkv9z&ZIkVV7mD;gySt^Uzm{&%~VpfHR3Td`F|?9<(VCq`*Nh&sKY2ICvaLT^s;{z* z-3Jk0wCMQ7dzTPTyoOQ3Z*l=qV@bs?#wb=J*-+KxbCOKcp-d;bPF^#((fDeCvBFKu zN_2gMfbJ$?vOx-tb$-?E{daM@X)hhnw>~z+e@KD+aTA`1TewWy#UAl76R3Ui5Tbql zES_h9=t$s)i=gE*fL@Gqq56>Kd88fRh^vE4KM*|{&>3i?{rnX?uL0M9>p*0)o3e3b z2-h62X{GG25h!%J4lBF4qtkL0Bu+?`Z_GgJq{rP8&}$X?oyL2ovoD{BQk9p%TW^1k z@jZJGZ^V=J2D+WR85ENcSUTMXErPw4J%O(%iep>*w(o|%yXbrEk$qo%TtMqv#-2wI;>W(nG;VQxPfRBX3vTjVwL#`qh|R!mWIrH=Bnck3 zp0K_9O$*y6){bnyaRC)M26P>(kEW4(nqPR}xT~Lz<;;V~5$vb40>K0nC!z3CDWh32 zu^SW&gK@?xJ4TrLRcEth_c^X^wVS$z*mEbUzQsO8p`&Rp8d2a}J-c~)VanZiyl>2I z;|?$(%I3JZAX!vh5ZmxQ3HI;xX}b~1H#1a}sM;W)m^dbZw9G3+D!@XZDFOQArVQHS zIDkO;VqFk0V^0EfZA}TVHf)MeUaX@OcB>tOQF#j2;&`mmHe|`K5?ir2L2hlTfkht8+MtB=gOkUcYlupZnQ(#HUPa$ z@`&s1AfVzPf?&9sgx$+6H#d3lan!yAaXMy702_O2LV#1_-iGW?_rUd^d zdwLr^)wVvME+p?$E))M(l zNsnLGYu^Iw2WE`IAu!ktK)Gp683i`Q%r7m*E@%U$rJgXRtcgO&H*;1{pCRDbH$mM@ zkF9aVp}ow@EnL5bs?)=D-KD`}WV$EA^(2ykc>?fOu_LGhQMEj=K+&a=^q|)vedFL< zFtU4`&&AUl7z%-~c*@5(`U50rvcdo8)U#WZh!sb#1#9(%makNARblC#>;~_!oT0TN zt4})G%SBBu>`-Vm(;+~0ly4@<7_+lc4^1}szK-rUghY-xS4{9b!_tjy#ezOdetFNl zsG0z#5vBy*jkIKrAY2-Wd)~>!BA(p@`K6KJw#aDRUe@Hr6wXEv(`OyyU@*iKYVHz* z!%?7ZM-T_JIjCUYHSC>~*I)PD(19gf^e?Lnj{6n_-r#|*m}KVHgN>1z)Oq#zIJamf zG%uOc_9^gH2{YyhS}S~9geFM``_Pd3g`O^gV(5U|G#z$DU}j=ws8!=|K14mUPt~|M zCQHFX1s)EK2nUsiLnAht+6i+y*w?O{A7*Ik6_}Qfg z%NYc8If$T`E8n06aLakC4U#p%cOYUK%!MHyIu=Ui9k$o;Ve-g3kXfuJk?@H2n2YDV z@RF}b2Jh&q-)<{G2FEuQ;O=c|DD|XlT30sC$IY=v!q_<|Er#iP4^P8{y(g{kHAm&8 z?s4NTj5080%olTUK>)`Eo~c*k*25I%jhljEIfSVSjhn@U>NWryw=Igg`uEvsf5yh` zE)2ycCeb5Kti`vOZ18{4xRHpXC*XhHxG9-im7nv*jn4eb8@IBT(74e{sc|F8HZmwXZGDNgK6db{*1WMfrR1Xtt((SGALB^ zW+sg_xz$x6z?zr=5>x1bIJgT%Lwdx83G&hq^VC}^@fxZHMOT+`VE>cjZ1A>P%(Xd? z026Sg1aV^!6y~`IJ0^8|b;TTk?MdN24CXFqIyq~{sTih4)W*(u!FPZJ<-j`e;uuQF zHIN^SR9k`PL$c0-05^O%blgcFfnelF!p;O2fawL4jHMU)P`VNi=J0}xX8DbAMk3rk z!b#)!)0T{**n_6)bORM$upL8B?n=-G zQ5Xq;$y&f}s`*~F(7WT#I0T)yEa~IprffyYUkZj-`8hVNmzjjaZCb7kDNH3@F@%eG zefMwdY63?(GYcKAienZ;VXn}ue(T~SAG-B$g{G9CJDQ6H{Gt}_+6)B z9v_nywP|WfAN^Ep@70}2-02J>B|6ZQCY{1l_DE#3)%&6vDc)FPWQy;8zUxk|I>wms z#Y|1}>-)1;i#LVoyd)CK7qQG>Zf3fY3<1M6wVbs}Cm3k!_O9;ze=1$tjYsleaRLJ* z%)i)*9q7g+8ScWoOje13T2n2rr_$t{b2YSJ=VAnnytp8dPX%EL@70?ypZ_{(Js9<< z|C_xB^IGL9lY@ZlaaZIk1UEr7C|6W?_D1Lm&l%(HZ@@&cTohK|ff}dxOS<44A4vtr zeZsAxx>bQg1if*d@v@FhCH?534|%bS#4Jh zwVoIjCIYTr-BdYavHQX>_)(-iB41tL7fL zyoF`oV15v+$U~Pg7?TJ4KO1oeBS+ZsDmav$uJ8$$_T;VfB59-q8q8bir6voyrHhsi z!n8uYDp~%LFW`i2sOUoV8rH4Dr%7;=MyFw-3l=CTz7iY=GnG%=CAO)<}VqN+Z^;aq6c_-ak%b9S8f zAi0kdd%l!QWm`3|-o1Z@Dc~f!YY%pabYYSV3=oj#Vg&<(1kWs#35^YQqcGyf)s@1y zfrnS+1`c7eRF~7|g^|l3>O8J{Dd2E+{V({Z_8%?#3k$H33Z;@+qI>^nsXKwgF_cYOuH(w@(`u~2t+jp&{Q+e^ z_7c1mC+x^Ud_$|2AK_*z8r$Q-&DlQ~+IU_?mEOCg{`|%^Hi-BT0uQ9!8U`zx)&u3r z)u2yv!|X8yY-A&YZo+`woDppRgULF*(Nvo`jMjOwr`?QN@k#PkSK3i7pquOhsIpvJ zew@s^;;z4D^Wl=|jEoVyv>h^_Ve(K<(HD1B9CIB}Yl-xZBUmuwU&XRCmJ4^Gy}=KS z$j)Tq`(`Vc5f5k?n4f5v%gK>ewEA!KAMwvve zwIJ=;3!zoSuv$6eQ1?Z)^+lmT!*Jox>A>fq86Xzw6fG1+w3JRB3nzpjnQAFRa`U7f z9-_%aN9AQhODI<%z3+w8)4mAn2{qB%k%`g8+EjVj-l^Worgg|+fz3iI3>B1Yvgi{l z=>NnB@4IFKqK{s`lzo5MzL#rjGy%iCO4>aeto6?h>)%*=Yw7>z_JCN}IYxP(!F%%z zCp9YnK%F#v;Cj+o(l!Sl8S+?$dv$Q5>8>?A zuL0MA>&#e5$F5Uxhs|PMn<|T;Z;Ec%9u$xro1l4Rs6{n5tPO{jcD`)aMDI>q&5Y$M z2%3i=$Xvi9eZ%x(_uQ`JIq0$7YuBk?LPaqSNju|Z_t@C+-E=jouQ3)tuE(isx>LP2 z`rH*Sdi@wJls-X={Y*)J_?ArHa*KW^Z|JY2$O>4@qkJsp5e^^1|06r*-|N2<@Or)q z{T)GA+bk4GWM| zY{oQ=4 zeAkCf2`~+0N`QW+DFduY>OEw@&=i1J)VhG(`wyU6)x-=k202j6ta^xEmvpl`XN~|f zlBNW$>z_DRoFcHYOPD;=hsJlEzW=+;QFkb%HJ&z5Oy80~>i4i=h8?on=VPA?jGe$; zNZlHDzHe6n3^$heNaA2$csu8)DFyl${MzTJvvMLyAd%{eBw>~7Hs`2$5JR5GAYjf~ z65P%?YDz&O1;re-KZG~!guzV9hE=Lquew8X)XU{0lR%RDS)CNq9RsEW8_iKKG09<$ zItb`;5W%lDM@`|-gy7dTN4@A&E&z%-Y7*|;9CMC(9$xY}>fn7I4a+>*8n#6XKs4X@ zZM>76!I2Wd|D`$VIi@%t{i@;iwMO~qSBMQUV=BWAj ze|wI4hB5o(rOi3&^qH<_T)D!WcK>}#47OA{+-UU?Wp3K1s*ZDodXl$(@K$ezozLn; zH1;WK{w3G!0@wV@<_HQycFi`n*}C|w92${hf?2OjXI#ln3+ht@TwfumiGsC@z0BH8 z6gHHInJ(LH$!@07OqB19L8Bt7F2F>%DFIH~&|0scygE4zt)e-a0u(hr2`H~mA;J|c zzP=?1x449xS^}u%uOd)hDFy*DcfbU$mZZ}jixcD)9Wv}FFWgZI^e;fQtQ3UXbZqQX z*!&DyoB+E!ObK9WVv0~+ot!8qk^~YtZm)vYOIqS|!fpm7a!)CdLBNPT2{1%9B|u|m zicn4@r67?4jQyQRe+V1?;bKFE#90j%An>7?=owARtu`Y!LtL9RMJTUMj+c{60!dz$ z*JGcKiCmeyAV6bhN`UTpS3D8uyGz#$5O$mH8JyJ3PW+@LeMy-PpK#|``Kz7yP1yH>y0aS0wAiWGD zP_CCCVAP%jNSi4^VJ~GTd2Y8p-*gBSAcLQPOvo$M}r2l!f-u!x{FP1(@;P?dm&zC-x z>a8j)`O+ty`Ij$!mc4|fPkO<`d~Vl6l5Z~0Obsw*FMk7@6*+gOVTVo+JXa?7bRkkF zAq-L_ju$%lxcaCvdxM6>7Q6lQ`cA&}lw0$U9vMBpk{pyo0qKyET62p80$P7$-#M}WCIEZD^0jx4?!2^3(r4u)l#QE3^kJ+rd!hA}pe z+zp^(M3J|;pgrW19s=&0CD^E`&zvoW4#NOnb6Bt8S3y8=uu^Y_3P28rb&?j<06*kb zuKw0tD(QVL#Y;v=#*GE8GGpU6>`(EO-EzJB>P0wlUygNYE3S<)MA9(Tu!?HZ8>T5F z?W9BJbafm$=Xk7N)G~z)EpoWduP#kuDcX{%3KY!?8gqjBtlZ2@a^`}Vjt~0t5*<1M z^=Y|<9zcCYQbH?VUlA4Rz{a9{hI{1f1=j~TKo^TVzK0-O2iI74fDSToa;Saws&X)u z)U_Ys1nYMS>L2K~N1dFett95ipMMJ4qC zIgewWsM3Wj7;?&pxV2Hk7y+#k)i-%HN71TBaiy2?RamQZm7QBRhYhE{O^&$&Em*i20T5obTj?RarH~oKuRiLXn3u3AP~`)(%Vw zf|-JsmJU6o2mMi?Bz6D8Vsl&@ zM_mao8UWz9W>Wby7UrmOtCz48gsG}xEf?##@or4|;D^az&XgX;ye`Vy;U{6~5@{dS75_*I=kbWDygpmM$TpG zp-zF<2-1cYOFV$ZG#JORm_Ovm6_mi6xj+qqx&6@KJu#~oj!+4Zvi86+Y zcC{08Hf9bAWH(Jw@?r}0l_`NYQ{p_95e2w>RBnP@$pd!AmsiBEjX8_}AHx)3$N$IP zmjF~FHuZ@e|@=P1k*~NiA646sQ>}f0{i;>>xaT`M&L~PC2DB8 z_@Fn2n16j0G5`8%!9>^(N@FUBsfH5JqnL&an2_sRG+wL5YZf4a!H7o;yt$3QQQCF_ zx>f>+<3dPi+!OiKNQeutWmH=yR?&5WECs{pfFpugjG$U|kgTmCI|wi`BuxXbYriMh zLcF*cu$#|67c7Mn_fx=L%v4_i_O*nkC@>donq>B^Jy`GDKnPM!gF#2~{4LYBDm6-_K(j~C-f?u{`0`w}gWP}BxWMpRhf|;w# zR3{s^+FWHOqF0%#8Qx_RDuawlmQ-{u?noq?nYqd*n@1WQY2^A=M6lsH0X5_J) zjnlvg9Dv|MJfffT;3O2j4TVR>_)REk!)-iTp(X01gb@wp8$c`E=d_j2XwoYnpc;Xb z;@9{RNn8lT@Y(f7> zRqvLslM)d4#L&Rz9&aOjLUKStAZJ1f=mx1NttD@J%6$p2wJ>0Nwv&P*FyLrV1ud%w zJD#LNl3&?s9}->yNk3Aaa6?HE;kSs;j#;VI{zhneQa1DiJS$havbnox%|E?p%{`0O ziSpvdTa~7oBNpx3Q2P3*PPb^3K5d6uA2WzPCeN08(T+YpUd9!zV3(p1jh+Ua@QY+d zajZaH&YJ^bgvJ4~%ny>$^gKjn7eN2;8{84-2rbMWN;f)@L`GYAWIF)~gt$RiLK0+R z>>=ufba}zX=o575J)xUikS_F&6+pE@t9e7oBnApGWPed&h42t+7kBF?zs97|J(en13 zs>8$4g@iHcf+6!}#JS7j;clP!7P7*ZP{T;j399DL5vF7?%FLXyvAZzX!4Oxy;1;ND z5KOcsg3&iC)T$YroyNIUBLwykrW7}TVa-4=BjAIKi)938 zME(F}?j&&gwX&3ZF;)R8zyYNLcaXi=POVQ8pO@X8b0S_sX{rP!AGY z0P({zCEgd987mUYWSM>+aL8vlYhveX;cz3!BQ>S)(*?CDn_RUin?!9&TesSjO`gE?c<-24eK^d>24t&SSW7_QBGPcNhMUvO-V9P_ZJJNQBxw(=-fw0+wPO`iU@m|_FZiioINB{`_tMBH8?D~v%Cfopry9R; z!xSmSt$tJcX1XM+k1&Hpmu>*t54*yQuEroDn66gs|Hzj8AESZ$7{COWE6!M6G7_Y7 zC3z#DY-BLh(NPbjtikX`b6F3<{Ti=YfO$As9i0`pQM+Xp?&ghVU4-M7sK%=!=y7vT zB@~_(KZTOv3aMdbZVLkB6oe2=2rE%SQf~d9(y!WKMJs_QA~h});5(5 zfSZhpdfMD~#fWfh=uUy7RY*e1yJGa$cg1kcLa3v3F&Z$oeOI6k_X?`Sb`ZN?!IdrG zTkL(fRFMDxkw9#-P(*M>YqzLiiVcIC@OJ_OO!MQL zuRXG~DHiE#!j$8rfE;f;P^*Q}sUnh#RdA|?6Br7AOs0m(_=_4a$nZN(1B^lcC$;b> zhetUk;z*SeU0g3o*DA5_>7yMtn%q`0RuFaxK>!cl3YqZY`p{MxY+`w|2R`|3Kk zx*F{xT3IS-G<=%c^zDU!$45u@DLOpUIQVQ9L3Qj^NkrbtRoD}?+0$PWn@BfDUJThSy z?jb2Ey&96Dj>cf^#{NdINcQyU+~}9vF4O%RKoh&XUGx_jhOGA9=Z!dS^m4qJ_hJI( z*%V3S$wrST&tLjc9^$njd@D$A0Rw498V%qwNFVqx=mEs0Q|Zb& zylgZ`+7LNl*4z%QTo$@Jhy%|V1`0R`@SBiQ7Z)@kktRa^3(m)$Hb_#fZYt`lOsd)57wBVuK*oc6^GY%94`d4=B8Y4s^fIzCCrW0B zPms>*Ubd9EJoX2U!8IPIFc_qghFK!l#*( z-$nZ#z1Lhc@x?v(3bL$b5re9A_WI8xvN++IveeFu60n^bv0{>eV=8tIryq#<-Y z-e(7ArJJzUCMT6e3wgL)Ix4blxr?UD`0n{K*8ke-SUcwgvFC#pWy=YQFrs-DQ2;@Z%y`YCqd%{fNo803pu@k&dW{8HF^d)Stf zB^2nuW%rbhF7!Cn+ZalJyijlSJ%)$JH(p<>DM6kxf24d=YzPAk;(`q%LZ(9r>hvJ4 zAqLm$l*F(D!!FFa0XJvl=pG01$|e+)J_8cug%|jbmC?0cN3R0^dKrQN1^)Hf5@clw zj`wvett^@5|9-mvEF2&0NJ4#05Og9G#*2kQQ%Z&4xC1vma8?BhjQPM>RcK>CToc0d z9an@f9Y9;J#P^m1hLBezIY{`!YI&lBUJMI58D8PtphiddxA|RUHKfI5~d`)a2WME z_j*t2W6YvJ8JJM`ds2zW-v+5zAfM3p`-T{>DZ^7|9wZq9O{_N8wkcf&rsjP$r025!OiRa&Q2QlSgFP zK%hI3DRGa)CzrnCNiO{kMC!FN=lCdWix!(sh~-Lm6LDvJIM_Pw8fK8*}y~ z`+)Afuz1a)O(z=o(#aXH+1`>98BrAI+zT_o>kth5YeoZL17I^?Gq^VvZCv}}*Zsn2 zEOP+2*Nnh_xL;--1`S$pwbvZR!Bd|q0nMq55{olCIO0An67a#+{SsIj14D=RGQ`!9 zh?l@PATdu;?ErGRYM*i;9xaB-b_RD&bI3k>=qu6p_CAl>Ek&5)=W+48V~rg@EV}K) zN4r^L8#DDE6M;3h*+xnN98g(f2!CRAAS1K8r9H>+8IM#wi&2}P^3e5QkZ9FA_@SI$VhW17TG_Que zwI<~)eT_&Jud95HLqGQ_c8*9-ye}|%7&aD#ESWY!p-?=7^2}>hV+lDVRGgoH%G6TF z9YD8U`_D+A!@f%f2P{KEf=8%NW>nhLVe=&=O|=)j;(tRw{yHCyo{GlC%GV7TrY|6* z{QO8@K5W8IiWt5Qu3h2!M7{iO`s-UoFsrsjWYKCBD#gTTy7nL#jW=75D^~<#wl$;rzmTaq!nOgt(XASMhn)jGVUr3j}HNZ z;6orHg91VrW?2n<-R}tzWTE2gj!gSljVJ)Zdx|L#PFame4yQB;#A+Y`*lSlzK-ld# z_BDd*t_jut5s>K-NYw+7eWo1X?u#0X;8Psu;barhCJ8 z9$zLmlbH$GU+2+yHOH~0CTFN{rk=!eaTRlOWBwO5c^T+6Y3jg|3XB2h9=(jPQCFals-6pD! z93i0Z3xt37!ygvVSwOmm7Jy@O#mp3hi6dPB&S&4$M_?wJxVBt~H4^6aS{(C0yjfit z&8_AH**p}6&3SVo>`zUA)ncyxR4?*sK#Bn$m`psFOx)_{u<2o34R_&86)pmdqzg1A z(h;(w;%5%hL!YDy(5_aZE&{@JEQ4#4BHZ*)!m1^t z3Y$fno5;#f{K;ux%1PmUB36S7!1P@(=Zrc*F#&i8LNS7nffyXC*(L(G562Nf9SxNj zK>?WJD<(h}Di~>F#SxMxZ$n9`NO`wYHC-KVF3NH0P$cE-snCv{y;2)TsU}}@`N`-y zsjm@kTw4ubr`B}$|1eIZV*Ez7KbWKpT!0bk#~D5y@j#3wCjc@6iV?&;vL{w_x}ft) zVS@<(ZYLpv3MiKtj;`?v#RNpUnH!HtPA4%5q-zubKka5N6GzJnfS94AYe2}?CfKYW zXaPMhJ@YaJIF5jRG`xp&4s!`KXoc1d5!6kB7EJ&aO^OLXKTu48%tI(I@6?S+K<-Ci zK18bU=~lu8m@5`ofG`~$K(U&n0L)qx6JUh#ai~I}cTAAP&w$XnDb_3mI5%i2^?plb zxz>#U$TlfP5Lz2XzTZYZZcibCOlvf40sUP~S1wAqe20sg1lDQ-0>bb6V4kIZ1fg71 zh5S{K3+j=C$UHV+`T%4Qm_o`5__u~r?=PxSfEABs;}x`a7@teLwX-5>a95l$;h2O|hkI z38kGl4L%*=M|@pZ0^p}gTTKirzowK{lmf$XCHF5|x$fc~Ch(4FB)mQiSwJDKJ%DB8 zz5w1ll3dp?vG%`US3M-Fgt#*9XP4Hqh**X9k#7U?mE{rgp#%pehY%^Fgecy}(tJ}* zzE|EW`NGFsE7N?>lzf>>S%bf9I$+%DaU=*o5JU&Cch!)fv)3@6D1X@$iE|C(@LUQP zU5eqt=cO$@4T)5RNce>` z67~J^H*IK0q)Odmmz)Ba!|Qr(sI-y3DXTX>K}{kZ9r=t1(_HixorektVIby{C9KIU zo3JZTE;$+bUo*|sTR7!rx;qrrWb2&V z8Ua)Rq3xEyEHS$Ra2Y=lxY?4EBW2p5n1JxjUY$qAB9haFCV>WxA|U)N+3?L?ZNpX# zEda|^#RNcdjTE8Ql`vUY;9k4bx~lR(OHPoMj0^VBlqF0MBNBjrXiB=EDd~cytRQBj zgad+UQ(DNAO*!{2Y07ej#@a?G(WX2|1RI@)T24l*g^zSH1b3u6I;r!RPHAxhIB6dQ zr!j=SCu<0%3kXi72c+kSnN53WVgRNDcjB8xg75sD5S-4?0lm^``ri2=%qU)%Q8(&EIvNlawGCYekd66pdGhtk7n<_9~G^h8g;lGtHLj8YQS-@LP<)s?uSU`e2uNw~Kudk|okQX0O+P)8c*6`Vx+LK0I(q8auvF8uo^bzrK_4 zjbtlM7$pdA5XiPMKK$g;62|ZII&G~LiB96SwM$@!B&Rz$WX&#tws@H51Wp?Za@vG) z^R$}TG*U+#g@_;KAATRwFlrQhW1X(051Y%YvCRnSuYFch7lri!gK+Zly3YftE?;6O zyDOHUWCIy*! zjD*<|#>-jHhxNUeKd*z>+;1wQ-uO+^!bt2R4nBQU9e+qeLoSug%bjX6QgOpgAD_sMjljOEbVt znt{#YRg&x($lqU<1G?J3?#^90itK5Xje)BPdp^Q;7ZHuegRE(2n$EZ<&+oE7$E(Y3 zQEu!`tUC%?61$sWMXBLlsxJ_!DAm%zsZK;5^yIY$9@t4y;3h?>2r0^|14GFxL1_G@ zC6s%d+LuzsgD~wpmwkXHk)j90L>Fp+r!IKH&zErDTGl7>zJtG(lWBZt%K-w4;O!P5 z{@PJ6?O{kbP){ow_(cfOuvU@)(PbD6{BSLSc{xL8$LirQC*@HXaPAzrJ8px)JT|WEPMwU=JETQf19sW_Ec|uwY5yY@2;Hf-XzB`(I`)**MKjUcdV1)N zEL>A;>TE(35=x^G-NIq^wrZ*BBzC9ii!P*uX)<^ z14Ln@?HqDB*b8n&7odsvd zjPsBlJ7(g9G?)nOzAg+5o!t4+;YEgcWgR8t8ttQ;GW05l>Y_msN#s*1IS))0CMvA& zjwEv_(L8x$MtgsU z{4&+;u?ErvQ36}D#`wh;MoB`N7F)BMko@ShkX4)HZ1fjawg^_+4B)N_h#=rlRykBwO3jDe7!7}v zO*exY5XspLG6}?M0s@@-1?FNw=s8U2W)M?B?I=*4DzX`*M4M%byZ5K_xmJRJxxK5; zDEQsYAo28bGf3GCmWrrO+4gBcJb&ej5?fv+2pGf{vhCxy%gl(dL0! zvp7ypYv)Ho#Okt{VQ`VOsZ6`;RnGCxWT!Fu)sN%qtl5Nz_W| z2jMpl1E(e8a|e-$%Fr;SPlK@-mD8dr3AIx!WGiNN?){arPJ(7T^%Ja*JCIcp1Y=nb z7ea)Vomg!CU3HvDdPqpCM**X10kF9=GrjbkSZrIzt-b;i0jG*}ucA{5t1nUc%Ph%P z0c3pyGm~_EJ~+}V!lC263PiXan+WRNr^yJw@tR@+!cSt91FU7q%=w&2z^hRNV4GMm z0paHhy4W47{sM4JqL={e*J&LIaMpK5Hp@}gDYb^{GTI3QxQiS0lf_L3{lQ)Y$Qx$h z0cRMZ(A&R7OZZ_7}^!FIs~@<&_U=8bo}7yhPuGys_}BV7->9 z>JnA<6o>`O%#M4qULv56A%y*^^oV+f_CrEM9J^kD(n_S(&K<5bWtzUx)jAU&*Vn=9 z(525$ERQm&*#V9vi4+jie5H4Tb3ir=ZO*OKH6UMb&V6O=;p&T^{6!#U;G5`h^1KJH zQd78kM{co7-=kP{ll{l**(E8--ef;Vdt~{Vr1H-46l`RtKuCk@8~@55a1$p`^uvUr z&baPd9-;C!@dy(@FbKfx^CqSrD?9P+YXFmUXNWQl+58VIf;%vW|FRutr&b{42Ur6s zUpgDgNh0r}X@QEkCmZ_MkM1o$&N3HutV#Kl;yEq0DC1CB?}+kDk>t<2h1ew-nNs6k zN&xccNO5-%3_86L?zj9OlV?Z8Xa@`IXquuM<#9mViSQW#Pνm=iv?ury-Q}YM3BP=<8`|oToQ7=* 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 XjKwU^-1$=MNdiU*Xxa|`(f;#)%V0zt literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.manifest b/usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.manifest new file mode 100644 index 0000000..045a512 --- /dev/null +++ b/usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.manifest @@ -0,0 +1,12 @@ +{ + "autodeskProduct": "Fusion360", + "type": "script", + "author": "", + "description": { + "": "" + }, + "supportedOS": "windows|mac", + "editEnabled": true, + "sourcewindows": "CustomGraphicsSample.vcxproj", + "sourcemac": "CustomGraphicsSample.xcodeproj" +} \ No newline at end of file diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.vcxproj b/usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.vcxproj new file mode 100644 index 0000000..5bdb30d --- /dev/null +++ b/usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.vcxproj @@ -0,0 +1,107 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {D7CBB035-8CC0-4576-9C72-5076E079586B} + Win32Proj + CustomGraphicsSample + + + + DynamicLibrary + true + v140 + Unicode + + + DynamicLibrary + false + v140 + true + Unicode + + + + + + + + + + + + + false + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + false + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;SIMPLE_EXPORTS;%(PreprocessorDefinitions) + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/include + + + Windows + true + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/lib + core.lib;fusion.lib;cam.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /R /Y "$(SolutionDir)$(Configuration)\$(ProjectName).dll" "$(SolutionDir)" + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;SIMPLE_EXPORTS;%(PreprocessorDefinitions) + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/include + + + Windows + true + true + true + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/lib + core.lib;fusion.lib;cam.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /R /Y "$(SolutionDir)$(Configuration)\$(ProjectName).dll" "$(SolutionDir)" + + + + + NotUsing + NotUsing + + + + + true + true + + + + + + \ No newline at end of file diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.xcodeproj/project.pbxproj b/usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.xcodeproj/project.pbxproj new file mode 100644 index 0000000..1ec7232 --- /dev/null +++ b/usr/autodesk/CPP/Samples/CustomGraphicsSample/CustomGraphicsSample.xcodeproj/project.pbxproj @@ -0,0 +1,269 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 2BB196C61AD5940800164CD3 /* CustomGraphicsSample.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2BB196C51AD5940800164CD3 /* CustomGraphicsSample.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 2BB196BE1AD586AA00164CD3 /* CustomGraphicsSample.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = "CustomGraphicsSample.dylib"; sourceTree = BUILT_PRODUCTS_DIR; }; + 2BB196C51AD5940800164CD3 /* CustomGraphicsSample.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "CustomGraphicsSample.cpp"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2BB196BB1AD586AA00164CD3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2BB196B51AD586AA00164CD3 = { + isa = PBXGroup; + children = ( + 2BB196C51AD5940800164CD3 /* CustomGraphicsSample.cpp */, + 2BB196BF1AD586AA00164CD3 /* Products */, + ); + sourceTree = ""; + }; + 2BB196BF1AD586AA00164CD3 /* Products */ = { + isa = PBXGroup; + children = ( + 2BB196BE1AD586AA00164CD3 /* CustomGraphicsSample.dylib */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 2BB196BC1AD586AA00164CD3 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 2BB196BD1AD586AA00164CD3 /* CustomGraphicsSample */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2BB196C21AD586AA00164CD3 /* Build configuration list for PBXNativeTarget "CustomGraphicsSample" */; + buildPhases = ( + 2BB196BA1AD586AA00164CD3 /* Sources */, + 2BB196BB1AD586AA00164CD3 /* Frameworks */, + 2BB196BC1AD586AA00164CD3 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "CustomGraphicsSample"; + productName = "CustomGraphicsSample"; + productReference = 2BB196BE1AD586AA00164CD3 /* CustomGraphicsSample.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 2BB196B61AD586AA00164CD3 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0500; + ORGANIZATIONNAME = Autodesk; + }; + buildConfigurationList = 2BB196B91AD586AA00164CD3 /* Build configuration list for PBXProject "CustomGraphicsSample" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 2BB196B51AD586AA00164CD3; + productRefGroup = 2BB196BF1AD586AA00164CD3 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 2BB196BD1AD586AA00164CD3 /* CustomGraphicsSample */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 2BB196BA1AD586AA00164CD3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2BB196C61AD5940800164CD3 /* CustomGraphicsSample.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 2BB196C01AD586AA00164CD3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/include", + ); + LIBRARY_SEARCH_PATHS = "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib"; + MACOSX_DEPLOYMENT_TARGET = 11.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 2BB196C11AD586AA00164CD3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/include", + ); + LIBRARY_SEARCH_PATHS = "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib"; + MACOSX_DEPLOYMENT_TARGET = 11.0; + SDKROOT = macosx; + }; + name = Release; + }; + 2BB196C31AD586AA00164CD3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(EFFECTIVE_PLATFORM_NAME)"; + EXECUTABLE_EXTENSION = dylib; + EXECUTABLE_PREFIX = ""; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(PYTHONINC)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); + INSTALL_PATH = "$(SRCROOT)"; + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = ""; + OTHER_LDFLAGS = ( + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/core.dylib", + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/fusion.dylib", + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/cam.dylib", + ); + PRELINK_LIBS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SYMROOT = "$(SRCROOT)"; + }; + name = Debug; + }; + 2BB196C41AD586AA00164CD3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(EFFECTIVE_PLATFORM_NAME)"; + EXECUTABLE_EXTENSION = dylib; + EXECUTABLE_PREFIX = ""; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(PYTHONINC)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); + INSTALL_PATH = "$(SRCROOT)"; + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = ""; + OTHER_LDFLAGS = ( + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/core.dylib", + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/fusion.dylib", + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/cam.dylib", + ); + PRELINK_LIBS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SYMROOT = "$(SRCROOT)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2BB196B91AD586AA00164CD3 /* Build configuration list for PBXProject "CustomGraphicsSample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BB196C01AD586AA00164CD3 /* Debug */, + 2BB196C11AD586AA00164CD3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2BB196C21AD586AA00164CD3 /* Build configuration list for PBXNativeTarget "CustomGraphicsSample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BB196C31AD586AA00164CD3 /* Debug */, + 2BB196C41AD586AA00164CD3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 2BB196B61AD586AA00164CD3 /* Project object */; +} diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/16x16-disabled.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/16x16-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..b3b427e8dc7a5858f602a6def5cb3310635d77a8 GIT binary patch literal 322 zcmV-I0lof-P)L)6FWxQ5?qc&y1H1iX~-Z;|g2_N^ZcycC1+IUsLWv ziJgTM?f^?08x}S)tMSq(uMvy?Or4H%{*SFuXdc8;_e=!-B1X_aD+j1!1#1|Hz(ZI-AC}QhJz)~7iEyZS%!Nh>7{+)-xTmQc z;0v#R0KDV?9UT7>?%+HJXk!O&6@WvW<^bpw_Wg6OieZM z8kdpxgfo07Kf4kjzEt650i)48CR4B!poTp>2HvJjN8)AbX&7(fY000SaNLh0L01FZT01FZU(%pXi00004XF*Lt006O%3;baP00070NklV$cyl~;ncklVlcfJ{b|6EMFpp_!B z;P)w`b2HA%e3y9D(yR1U%JphBTY9}5DF^Q@W|k2qe*m~vVU}6AHf-%rO@@ck%Y{_!)r{%z*WEV9*EX zA9k4RF3Sap|Hx?w&%XOsO}F~kHj049>agB&AN30iKLnWg0OK)0^}YFAM+RYH$~)67 zlCzx-*p3X$78^exnQHXSI#o0P90!6m`iw!41?crSfajPI!x0ED1QE3c`l^i85@3pE z&>B5K6wWr|ZsdnCsTu-wObV%FX{nm|F)f;QKv$^?R@^g5n{`!#R4i90)$nJ-5o#Kw zA1@}JBtFGdPV54PRe%tt+05}glu~(kz7TmCN$GD4KO?oLuW!}kTd{oowqp-0Og|(H<%>0Ywjp&XR zZpQV`Uz1uM9Xk;Whrf`G$SMiVKO&c|T>nmW+2}sMUm%oUM?e&_6-*L6oGx1n6jL9S2%x7%f-vOu?b5CBswq!;c#cz9kzq(>A*_?b(F8u=KG{1=T# qvNC0{*gObndM=xO_B(KW|K(rfef3)D`jT$|0000{XE zHKN3^v?L?Hh+*ZrGaf)84v>&@er|4RUJ1juGt>41#ke411(ija=@}&qYxvJt0Y&-1 zqD85RC7Jno3MHAjsSKvy`8k0yJRljD)Z*l#%mR=kgD|I}GEkfwES_1MoRbJtUBs~c zz?OcXFegYjI6tkVJh3R1A-3Q@$aJvNg7Zs@l2aMJ{%?K_6k-FZ3&||WNo82^?vgrC z1nk)G#G<^+ymW>G($Cs~VzWG5978O6w_Y;jV+<5&eb_(2Mj;hH~-sh_vtUp$^+4}8Bn9D7Z&?$Q? zKflG34pS3j3^P6 literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/One/16x16-pressed.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/One/16x16-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..2bbd57fc481bd47902f5cffc1fac3b861a8e7466 GIT binary patch literal 535 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAP>{XE z)7O>#A)BlipULcGxjA4V*N76w(vpn)B8HXg&UgTYcuIgmE~&-IMVSR9nfZAP!kmiA zKyfaRxO09%Wl?5&MhU|j{xeoUQ9iI}QEDPcsX|F+ZYqQ6cYaQw3@1n?I6tkVJh3R1 zA-3Q@NI5sy@XX@moJ63~B8Ke;w)6vqIY7eUiA8ytdFc!Xq@T3|#n>VGON)|I8NU8+ zehpLRoS&PUnpeW`?aZ|OKruFuvXIP@oK%Jt?=GnWMIL#&IEGmCCja^W-=10T!@rNp zm1$;u@->f=^b56q0R_YU{P`t%_dgHM|HO*e+F*0DQlA%W|9*U#SRbCB-`le6oNCI) ze*bx1f=`=5cmCWwF}LlZYGmc-jv_{O?brG_VjBxR>kq5-B{Fauf3}x7*eaSJkq|oL z{=eV9`TIm~?)={XE z)7O>#K9jhxx=HQgVGON)|I8NU8+ zehpLRoS&PUnpeW`?aZ|OKruFuvXIP@oK%Jt?=GnWMZSBwIEGmCCja^W-=10T!@rNp zm1$;u@->f=^b56q0R_YU{P`t%H!HMPeCHpf|EHgX-dnpm|JAW&eVlg>$j`U?^#0Y` zwJ*y*S$%tXRl1Okjjipyyd6hf&8HBq*~}3aSk10q`7RT;#e_9>&eXYo)y6?BhtB-rpY0UGaF}8Bp+Dd5iThiuNm6<)oXp@R@xj~6Zt)4$B}}&@ zKfM0U&)3ECFdh=kWE&MUu35kzbIJ9HKN3^v?L?Hh+*ZrGaf)8o)VytOKNd)QD#9&W_})nFsGt2 zP@D@S?wnsxS(KTcQNpl>|BMw-ln*Rgl$r=qs!)=do62DNou3mZ!wHfJ&QB{TPb^Ah zh%NXJQqB!FJhM1CClRQ$h++GIE&V`Y4v=toVo_dZUOK}8>1XXgF?NXl(xT*4hOhsd zU&E9+=jZ08=9MsfJ2P!RP>c|F=Kvz@+wR z>%XMim(4dmy7Fmip~%h$|Ns9_d0>CW`|{;!f6^0v^!KQ7y$SI%Kjc)?Jow{HCssZ+{1 z|I!>}9k>=OP>?d@3kcjZ+;2C;5JSow{r5;|twQ_wDx=3I=_CeOtIGOQVqCpvI4{e>LCA zIOIBPV%}F@M5A;6ZfEr%!6% mmTxghT_=z&_t>HQJma3(FMllbE?x-?V+K!GKbLh*2~7YsIRX;^ literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/One/32x32.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/One/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..efb66657b75bbf6dede77ccdae12e89538860a34 GIT binary patch literal 653 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D9B#o z>FdgVpGjO;UDjUkcPCiLHKN3^v?L?Hh+*ZrGaf)8o)VytOKNd)QD#9&W_})nFsGt2 zP@D@S?wnsxS(KTcQNpl>|BMw-ln*Rgl$r=qs!)=do62DNou3mZ!wHfJ&QB{TPb^Ah zh%NXJQqB!FJhM1CClRQ$h++GIE&V`Y4v=toVo_dZUOK}8>1XXgF?NXl(xT*4hOhsd zU&E9+=jZ08=9MsfJ2P!RP>c|F=Kvz@+wR z>%XMim(4dmy7Fmi;S`I8iF*WooZh3Ooc*v<^!1{NuAy`1ep@|5NE+&j>)cai=65bXr1-#b@990i?)>2w$W~wm0%`G&dy6=x$hC2y8Bm30WQ zOqe>yWbUkKO3jJ_tc&?1N)IFyA2`20er1&9#5WD`@hhXP`Sxo3`1@H}T+wv@K3l~V zZ9?nH`oZnv+mnDcWiem6d|>f*B_OkjZPSK7&x9t_`LC&3B&Bk~ zLG?!Y+T{x#M8|ykr1ovOifQUPfo!>%bAw+oGE7O%<(ZO@X8;U!22WQ%mvv4FO#ri? B{_6k$ literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Three/16x16-disabled.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Three/16x16-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..88a1f90c386e846b0cef334babce4cbc35668444 GIT binary patch literal 589 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAP>{XE zHKN3^v?L?Hh+*ZrGaf)84v>&@er|4RUJ1juGt>41#ke411(ija=@}&qYxvJt0Y&-1 zqD85RC7Jno3MHAjsSKvy`8k0yJRljD)Z*l#%mR=kgD|I}GEkfwES_1MoRbJtUBs~c zz?OcXFegYjI6tkVJh3R1A-3Q@$aJvNg7Zs@l2aMJ{%?K_6k-FZ3&||WNo82^?vgrC z1nk)G#G<^+ymW>G($Cr%7#OuZT^vI!dY4|>uYEL8$(jwhrjRq`gOZ3@&eQLZ>p zC-G1&IpX9VZ-Way55zvdILLc0z^#18`iC~R1^OAfcN~({Gdf$)aW{>{$(eC);NMuQ zTjASo1Zho8YSgP?yW;)D^ZNC+%q=XFVw(0&_$qNcbAi_q<-CWj_vK2GCI6N>@%;X& z-(|G#2+QOf$Ch0=QO4uOlwWa1cm{9(ZG$Tbd!)(&&I)ThV3y^bwYo9SHoAxPRK(Ga tD|>diU$>Z4_f`I42KRakzMtte%qflL0keE;l7T_V;OXk;vd$@?2>`GP8`l-_5S$V!nfQd&UuiCKtwGK^BdGP?Rd8Tz$*aEqYwbM5h*%0I+GZ? zctVr|ON=$7g5N-tWlaExHJw?LAT}Z^-?@9Jl>2$!uaVje0)anUUp#vm8tBi6vb<=N zmyhJrM@JpUk(xg-yHe@ha0WyKZu79I>j}qkm~9x!m($9;fry}MrPKO?dI|tshfCFSmya3Wb6qX~7a-;R)UBSqd#-s~SYxmnX0@8m z#`nJiLEr$Sp6*I=ZZiQrE%=I{>a**3*Y~2|c zdVN?;9=^vy;oHHpXR=f*$n}Zm1O7_Iok~sW=qRphpywA)62M5W1?mqUrwENp^mn;! z^2xX;in^B&+MiuP2+M}=d>ds05TY@C_sp9c-HE>Ie#x34I-GZ!`pQAGQb`k$03rl7 ohvtK^&ex(WYb_yblm0vY0=LNXWGq(W5dZ)H07*qoM6N<$f-Phl0ssI2 literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Three/16x16.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Three/16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..1825a2ee6510f1987c4d55e57d67eb1c0513ca76 GIT binary patch literal 853 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAP>{XE z)7O>#KAWJpg5~UuH{!uUt`Q}Ur6n2pMGPy~o$&w)@st3CTvCgZi!uvJGV}8oggF(J zf#O^sap(Mk%A(Blj1q=5{Aa9yqI_V{qSQo?QiYPt+*AhB@BExV8BUN)aDG}zd16s2 zLu|o+kaBLY;hDwBIf+1}MGV^yZ0QFIbAW`y6N~aP^U@g(NIz=_im^lVmlh?bGJO5t z{2HdrIX^cyHLrx>+nH(mfnsbRWg(d*IjIaQ-d$2>U|>@4ba4!^=uQ6f|Gz!6Y6I)c z&#!NXzhl0f{_MV8(Uph)RvJ&Multjdo{*9h=_yrK#c#R%^Bnh;8#t<^h}t|llrJG6QSh_#AUXDlQx|bQ}(fwbALt6yEQ-Od0zJV_xCS%@bMoHKRR26l>hzT-?YE} z&ynAszR6DAU;p2zuIii1E+@a2v3mPY)NA}JFF1F}C*`Y#UIGwU*k+fVn{};EOiplO z`2PBT4}N@nxtYPo@9MR>`IRmQl;*^NRQ>qyaq)xy|Nqal+h3>KsB`Yr!H>Roj~0q^ zOTX4nDSXz}#wNmCSNH48=`-j41xLC6UbLj`*HwT0IIq9|J~qF;Ki_`Mc0QScpTFPB zZ{D@{tzE?lAukVqzq#996n(ck^+8@J`OTg^^0U{)O@034@t+e18pL|-@9!7BW1brI z@b~idslbqs`1kkc;XglKr82ku?T>N#n^!3sWKVIzj z^}1y;BaMf-?*ISeM-CnP_W1nzc$pVgk(N96Sv?c`Ry8fnT)8`$<BtxaX?w;58K^@ri~693=D5~e!tFhNbMgm^)Pt4`njxg HN@xNA#r%aR literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Three/32x32-pressed.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Three/32x32-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..d2816b0b73839dc2b342ee5a973e0fca91eb768f GIT binary patch literal 1236 zcmV;_1S|WAP)7XQV`b*XjbZi5OxEx3tEPVq7g|@1g_8pf{<{# zn3aU|p^F)LAySJn&B#b?tqn7<-8I+4>h3vbF7KreXXec8@yywF{m_Sc;9=&SdFK89 z-e;b9p8@{sMxt(LtxM;^v8On>{8A8@h5ZK~ai85Xz7z)loU7!){dsqj(z`@v+B|5y2p-@hv$*wD7O`o!izX>S{i&20)_#0D#A0SppCOfO)}zYfxyA&^6{^ zQGlo~4v+3#yljWnms?UzqbdL~j4n#3q`|}koOmF_J0}CK1M2MgOz!NjPYHqe@BldL zW0Y!t(sHi^;lrUgCe~vcZc}byYLo`A20#hvMaB@MM{u_FnG1Zy@~;Sp0089_#<^4G zFCa=X?TPwz-~&hiu&x+d>(sCSh+&>g{BZ0wBazq*N-t2tx(O|Qc~Yj5X4jd!^9x(r z@bkH}4rRbEMgo9PrU)TUBipTF})hc8wFN2o9t z-F20jX2pGB&Lk}%de zd;lpk_D`pFibeNKrDH}~?4w;BFb$!#CTh+4o7Bl)(gg6zFfanZ*t+@mD1yul z9RR4&M~`O!Ky_b=t2s+=DNlE~H~{bu-#e3>J7WWnnWw5vJ}7_$YW3-MBP=+W@!f45 z@i{YESv-DZu-K|a2msKULx@sbc`hrhUaVL7#Cx+Od>eN;wNavO-L~lg&QvE?hiMclXCbT@f0^ zjYu1Yo$mNh$}3At9n**eepe}Lx*(o}y491G6LCH>jQ~>0jiA&;^k({OorDOnE>rilm@Mh&6h$uvBP2$Z1v4~Se=?59ZNI0_yYK?5B5!Q`>B+$U~yEN zhK~vZX6y1$(F7`HNx;7Ml#OT;o__6epC@kAWx z)SO8dne>16V<;hEV0D}M>HpX%QdCqJkp|WVZ+D1nr#R+?r$vT=viT7M0HhqyC_69T z)aQ3Dxp~Fx?HgLKnJ`*_qy#F&8Q)GqqIwQ!=Z9ZUf1p=lxu(|7L8o$RH3rms36Y05 zy$*F{X}wNV{ogh8?Qq^M$q;9h-wis{m!92MSKBh*b}496IQ`*W%fLLM;PTLVEEku! z&R%X)y?S59S$!ghE)BX>hZ}-TA9Sn+Jk@SuHnZS0dGLIvR%@22i*J3Rv-8qs-uzsj zIXmlg24YniytGa(4^9|=bcfJ>6!xLsGR+-;B@e7FlSvBqiQFn#DV$oU^vGG2kSK_c z8RDttB~Hwr613QMpI0h<{1+lo*bdWsIGs|rU>lDr9%Ib_@WRGSkr%KTFX)`CKGq>o zhPnmW|7=4-w5cO+T9@WWjF#$Vn;1GSShOzu*QeKGQAAdz`m9WYail1b@WZkLxjw6 zwmi%8Zi&=82@bVisfEyP7Kq^L?v-W45&BIX6tt2u!nfhBC7(xlh+7Sm&?$By;ylRV z&A~f`vPG&Yxd3SOxT$RNHEM9cHU`UWG_ZLcbn`}IMG)rw*mVxZ(Xgkk*u<4&@ABJ6 z@@#wCLP?GBFk_Sf;a_Ac*hjlpTZWjHZZ}aK1?34FpWxmXTx@|Z`j|yl{WZ~&$tMbn z;4sHZ?0EYoL_kY(nr&t6AJ}u?&Q^a&KsEn_=gN=x>E{c1XU*xenSNDGVpS)FGp1-qV|c&`r1F3O1;t=;d=vNURv~V`eJsQc%(1p-2c+ zr+2v(o0g&|rCE6YDA9_%Sd|$Y%X9AgtZ z$(*@wdHKy_{js)}-#M#7W3?pyE^=q3#Vg;Xd!u^NU*#+Nn)3XH`=>-d2cYdSsOn$O GCI1WAjdbn+ literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Two/16x16-disabled.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Two/16x16-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..d76f8e9f726433363ad8e188e1a2c9de8ad9134c GIT binary patch literal 566 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAP>{XE zHKN3^v?L?Hh+*ZrGaf)84v>&@er|4RUJ1juGt>41#ke411(ija=@}&qYxvJt0Y&-1 zqD85RC7Jno3MHAjsSKvy`8k0yJRljD)Z*l#%mR=kgD|I}GEkfwES_1MoRbJtUBs~c zz?OcXFegYjI6tkVJh3R1A-3Q@$aJvNg7Zs@l2aMJ{%?K_6k-FZ3&||WNo82^?vgrC z1nk)G#G<^+ymW>G($Cr%7#Kx7T^vI!dV4RO*KTo?Vf)aZyZFiRME-SGrcK_VsctSJ z{?w`OUCfl2Z)YajJ1XY&`FZ_gT=H#KpdQCbx6_H~#`n_dZA|xmwt0W%bL}(h%b{9R zRSY^h4gMbr%@TaF_$Py$Jf65slIOqTd{L*P!Dn2iUf(!o6k&3fw6~|+>l7ws0gb!@pzijHq2{$anghGSaRwr&bEWjr9L|i(+ WC~fV0&V|4*WAJqKb6Mw<&;$S}#@kN- literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Two/16x16-pressed.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Two/16x16-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..3201c42edf5578a58e6ad23b1ae505fef096579d GIT binary patch literal 732 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAP>{XE z)7O>#A)Bn2AoqiKTYIpOYeb1-X-P(Y5yQ%LXFPyHJS9LOm(=3qqRfJl%=|nCVNOM5 zpg0#u+&RCXvM4h>ql94%{~0TwC?8m~C^ZqJRG}m@H-L1 z5L@scq?{XUcxG{OP9jig5ySQaTl#^*93bKF#G<^+ymW>G($Cs~V(bw8rA5i93}62@ zzlJGu&d<$F%`0K}c4pdspcorSSx9C{PAbEScbC)|7#Np(x;Tbd^d|rL|KFb3>c_{I z%KsmGhx14P!HmerdhMCBWe*3iF#rGmKm7+#$>H7Z{36$*YV7%x5{Kkj&R&f(% z?S69i@$*dvUk%QD`2WAY&HVej6$zJH`c8{py|-siwLkCShX4EPHca<8Ri}7t!py*x z(i3TY}|4v`O#E@B#``^c(!ukEZcUe=O&yU=%DwA!p=<$8~x()u^JU1KHRGwdw zdi2JXB#u9Seof7G^SEJ_a+W$>0C? z=_jxE2}zTkmC6=NeRyijZ`jGvmVR7qovW|M9h>-HIdAkHoiWI0XzhK=K8H8iBP%mD z&7#O-KG3%dZ=QG~wtvYHtnCy?yrxYF?H@=b)O!==(1z%cKfST|NZ^UZ)cdg e^EM9{XE z)7O>#K9jh(9_MEU8<0Bo64!_l$I_CF{33>x>&|!pg?K}%WV$qxY=l_3uW~(0` zUn>89>>bV{0R%H5BkQ$i&XzqKz{09yaP0SSeo=m(d2tn)&-Lza=a<)3&`wH9`TI%Co! z-5n2kfZ&jkQGaAaWZmP-XAT@V@Zs%U>xaBs-^OaJO9rY>NJ#yEQeExWq=^$h&i8bA zGU*5_w{!9KoPq)$-&sw0Ck|hBKfAH5F*D!<*WL*ao(4r_g(oDfGP}lp-@bB9LE`T` z`56+@>gUbZuvJ_M4NERIGnfC*p0clR`tdX${Ra&BdH2KYw-$N}^qfDZ{Nbjh{_@!x z%yo4?&+InPOnv%Z-hKxt1SBLR|GWCkoS>zk`Afw0A<%1vAAoW_c-rc7M)>?>}j6-SvX6f=yT1)s{ymdKI;Vst07<7^*#H0l literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Two/32x32.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Two/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ac18c719830f2cf0b16fa8e352e0023b9f682c GIT binary patch literal 1146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D9B#o z>FdgVpGjO?-}Gon;c~E$Yeb1-X-P(Y5yQ%LXFPyHJS9LOm(=3qqRfJl%=|nCVNOM5 zpg0#u+&RCXvM4h>ql94%{~0TwC?8m~C^ZqJRG}m@H-L1 z5L@scq?{XUcxG{OP9jig5ySQaTl#^*93bKF#G<^+ymW>G($Cs~V(bw8rA5i93}62@ zzlJGu&d<$F%`0K}c4pdspcorSSx9C{PAbEScbC)|7?@o>T^vIqT9g0$|8IZTfk`Y# z#NMLx%)ejzl=)sf+LM%|pF2q?ZNg&)w;IKQ>dVg_SYOwZdjE2E+?U_i^~;>v3O{|W z-*DPzcGCPPvx)9A9`erQ`*C#J^8BQy-}*SG9*OAUHQ2b}&$pGi>kCi%zfd~K=&wK5 ze5Rnx)~}CWn(AT8%roch_f4BNJ}l9-eDGn-O-cUq_so<}G4ePq(sxZ+Dj#^6@&CU+iMD&|s&(`# zx8$7o6YdfA?BeI$-$O5odSyk$8h+Rw$NYGH%j#xapcv4o4ho|z01%vOT zxqsV>GYhvDS0(bZ>mOE6u{__k>6r25W#W3PR=rk!(vUB2$MG*YAt5a(;fMDHMy^do z{OgPi3}&>n>T$lFJFPd*(8%EAsWSdmOYggys3#l zWp^i}&gocl#?~oq;+uwk|9L0Qa`fH(^7e9iT}+nKu4_+TT1e%q9kZDv^Wo!3;hmm# z|9*eGIwP@G+9-F@n$A2~!M6-Ep8hyhAEcX}ps>mJ$E#<)XJ;nSeJA6S#j!XGkK?1b^rdHY}RXg)!^PQ z!o_no@Bi=L)0aH6+St%P|G(-kiKy<5|IFg@@7<$-HUq)g#|9H7`>zkKLxz(m` zd#g6Xm}46A6^037Uz}ZUU)i+sMXlQ|3kG=x2Gv#zorKNRmB1{<;OXk;vd$@?2>>D@ B0C@la literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Two/32x32pressed.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/Two/32x32pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..78621f7782b1233224e890a9b722877bf774f53f GIT binary patch literal 1013 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D9B#o z>Fdh=kWE%hP$s!&#}BZOYeb1-X-P(Y5yQ%LXFPyHJS9LOm(=3qqRfJl%=|nCVNOM5 zpg0#u+&RCXvM4h>ql94%{~0TwC?8m~C^ZqJRG}m@H-L1 z5L@scq?{XUcxG{OP9jig5ySQaTl#^*93bKF#G<^+ymW>G($Cs~V(bw8rA5i93}62@ zzlJGu&d<$F%`0K}c4pdspcorSSx9C{PAbEScbC)|7?=)tx;TbJv?l-g|KI+w1Cv;g zh`mMWnSa0bDf7K}v?nP^KX;N)+JvV~|NsAgd}O;>9@o8V_wIa~-}unpaEFiI&%e{Y zoqKjZ|6lh5V{yr3!9ORr?cTn6UW9ky!@I)IrcZp+pe}xX=9Lv0dzM@&l9(qZy8Z3< z|Nq~(SU>o)N_69uO)_oQL$3KL*>T;oo4#lp^FL#QKlKIArb+6t8!TMnp?GonTeoG~ zPkNoLIPmi8?c~Cf3saq+?RVN_)Gu*vZkTKMjl75DM-SYu;_azVJ9=uzt?uVjItmXg zo^0(SA@OO0_agR_JpT{aZdjl#GWp-WrMuU^{Js2t&5fq_U#?`f9&vHp-1)S3|NsBS z!c%$6pFBDL^ZbDi^@&-}l48V^ADgyT7IRuIxO?lN(#59-CU-ygS@+KFp=XZcr-zSR zm7Vxz%n#Wzr=_XGrRMiGD@FF08@rS{()cX4X2h}Coz6D-D)+eC>y*rgpT_yCC%)9J z;j=Kx&$arhz5t25f4%birXW;01Q|C0GGZ{5?LMGU$+>bDs6 z^Y2_Zl3uxR#+UEiyZu=vOrAGmLwF!ZLH>8Y`F7#wAOFa*;}w5y>wjM6%Kdv6L+x!f z66BecAJ^wp{NK~+`l8A(`sn+6ocZ%j)!Q2z8z0`d^E2{nd0t1UKtal_O|Eu4JUn(S zHlIH~_m}&_SMkN8(J}7dKJ_WDJJ-!}I&l2_f1y~OwXR40FZ6PJsyp>*$)BYi**R9OieEaDd53{)!$fY8tEL;R7DR=< zUg{h4rzAn1Cw5->ExUOP!wP1m(#knY?|*=!L$nJa`p$z4DU?6 WIM3ZXy8)QG89ZJ6T-G@yGywpj|IGFP literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/lowerLeft/16x16-disabled.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/lowerLeft/16x16-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..e8755e7d150b065853605fef458c89a89c64a637 GIT binary patch literal 498 zcmV3YthNdvuA^0RQ4t1ZXfp;;izt(lZ;_PEi~EYVFwf?4&v~ckf1Xp6 z&*x3EisSq9e*wu9d)3&8ddxuq-_ech(-l~VeP}}w-eUx-aRr|vt{WxTku6Y0a$Nn#j@}>>i_@%07*qoM6N<$g4Pt(n*aa+ literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/lowerLeft/16x16.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/lowerLeft/16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..bfcba46a494518b3c914b3297fb92fde0279f191 GIT binary patch literal 1001 zcmV1L+#Vx|zlZCD&`ghj{#6;wb=TWmoVXrWNrLQlJwX*Bzu|J%b)n3_-H8NO8? z0KgwuM^&XB09Xve00855yO5oe4FJ#|)IayI@qd&6_P4ftzT3OFAfl+a^8LnCTM>no@G)1EkLLijQ3z9_tj89A#X>v8cxm-`y{?nNOZ~(ju z0PK}D9{}vWKYs7zfTgdrvFUh=?(Kc&04&bfYyiN0B}*L!5NZ9g<-F55Ye=T)QJ>G3 z2Vf#5SCbdqr>QE&(`(7!m;5Mn*;&Xqp~c zUk?}yc5Jtml(}%sw-dSW{bf z-07J8#%{AW350^7m6eqbgMpyEN?)0NvF+Pa!bF}UCp+s8B0I0(YYvOpw!sib0oc!+ zIlZ%@Z13+vk;1RhZhsu!49(dcjuQYLna%AuTv-kPzX}A23IJL*k1tfwbn@T)goFeD zh!U)^U3+x52m1O;wxqAllpiQNLDMovI2_ghnCiIJ$=vMj>1@Anp~cY9P|T({5&rPd zowQxAzYzg|p6=c%_Y-$I5W(HS+ppdoyfqC(0RX3(TMtMiQrFeXX48?n+SWIVb;E42 zH09xv*Z&@eOO49q^i!o$c|9{TW3K)Cc8}ZT3dv+NHxvwVLmMI6n04G=tlL{CrIn$c zu3k+~SMM@=bj*5X);U|w=ks;(RP2KXet#c;m;PF~^EDhgdgF`1 zYCb(fy-5(9#AiiK5s#jmw#O*S6CMpJ(<=qYsFL7lq!GQj=}x!RDTu< z1^)sN002UrTlnHyZEC7Q@AE8Z=jZ3NzSUJBkH_<*rK=ZG)098N$5EF6Fw*4Y=Z1d) XuJ3`YDw}=D00000NkvXXu0mjf7|h_= literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/lowerLeft/32x32.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/lowerLeft/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f33ce0d87376420efcc3fc3443839c716ead9542 GIT binary patch literal 3001 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 literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/lowerRight/16x16-disabled.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/lowerRight/16x16-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..e59f2d0fda33660280f3350b7ebba79d93eed800 GIT binary patch literal 507 zcmVfEW zCa=kAgtCy$%fe6^iIOy#-juR1Sr8kFntY5Y-k1d@3wAWKu|Pf+_uTq>n_K^G_kYfL z?(;n7+!>Wh#Wbr49e9Et*o7CEs!wdFJ8y`6IS%0rYPf|m1|vRqI)G|?>o9@G=*AbE z!ZGZ`eY9gvrkd9;wBjmy1MDf@Mtn4G9>hiT;Zc!68JDpQ*U?faZp2c&L>m_1G#WEN zC$``St_8@AkOONmjCq(0hVAId63SSF-9Zfw7v#K;e=G4dq)p&pL(rRvu7W3h7{F$n zlez*wWB-mjXvqZ&@w$)zCov0KakCBpKA_Zu-}r|05txm$DB%R&VR6Ko3jmuinN1wQ zl1N;Gp16HTGVWdgl_Gx`_M(;n?&2?w;te+9g4DJS?8A9H3(vZxHrKKTpKwW7YVtO~lv!U-GQHLP!7r002ovPDHLkV1o3H+JXQ8 literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/lowerRight/16x16.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/lowerRight/16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..93f85bcaf635d544605cd165a4c297fe4c1daeaa GIT binary patch literal 1095 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 D210fW literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_bold/16x16-disabled.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_bold/16x16-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..8f52437e111254da2772d623a611397778dd79cc GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5he4R}c>anMpx|;( z7sn8b-no-6@*XnaafuHUPiWo1q+G)0_JZrF@%$2&h(^H|T(S!z8wDRIdu?1JRy9XN zbJvOGn`>7l^)N8b_|eC5r{UhD-SVztj5`>v>oQHXPXBz3srsrTzs+1}&jZRUnPlZ} zm%m;Xr&+P~19QQqmRnBDHrqIU=*l!)>?m2)ETr_>Md-tXVu2HkS`w#R?=n4!JoDc% pQ*oklZHgj$r%kTpf4;(F(o$LypEa%=x(ReLgQu&X%Q~loCIFybSHl1R literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_bold/16x16.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_bold/16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..a1288de8ef9a5534c4245366759c0b86a8a1aa42 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!Nr~~jv*HQM<<^ZbTANUx!feS<-wCDtAunj z9J!+|0C@{obvO8n>HGZiD@)VAzwgbHnFfn?WqMciSG4~Ad?1=5h)b{E<{QTaO@)1| z*Ivu$NklTTaJxL1J!@shT81L-Pk9W>!e?~IGcKz;GSfXq(L-0D-kTv=+hgAf$?vuW z2ci|2-e2jd=5Dyt)Ov$Up}e(mqA2^jrjDf=fB0;^{r9myHG}yn+qDxDne>f;&Smg) L^>bP0l+XkKDP>@} literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_bold/32x32.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_bold/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..8f677e7500b84379f3b54242255df7cd085411d4 GIT binary patch literal 774 zcmV+h1Nr=kP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0-H%hK~z{ry_ZXi z(@-46ODQ6Qh=@i?kuIb%h%(w&-pSNXlXP6T5?5{naqAawG2q7#mwp6SZbcU&u0%vv zE*#%a9AT!_bD9>Wx$RAw#2)xg5mae!4J#r--TZ>v`wzc zEYq|wjH-3jv3DZXW*KDxAqK5>M;rUcN(i9Y{-CLKzQm!~-XMDK1j7kF!}~z^2)Tp+ zZKL}Y?Uz6xf&Ev(jYiwuj(U(*d;KQ*W7mW@1(x>-?G z;QEkC4B!MihV9?u-Y&y*`Y#MO_!GTfwKjI(+XJ!lPl*9C(9|z-2jnJI1+i~WM(pu>8@ws4J9;uIt+Mr2Zu&VtRE10Lz*ABO@HgxTNc3=utDPZg8Q?;r2Ok`B5-Jq_0TZnzWwOtdv;Y7A07*qoM6N<$ Ef{GSm2mk;8 literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_italic/16x16-disabled.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_italic/16x16-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..04e982c12b00e6e76582b13002277a278c6c21a9 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5he4R}c>anMpx`V| z7sn8b-no|!@*XnaX??i9gEfIAOhb7C)0zVu1#c!sCa{LR;EHV&d~iW2bfS>^N7ao} zzyFT(Gv{gcu_^G*a_@P4NNxEs+3Qd37I_~PWGFlR^OS7|!}6)kY7YIJ@5K(>v~dcP zVRZVvwLy*Dman@ai!r2hJ)_8Tea1syr!ts-{$)2&Vw>kbllTAMKkBaKoW`VQ8hc%^ c_NhT#CxiI*mN&j%fUaclboFyt=akR{0JTb1bN~PV literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_italic/16x16.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_italic/16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..aa2112745b54216467bbe9fc5ee837975d414d1b GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!CFrj#}EtumdKI;Vst0PAf>Q~&?~ literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_italic/32x32.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_italic/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..fc73d2119b4c896195dd24d3da22af1fb58b85fc GIT binary patch literal 673 zcmV;S0$%-zP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0yarRK~z{ry;sXF zLs1lMZ*R3tDfJ5Ct)ZbF?QMH+ixw^V3H*Ub%n3d~{DYAJBO{5Sk+A_Y3Go5M52&>r z61Ec&x%;kU4V=Aq_Udu=MuobAP%>pzQfX&5SFBv=k`nWC z)!XUp+~L?nrb;m?)ExxDR&W@!@C%=L^4x6Y7Pc&y0NX%{aSeXZ1jAr=##uP$0!GJY zwqWZ5BOksLBZ8Pczw*EYyyAQiboJV`2$*J^C9h|TOII*;fX2I%APhXRbuM6H#@>Og zNx8_P0gvsB3+U|bwP2IKexT7Qt$wQj{QZJ+dVJ#7@9Q5LO?*vGOy^6dFvXRJECQCZ zu*U@?C#?cx?^!eTZEc7?G;y}es00000NkvXX Hu0mjf@~1O8 literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_strikethrough/16x16-disabled.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_strikethrough/16x16-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc68efdae2b01e5d81e510757de89a1ea8e8d4b GIT binary patch literal 373 zcmV-*0gC>KP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0SZY(K~y+Tm6Jh^ zML-aSt6wGv3#^>LUEDw-aSI2qcMB^=a22tYNUT^8Y~DHn{ESE_Xp z&o4j$Q|r32JFqMZgb?h0xD}|X3Yw;2CliJtBuT>V;K3`g@4NOe(zY#Z+s5wTgI8jn zXI21dnu729q{nfDvMfpC9@8{QBT@&~I|e~O1u#&bsNX>F7~J?fsvFbr@;*L9o* z((m#ZBG2>NGyVtB_x*Q)X`1L6ktmA5bzRb!uj`t09LL~!9%)3HgJoHuC<=D3$+8R_ z$6@zk4&I^ek>=ovZVptW4zB3tKt)^N+Ujpt(@x@FG;;eJ@g)%3wrM?iod@^?ENO*! TZr~R`00000NkvXXu0mjfr+t=^ literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_strikethrough/16x16.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_strikethrough/16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..9338af73a03cd47d09f1247a2b17dd61cdab823f GIT binary patch literal 343 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!8e{Rjv*HQb0?kVV{{a7J>Hg(7}252{iiWr z@W1Xvj|hQ{36CY6cDQ>59s4rl#giqg^TY4fxdm2fd+4bz4h4ik&?F{;|J#ptP=Ys?)FItVSz3TO+u- m?&&V6msI#5G$Ci@FX1a@LEn8<&zu1Io59o7&t;ucLK6U*@r>U9 literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_strikethrough/32x32.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_strikethrough/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..58b695a2a67ab09d233c452d2d9e918eed543cab GIT binary patch literal 452 zcmV;#0XzPQP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0a-~zK~z{r?N`YP z!Y~x<(dFQBb2+HrpjZ89@uJ`2RS{gkcr_*WQ%NUd7%SIi3 zn*zv*KBiDy0vlj2fSeUDi{)Yrp*!$Yg4ax9n3yYXoHe@0YoG#wZN|U@^Am9J;D~i{ zjENoQ)jTFzxR|0wkn<71br*)IF~g_Xb{+%GwBd{(pFGs%H3y$YKOQavAwex)G^Q2Q z@=F8a8*nw1wh6^(X5D-kSlf!*kZZB{)JZM^vcbZ6Y<_Zus1G-MXB*&JEIxI-smA?o zCmT!92iO}f^c*D%C8rotb`#P-7ht}-(6J0i$tmsvJ6Ko_iu%q3{4QHEeiolH u`-YY;8X$o;H2(oYH#cHh{#zyrBfS6}Uq{AJx{Kcc0000anMpkTYF zi(`mI@7oCnc^w=CT<>?WeR1K8TEKeTc9kRNmIbU^H5yM(Fibmo@u0uj zF52YDzoa;E6Z?nIx`X1ZuTSrsyt&D>YNmt^Z@KW9OS4-R7|QHqWLq#zs?l>_^osAU z7U3J1L@%7)b}RD2!n_35_9asnzYo44$rj JF6*2UngC&PQP=s1TTF$|urelF{r5}E)xt4O{8 literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_underline/32x32.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/text_underline/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f248875d5a23cb0b54b380882ac48d0e991242a1 GIT binary patch literal 593 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!hG(8Gjv*25Z>OL2VoDTgyE;YZq<}Mz=C6rD z-n?h`|IrT0zPM?f@(Z@8YrG|ljF^_V%?+op8-9i?bY;(&8!-EuQar zZ<+q*iex|MpQ+C-CT}hM^VPYNHRO~a(=PUTLZ4SpF?D)c_1sh3TW3vBpTITS4^tvM zmaY-hyL#*Vu85?-sYNX--Zd^ilB4^G?*S70@Spj~>9y9ebIytJtGo-%jQ+6bB2e#+ zwTwCsoU+Je?Yg}_XEK} zj-iRXX1-IT@0#CT5R!jC{c|<<^XQ&u-w;Kk44G?fk_p1*yw#R7jW^|4{6$vdNNuBPhMpCYcJ_b_p@mX2|^BD_|!iSp*Vm*{km>L#c39$Zl zE$o5FX2JJeHOn(ucB;9ZJE{LnpJz{iU(=U>wPy^qV}$bjIw~$FtIX&NKE40GO2_sx ccAI(mXSA;HxUWzD222JFp00i_>zopr0H;m{g8%>k literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/upperLeft/16x16-disabled.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/upperLeft/16x16-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..0e8dd60a321b02e80c15b0496144791e5d0d50e2 GIT binary patch literal 504 zcmV~Pw{a79@TGiE760pT0o(8q!&rt<<@&M__&&b$ryYaLx$ZDM?tvi3a~te9aWbumv+40N&sz9^ep8$NgVP=0BLI za0abd8v!F>+oWNt;U0Dc$fTr9Z|*@~G^$7H@;Ek2n!{l9;B0_QVPED`NzxscW`97E z?Ooi%;-I-RD%qQ}X8^b_P1bN^x{TepE)7>#P^;k)re}b>3qNo-f_w2?nz&JEz}89I uI2d5h8Uf&Y*d5YxJq^GXbV#ZwAHzSm{&A36ZfJ`D0000QR~V|I4;PKgDX0{ z<4#POLLQlBr54KA86C<7+-5io0@jL;(c5OjeZcl^{gWNfU(X-U@A>aX$dZ&;mZvk+ zs-5)wpKH8+()GyYocv>Itmx$(r9WN0{B=*usZ)IboXY{0b=>l}7m{p#8;=`7(eu;S zvU4`tes@1y>vnr*rl)6?f**AqK>uTiAi|>ofZ}n&v&1P#)N?sk6saDlQ z3j{_0^yZ=>5FrNNUi}UVbq1>UQ~Y!uAwq%7*x0!Ca5np< zOeXU!Ed|N}Z~&|WP!Awed$CKZz1VeQ@4o$?d~@l`8fikJOq!4g(&ex#qF3 zMRW`k42IV0ZuPw1+|+!zWb5<#fq}bOx?A1vzP;y-drrsS%Ayyxw1h%I!tM2Jb9+5t z&Cbp!TUC<^}D!rsoQa+S3(^F#tYFAfBBV zv*ZByoaI_r5QyU>W&ki41_59Z@MB$GfgzF~73|gNKgh}3unRy404jEAK*b2>owQxp z^jT{d$>;MOH0@YT(+-HmB8bHzHo%~G`_`QS|KiN>&~TN>WIkpxnQ?#QJ`TQfh;6f3 zRa`FbA;T~r6B3i{W|O&u&yS2$s?=EY`Pe`RB9YiSWwjm_J|P^iS#5^|l;C7pWkcUM-_OQrFA00_%opL;JDWD4{;eR*kFSvyVB-dA5M9aO5+{S*})>e13`*ly z0zg{VSC^*DCbNXg^Og>*yCPQR94qC*zNYyclz(7Py#`xeQs_9K>6|m0N?@ebZ9Sp@zS;zEuH7IABy9I zGpTab4d*|PWPA5jeFWgQy4w1503-j~xXers0JOH9)&QV5?1*0g+$=2I#2J0?>xNaU gp0fV88(GHSUyZzl>A1vL7ytkO07*qoM6N<$g6SjdAOHXW literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/upperLeft/32x32.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/upperLeft/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ec9686ffd46f49312fe8acc20265598fe3bb47 GIT binary patch literal 3055 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 wz)OadfQ z`B_V>*XtDvA|hPz@d=DT9Lp>$*bD%e9fpJd5}GKJALzOL<$I&U zLj`eC^-N|~Zg+IFc-p>b%QTIRmbp!q=eG&Y(Z2$L=K!z(K;>(n1pq!x(}nG=H|jke zZ|pm@buUm9b(zcM8aW)!P)cf=aZhHpf#!v+(!7xUUe-|%40s*b+L$5sX%6fd^xN&W z)Q>-H(g1M1b@m)+9uIc=5+qV73JdcAfZ7NKOU-7>`N6^8R5H2jIA_uB1c2)zkw|^% z%GJu&mX^Taz(6$3rIP^!|0$i8zDrD!#4lE>^;fA(e$V6aXw+);De9)7TS$;wi9-WF z6=;hNwh1D_v-^9yhTQDxYtGf>s$jr>#-4YJx?F5;N$KG!ZE|xqscWmoqVG*1FtYMOF3Ls~v{US%zVhk&%%NE~hh3 znXLRsu8>`ByV2aNOiFU^$=cfs0F_m5R!mP%6B0@Mj~s20_IqifWY*Z%KQl5slFa9a zHZ3hJ<>ln$Gy=FZH)DY$A$ta0Ru4-4r00000NkvXXu0mjf&aLh< literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/upperRight/32x32.png b/usr/autodesk/CPP/Samples/CustomGraphicsSample/resources/upperRight/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..108a368d7e4e1714bdac9eeee2e6b600cb11642e GIT binary patch literal 2972 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 Ctf2V- literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/SpurGear/Resources/SpurGear/16x16.png b/usr/autodesk/CPP/Samples/SpurGear/Resources/SpurGear/16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..c12e3740fc021ce6302a3e4ae582b6ce216d48d1 GIT binary patch literal 965 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAP>{XE z)7O>#9vhFinsnikq+4Ji*N76w(vpn)B8HXg&UgTYcuIgmE~&-IMVSR9nfZAP!kmiA zKyfaRxO09%Wl?5&MhU|j{xeoUQ9iI}QEDPcsX|F+ZYqQ6cYaQw3@1n?I6tkVJh3R1 zA-3Q@NI5sy@XX@moJ63~B8Ke;w)6vqIY7eUiA8ytdFc!Xq@T3|#n>VGON)|I8NU8+ zehpLRoS&PUnpeW`?aZ|OKruFuvXIP@oK%Jt?=Gn`FfdKk*tNas2=D zH*a!`FPc3!yKd)mS43o&=gEErj-{oG8y8;co$eSHmDwsO%3Au+RXi}fcGZu@M!`!< zF7${jT_UZowTiWP+uXS)%l2*CynS`&?Jdt=wSNEq@818<&nq>YIKFAS26{zI>wTlm zaNy0y6%~nv3(NnWer~5IXZ$^WSJdanzqc>G_eyGi*y^dpUqg;D9xr@X`G5Aml_yWe zwI7c25EM<+w&+<;*-t})wmS2B8_Y~`enTOxJS^clGv(s+YGH&PSM3=`#5w(gj zPxbyDyI$%sN#o?E7$=U4PZ%$~+;T2W`*Eua)1nCn%6i-@v|A3WpI`BQe*3JTjb9Q! zzI$-s>Dj4MpPt*pBWGV_VPyXOmyPH0g^496Y8D#tM9k%rIiFnlGdVU&b+%l8y6Jhx z>f=Ad{*kR)uYS92-kz2*>s-^4 z5K-1Du>~0!TXnp0&90c6^p?(j`|4)lgL>=ohrcd7@X0&Ga3I5E!c-9pJ+AVp;<~!( z$D;hV@uj>oJ$(4E!Stv)X&zPq)r&_y2NvtKEYgtZb@S-7sIco=w(Rj`wr0gmj~A?1 zp>gGI@w-KL-`%)zx>e<5fC#JDYTmT&weOz3=-#+SfKfrH^NOC{p4S4dnp>;)a4H5& zQDJdBaxI?k_Qo6P_ci0=&ftCrd@xCUm`)*jxWz|pg6nF5E9OJLK*6ekOjmeX%rJ{NqI@852wougGQ&8avm z-GBZat7|u2?5}@+u6Wk6+_3DM%deT;_b4v@tl}E@s-AJTwg88WVvB*^^z2;wv-Zc| W%dc0j@u&i(Rt8U3KbLh*2~7av0i9C- literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/SpurGear/Resources/SpurGear/16x16@2x.png b/usr/autodesk/CPP/Samples/SpurGear/Resources/SpurGear/16x16@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..efa3cd1ff5f13540169175a2e922a5c291c87ef4 GIT binary patch literal 2058 zcmXxldpy(o9|!R7*k;p+xfPPj4y!X!E@_8^7W1Q)gj^28*mhioVJc;j&U9g_<>Wer z=8{}Oa!WMY;z%PAm5>}pLhHnS)9>;7E!5GfOlW$A|nJ{Mu$mpA+Z!1oe~`dsKE`4WUjdBPSLcaSV}mV4peRxVr8oQQ)5ZQ z&8R+|5=jEA*0#cB6Zq!jM06NEkr+z?0%+3B_?Dl`DRChYL|HTzXzZxZlre0Ry@|0= zl&El^LudMu%oP52KRz~u1guC?=l&maijIsVMbUv(A*Wqt(9M`9g&siy?k&7Dk%0(* z*um51VmBu_LTzn3zdiBbXyVNBfBt!mAIq^x3*7|{c7=tOxWCLk#5EfMkN7^c%wP40 zl!m_C_*~C+b<*)`G`QOEvYrwpMU&^iE`rj%u6L|-VD-UfmN_=y8BxsQoMftRRT6cc z?tr@b9-FoLBOd!UZlYhDR4}n@n^uhec3xZ3j(rwfa}=K~T-$OexgZnba8E~1Pp^r# zRG3<<@7w(N@eyU+PvW+nfTO#jA=_n!r6yJy%W2*l)ac#mMLd#zEa+SUw0g%z%&n0K zcrs%nmFW`tWZ8d$=};lUt{(!P@$Hi&jqQ?^BJp#6!D{}Fd%Rksr+hZPjDXfWE(fpT zD4F6k$H4gFnn#e)MzPJ%^2Y^nImE{T65hYDvREjkQwhQnQgK;f+=YDN^l+unSy~4eU+)c1^fWM=rY&`n zDl4kw3i~>Ot+}Po;2aWHlofOe`hG;^u0L{lnJDb*b5IA{HqWsJ0ewMjQcTRiB+cfm zIRx1TYi~^`St@{ zNH{GI1O)BfZXiI?v8G=nwqJ^Y{DD7rhb!gvX)n%V!e+wkcIMfOdF8P|`)oiw0&Q*W z{M7iap3r?&{Riv%y=Q*EWLYQ|3aQ1Umd@TZ7$hIOXzKdlq*pPIr+QAh&G^Fp#n+Sh zJ=3vGU#bN~F31dz&dK}$Ba$e_*~ATn3?lFFVA*)|qSVp)u;R))Y>Sj*CGXZUnL~dN z>wFh82ilF=>R~vJxhkSKlD|j1@Yas+32O4+BlQks^j4r1-Hg?QVS@o6po9GJ(A-0U zI;1$~66Pk&R0Zf?X4Hr1P|GW_QFxB&p`eqhQR6KnR4u&%tKK|ofd5bc2#hlfkt}uH zgkKvPqSD@af#kqHLPA~yx4qUyK)+WGJy+q!utjZuBy`5j^x3TqEd}NoxBiGfOaCtZy6(0UcF{5a`t>JF4<7ge zK?`EUH&DrQw9b`>DMm*6aeI)OT3Qa2c=D)72?q*ZVhmGLG*lUr;m*fouOXsPf13Ca zQG|Al*A6`ebx=|1wyhn(G$fu?^&5S&S51*wGD}$2y4~8^dgk}Q`9?#zVfo2qOZSPk z)6{NI(18GilamT~8$x%(`YcqIaV|Ljo-o30HSC@EF_Z|cw07Q?`+`aI5q%JFJ`DCu zfo<}wQcx)u6-A>soKDS$0J{XOtv!~Nfpf`DYsT)6Sl#^q zqi_n8P~W(9er%+sSo!&Q9rvky6H>Xq0vXugnyaBUY;rtcvg_Kl0NQ>_Zl^CRPha2s zoW`v^0iS*6>!ux%m%FiMfz9u@6gw0zZK{;sSS*~`QdF;=*GC24cQ4{D5#5d+HN1Jn zNc(DWW4O3yqpWbdCqxASwX>{J0MeeSzH0Wzqdi8*=nT1nWAb2l9ZUY{C)(#sacUSj z$6YheR??PB%&}VQvO4ki`1nF{?ArLC-I>)wy$!*s{xc@$#MaxcG zLv@i$#Iv?JmO3`#IeXnN3}3&AM`pk+!BoYAH`fPz*o@Nu#7*C*=Ws zeD)&(+Q)~J4^2s&SlL(*^6U`=UppU8_w_1b l+NHB0YuH(N1qNYtr;6<-rWMEQrR>WC@VKLg?>h!v_%EJ9wMGB{ literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/SpurGear/Resources/SpurGear/32x32.png b/usr/autodesk/CPP/Samples/SpurGear/Resources/SpurGear/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..efa3cd1ff5f13540169175a2e922a5c291c87ef4 GIT binary patch literal 2058 zcmXxldpy(o9|!R7*k;p+xfPPj4y!X!E@_8^7W1Q)gj^28*mhioVJc;j&U9g_<>Wer z=8{}Oa!WMY;z%PAm5>}pLhHnS)9>;7E!5GfOlW$A|nJ{Mu$mpA+Z!1oe~`dsKE`4WUjdBPSLcaSV}mV4peRxVr8oQQ)5ZQ z&8R+|5=jEA*0#cB6Zq!jM06NEkr+z?0%+3B_?Dl`DRChYL|HTzXzZxZlre0Ry@|0= zl&El^LudMu%oP52KRz~u1guC?=l&maijIsVMbUv(A*Wqt(9M`9g&siy?k&7Dk%0(* z*um51VmBu_LTzn3zdiBbXyVNBfBt!mAIq^x3*7|{c7=tOxWCLk#5EfMkN7^c%wP40 zl!m_C_*~C+b<*)`G`QOEvYrwpMU&^iE`rj%u6L|-VD-UfmN_=y8BxsQoMftRRT6cc z?tr@b9-FoLBOd!UZlYhDR4}n@n^uhec3xZ3j(rwfa}=K~T-$OexgZnba8E~1Pp^r# zRG3<<@7w(N@eyU+PvW+nfTO#jA=_n!r6yJy%W2*l)ac#mMLd#zEa+SUw0g%z%&n0K zcrs%nmFW`tWZ8d$=};lUt{(!P@$Hi&jqQ?^BJp#6!D{}Fd%Rksr+hZPjDXfWE(fpT zD4F6k$H4gFnn#e)MzPJ%^2Y^nImE{T65hYDvREjkQwhQnQgK;f+=YDN^l+unSy~4eU+)c1^fWM=rY&`n zDl4kw3i~>Ot+}Po;2aWHlofOe`hG;^u0L{lnJDb*b5IA{HqWsJ0ewMjQcTRiB+cfm zIRx1TYi~^`St@{ zNH{GI1O)BfZXiI?v8G=nwqJ^Y{DD7rhb!gvX)n%V!e+wkcIMfOdF8P|`)oiw0&Q*W z{M7iap3r?&{Riv%y=Q*EWLYQ|3aQ1Umd@TZ7$hIOXzKdlq*pPIr+QAh&G^Fp#n+Sh zJ=3vGU#bN~F31dz&dK}$Ba$e_*~ATn3?lFFVA*)|qSVp)u;R))Y>Sj*CGXZUnL~dN z>wFh82ilF=>R~vJxhkSKlD|j1@Yas+32O4+BlQks^j4r1-Hg?QVS@o6po9GJ(A-0U zI;1$~66Pk&R0Zf?X4Hr1P|GW_QFxB&p`eqhQR6KnR4u&%tKK|ofd5bc2#hlfkt}uH zgkKvPqSD@af#kqHLPA~yx4qUyK)+WGJy+q!utjZuBy`5j^x3TqEd}NoxBiGfOaCtZy6(0UcF{5a`t>JF4<7ge zK?`EUH&DrQw9b`>DMm*6aeI)OT3Qa2c=D)72?q*ZVhmGLG*lUr;m*fouOXsPf13Ca zQG|Al*A6`ebx=|1wyhn(G$fu?^&5S&S51*wGD}$2y4~8^dgk}Q`9?#zVfo2qOZSPk z)6{NI(18GilamT~8$x%(`YcqIaV|Ljo-o30HSC@EF_Z|cw07Q?`+`aI5q%JFJ`DCu zfo<}wQcx)u6-A>soKDS$0J{XOtv!~Nfpf`DYsT)6Sl#^q zqi_n8P~W(9er%+sSo!&Q9rvky6H>Xq0vXugnyaBUY;rtcvg_Kl0NQ>_Zl^CRPha2s zoW`v^0iS*6>!ux%m%FiMfz9u@6gw0zZK{;sSS*~`QdF;=*GC24cQ4{D5#5d+HN1Jn zNc(DWW4O3yqpWbdCqxASwX>{J0MeeSzH0Wzqdi8*=nT1nWAb2l9ZUY{C)(#sacUSj z$6YheR??PB%&}VQvO4ki`1nF{?ArLC-I>)wy$!*s{xc@$#MaxcG zLv@i$#Iv?JmO3`#IeXnN3}3&AM`pk+!BoYAH`fPz*o@Nu#7*C*=Ws zeD)&(+Q)~J4^2s&SlL(*^6U`=UppU8_w_1b l+NHB0YuH(N1qNYtr;6<-rWMEQrR>WC@VKLg?>h!v_%EJ9wMGB{ literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/SpurGear/Resources/SpurGear/32x32@2x.png b/usr/autodesk/CPP/Samples/SpurGear/Resources/SpurGear/32x32@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd0d3dd857393ebea2a86f60b2f201da8f75d9b GIT binary patch literal 4997 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#define _USE_MATH_DEFINES +#include +#include + + +#if defined(_WINDOWS) || defined(_WIN32) || defined(_WIN64) +#include +#else +#include +#endif + +using namespace adsk::core; +using namespace adsk::fusion; + + +// Globals +Ptr _app; +Ptr _ui; +std::string _units = ""; + +// Global command input declarations. +Ptr _imgInputEnglish; +Ptr _imgInputMetric; +Ptr _standard; +Ptr _pressureAngle; +Ptr _pressureAngleCustom; +Ptr _backlash; +Ptr _diaPitch; +Ptr _module; +Ptr _numTeeth; +Ptr _rootFilletRad; +Ptr _thickness; +Ptr _holeDiam; +Ptr _pitchDiam; +Ptr _errMessage; + +bool getCommandInputValue(Ptr commandInput, std::string unitType, double *value); +bool is_digits(const std::string &str); +Ptr drawGear(Ptr design, double diametralPitch, int numTeeth, double thickness, double rootFilletRad, double pressureAngle, double backlash, double holeDiam); + + +bool checkReturn(Ptr returnObj) +{ + if (returnObj) + return true; + else + if (_app && _ui) + { + std::string errDesc; + _app->getLastError(&errDesc); + _ui->messageBox(errDesc); + return false; + } + else + return false; +} + +// Event handler for the execute event. +class GearCommandExecuteEventHandler : public adsk::core::CommandEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + double diaPitch = 0.0; + if( _standard->selectedItem()->name() == "English") + { + diaPitch = _diaPitch->value(); + } + else if (_standard->selectedItem()->name() == "Metric") + { + diaPitch = 25.4 / _module->value(); + } + + // Save the current values as attributes. + Ptr des = _app->activeProduct(); + Ptr attribs = des->attributes(); + attribs->add("SpurGear", "standard", _standard->selectedItem()->name()); + attribs->add("SpurGear", "pressureAngle", _pressureAngle->selectedItem()->name()); + attribs->add("SpurGear", "pressureAngleCustom", std::to_string(_pressureAngleCustom->value())); + attribs->add("SpurGear", "diaPitch", std::to_string(diaPitch)); + attribs->add("SpurGear", "numTeeth", _numTeeth->value()); + attribs->add("SpurGear", "rootFilletRad", std::to_string(_rootFilletRad->value())); + attribs->add("SpurGear", "thickness", std::to_string(_thickness->value())); + attribs->add("SpurGear", "holeDiam", std::to_string(_holeDiam->value())); + attribs->add("SpurGear", "backlash", std::to_string(_backlash->value())); + + // Get the current values. + double pressureAngle = 0.0; + if (_pressureAngle->selectedItem()->name() == "Custom") + { + pressureAngle = _pressureAngleCustom->value(); + } + else + { + if (_pressureAngle->selectedItem()->name() == "14.5 deg") + { + pressureAngle = 14.5 * (M_PI/180.0); + } + else if (_pressureAngle->selectedItem()->name() == "20 deg") + { + pressureAngle = 20.0 * (M_PI/180.0); + } + else if (_pressureAngle->selectedItem()->name() == "25 deg") + { + pressureAngle = 25.0 * (M_PI/180); + } + } + + int numTeeth = std::stoi(_numTeeth->value()); + double rootFilletRad = _rootFilletRad->value(); + double thickness = _thickness->value(); + double holeDiam = _holeDiam->value(); + double backlash = _backlash->value(); + + // Create the gear. + Ptr gearComp; + gearComp = drawGear(des, diaPitch, numTeeth, thickness, rootFilletRad, pressureAngle, backlash, holeDiam); + + if (gearComp) + { + std::string desc = ""; + if (_standard->selectedItem()->name() == "English") + { + desc = "Spur Gear; Diametrial Pitch: " + std::to_string(diaPitch) + "; "; + } + else if (_standard->selectedItem()->name() == "Metric") + { + desc = "Spur Gear; Module: " + std::to_string(25.4 / diaPitch) + "; "; + } + + desc += "Num Teeth: " + std::to_string(numTeeth) + "; "; + desc += "Pressure Angle: " + std::to_string(pressureAngle * (180/M_PI)) + "; "; + + desc += "Backlash: " + des->unitsManager()->formatInternalValue(backlash, _units, true); + gearComp->description(desc); + } + else + { + eventArgs->executeFailed(true); + eventArgs->executeFailedMessage("Unexpected failure while constructing the gear."); + } + } +} _gearCommandExecute; + + +class GearCommandInputChangedHandler : public adsk::core::InputChangedEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + Ptr changedInput = eventArgs->input(); + + if (changedInput->id() == "standard") + { + if (_standard->selectedItem()->name() == "English") + { + _imgInputMetric->isVisible(false); + _imgInputEnglish->isVisible(true); + + _diaPitch->isVisible(true); + _module->isVisible(false); + + _diaPitch->value(25.4 / _module->value()); + + _units = "in"; + } + else if (_standard->selectedItem()->name() == "Metric") + { + _imgInputMetric->isVisible(true); + _imgInputEnglish->isVisible(false); + + _diaPitch->isVisible(false); + _module->isVisible(true); + + _module->value(25.4 / _diaPitch->value()); + + _units = "mm"; + } + + // Set each one to it's current value because otherwised if the user + // has edited it, the value won't update in the dialog because + // apparently it remembers the units when the value was edited. + // Setting the value using the API resets this. + _backlash->value(_backlash->value()); + _backlash->unitType(_units); + _rootFilletRad->value(_rootFilletRad->value()); + _rootFilletRad->unitType(_units); + _thickness->value(_thickness->value()); + _thickness->unitType(_units); + _holeDiam->value(_holeDiam->value()); + _holeDiam->unitType(_units); + } + + // Update the pitch diameter value. + double diaPitch = 0; + if (_standard->selectedItem()->name() == "English") + { + double value; + if (getCommandInputValue(_diaPitch, "", &value)) + { + diaPitch = value; + } + } + else if (_standard->selectedItem()->name() == "Metric") + { + double value; + if (getCommandInputValue(_module, "", &value)) + { + diaPitch = 25.4 / value; + } + } + + if (diaPitch != 0) + { + if (is_digits(_numTeeth->value())) + { + double numTeeth = std::stoi(_numTeeth->value()); + double pitchDia = numTeeth/diaPitch; + + // The pitch dia has been calculated in inches, but this expects cm as the input units. + Ptr des = _app->activeProduct(); + std::string pitchDiaText = des->unitsManager()->formatInternalValue(pitchDia * 2.54, _units, true); + _pitchDiam->text(pitchDiaText); + } + else + { + _pitchDiam->text(""); + } + } + else + { + _pitchDiam->text(""); + } + + if (changedInput->id() == "pressureAngle") + { + if (_pressureAngle->selectedItem()->name() == "Custom") + { + _pressureAngleCustom->isVisible(true); + } + else + { + _pressureAngleCustom->isVisible(false); + } + } + } +} _gearCommandInputChanged; + + +class GearCommandValidateInputsEventHandler : public adsk::core::ValidateInputsEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + _errMessage->text(""); + + // Verify that at lesat 4 teath are specified. + int numTeeth; + if (!is_digits(_numTeeth->value())) + { + _errMessage->text("The number of teeth must be a whole number."); + eventArgs->areInputsValid(false); + return; + } + else + { + numTeeth = std::stoi(_numTeeth->value()); + } + + if (numTeeth < 4) + { + _errMessage->text("The number of teeth must be 4 or more."); + eventArgs->areInputsValid(false); + return; + } + + // Calculate some of the gear sizes to use in validation. + double diaPitch = 0.0; + if (_standard->selectedItem()->name() == "English") + { + double value; + if (!getCommandInputValue(_diaPitch, "", &value)) + { + eventArgs->areInputsValid(false); + return; + } + else + { + diaPitch = value; + } + } + else if (_standard->selectedItem()->name() == "Metric") + { + double value; + if (!getCommandInputValue(_module, "", &value)) + { + eventArgs->areInputsValid(false); + return; + } + else + { + diaPitch = 25.4 / value; + } + } + + double diametralPitch = diaPitch / 2.54; + double pitchDia = numTeeth / diametralPitch; + + double dedendum; + if (diametralPitch < (20.0 *(M_PI/180.0))-0.000001) + { + dedendum = 1.157 / diametralPitch; + } + else + { + double circularPitch = M_PI / diametralPitch; + if (circularPitch >= 20.0) + { + dedendum = 1.25 / diametralPitch; + } + else + { + dedendum = (1.2 / diametralPitch) + (.002 * 2.54); + } + } + + double rootDia = pitchDia - (2.0 * dedendum); + + double pressureAngle = 0.0; + if (_pressureAngle->selectedItem()->name() == "Custom") + { + pressureAngle = _pressureAngleCustom->value(); + } + else + { + if (_pressureAngle->selectedItem()->name() == "14.5 deg") + pressureAngle = 14.5 * (M_PI/180.0); + else if (_pressureAngle->selectedItem()->name() == "20 deg") + pressureAngle = 20.0 * (M_PI/180.0); + else if (_pressureAngle->selectedItem()->name() == "25 deg") + pressureAngle = 25.0 * (M_PI/180.0); + } + + double baseCircleDia = pitchDia * cos(pressureAngle); + double baseCircleCircumference = 2.0 * M_PI * (baseCircleDia / 2.0); + + Ptr des = _app->activeProduct(); + + double holeDiam; + double value; + if (!getCommandInputValue(_holeDiam, _units, &value)) + { + eventArgs->areInputsValid(false); + return; + } + else + { + holeDiam = value; + } + + if (holeDiam >= (rootDia - 0.01)) + { + _errMessage->text("The center hole diameter is too large. It must be less than " + des->unitsManager()->formatInternalValue(rootDia - 0.01, _units, true)); + eventArgs->areInputsValid(false); + return; + } + + double toothThickness = baseCircleCircumference / (numTeeth * 2); + if (_rootFilletRad->value() > toothThickness * 0.4) + { + _errMessage->text("The root fillet radius is too large. It must be less than " + des->unitsManager()->formatInternalValue(toothThickness * 0.4, _units, true)); + eventArgs->areInputsValid(false); + return; + } + } +} _gearCommandValidateInputs; + + +class SpurGearCommandDestroyEventHandler : public adsk::core::CommandEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + // Terminate the script since the command has finished. + adsk::terminate(); + } +} _gearCommandDestroy; + +class SpurGearCommandCreatedEventHandler : public adsk::core::CommandCreatedEventHandler +{ +public: + void notify(const Ptr& eventArgs) override + { + // Verify that a Fusion design is active. + Ptr des = _app->activeProduct(); + if (!checkReturn(des)) + { + _ui->messageBox("A Fusion design must be active when invoking this command."); + return; + } + + std::string defaultUnits = des->unitsManager()->defaultLengthUnits(); + + // Determine whether to use inches or millimeters as the intial default. + if (defaultUnits == "in" || defaultUnits == "ft") + { + _units = "in"; + } + else + { + _units = "mm"; + } + + // Define the default values and get the previous values from the attributes. + std::string standard; + if (_units == "in") + { + standard = "English"; + } + else + { + standard = "Metric"; + } + + Ptr standardAttrib = des->attributes()->itemByName("SpurGear", "standard"); + if (checkReturn(standardAttrib)) + standard = standardAttrib->value(); + + if (standard == "English") + { + _units = "in"; + } + else + { + _units = "mm"; + } + + std::string pressureAngle = "20 deg"; + Ptr pressureAngleAttrib = des->attributes()->itemByName("SpurGear", "pressureAngle"); + if (checkReturn(pressureAngleAttrib)) + { + pressureAngle = pressureAngleAttrib->value(); + } + + double pressureAngleCustom = 20 * (M_PI/180.0); + Ptr pressureAngleCustomAttrib = des->attributes()->itemByName("SpurGear", "pressureAngleCustom"); + if (checkReturn(pressureAngleCustomAttrib)) + { + pressureAngleCustom = std::stod(pressureAngleCustomAttrib->value()); + } + + std::string diaPitch = "2"; + Ptr diaPitchAttrib = des->attributes()->itemByName("SpurGear", "diaPitch"); + if (checkReturn(diaPitchAttrib)) + { + diaPitch = diaPitchAttrib->value(); + } + double metricModule = 25.4 / std::stod(diaPitch); + + std::string backlash = "0"; + Ptr backlashAttrib = des->attributes()->itemByName("SpurGear", "backlash"); + if (checkReturn(backlashAttrib)) + backlash = backlashAttrib->value(); + + std::string numTeeth = "24"; + Ptr numTeethAttrib = des->attributes()->itemByName("SpurGear", "numTeeth"); + if (checkReturn(numTeethAttrib)) + numTeeth = numTeethAttrib->value(); + + std::string rootFilletRad = std::to_string(.0625 * 2.54); + Ptr rootFilletRadAttrib = des->attributes()->itemByName("SpurGear", "rootFilletRad"); + if (checkReturn(rootFilletRadAttrib)) + rootFilletRad = rootFilletRadAttrib->value(); + + std::string thickness = std::to_string(0.5 * 2.54); + Ptr thicknessAttrib = des->attributes()->itemByName("SpurGear", "thickness"); + if (checkReturn(thicknessAttrib)) + thickness = thicknessAttrib->value(); + + std::string holeDiam = std::to_string(0.5 * 2.54); + Ptr holeDiamAttrib = des->attributes()->itemByName("SpurGear", "holeDiam"); + if (checkReturn(holeDiamAttrib)) + holeDiam = holeDiamAttrib->value(); + + Ptr cmd = eventArgs->command(); + cmd->isExecutedWhenPreEmpted(false); + Ptr inputs = cmd->commandInputs(); + if (!checkReturn(inputs)) + return; + + // Define the command dialog. + _imgInputEnglish = inputs->addImageCommandInput("gearImageEnglish", "", "Resources/GearEnglish.png"); + if (!checkReturn(_imgInputEnglish)) + return; + _imgInputEnglish->isFullWidth(true); + + _imgInputMetric = inputs->addImageCommandInput("gearImageMetric", "", "Resources/GearMetric.png"); + if (!checkReturn(_imgInputMetric)) + return; + _imgInputMetric->isFullWidth(true); + + _standard = inputs->addDropDownCommandInput("standard", "Standard", TextListDropDownStyle); + if (!checkReturn(_standard)) + return; + + if (standard == "English") + { + _standard->listItems()->add("English", true); + _standard->listItems()->add("Metric", false); + _imgInputMetric->isVisible(false); + } + else + { + _standard->listItems()->add("English", false); + _standard->listItems()->add("Metric", true); + _imgInputEnglish->isVisible(false); + } + + _pressureAngle = inputs->addDropDownCommandInput("pressureAngle", "Pressure Angle", TextListDropDownStyle); + if (!checkReturn(_pressureAngle)) + return; + + if (pressureAngle == "14.5 deg") + { + _pressureAngle->listItems()->add("14.5 deg", true); + } + else + { + _pressureAngle->listItems()->add("14.5 deg", false); + } + + if (pressureAngle == "20 deg") + { + _pressureAngle->listItems()->add("20 deg", true); + } + else + { + _pressureAngle->listItems()->add("20 deg", false); + } + + if (pressureAngle == "25 deg") + { + _pressureAngle->listItems()->add("25 deg", true); + } + else + { + _pressureAngle->listItems()->add("25 deg", false); + } + + if (pressureAngle == "Custom") + { + _pressureAngle->listItems()->add("Custom", true); + } + else + { + _pressureAngle->listItems()->add("Custom", false); + } + + _pressureAngleCustom = inputs->addValueInput("pressureAngleCustom", "Custom Angle", "deg", ValueInput::createByReal(pressureAngleCustom)); + if (!checkReturn(_pressureAngleCustom)) + return; + if (pressureAngle != "Custom") + { + _pressureAngleCustom->isVisible(false); + } + + _diaPitch = inputs->addValueInput("diaPitch", "Diametral Pitch", "", ValueInput::createByString(diaPitch)) ; + + _module = inputs->addValueInput("module", "Module", "", ValueInput::createByReal(metricModule)) ; + if (!checkReturn(_module)) + return; + + if (standard == "English") + { + _module->isVisible(false); + } + else if (standard == "Metric") + { + _diaPitch->isVisible(false); + } + + _numTeeth = inputs->addStringValueInput("numTeeth", "Number of Teeth", numTeeth); + if (!checkReturn(_pressureAngleCustom)) + return; + + _backlash = inputs->addValueInput("backlash", "Backlash", _units, ValueInput::createByReal(std::stod(backlash))); + if (!checkReturn(_backlash)) + return; + + _rootFilletRad = inputs->addValueInput("rootFilletRad", "Root Fillet Radius", _units, ValueInput::createByReal(std::stod(rootFilletRad))); + if (!checkReturn(_rootFilletRad)) + return; + + _thickness = inputs->addValueInput("thickness", "Gear Thickness", _units, ValueInput::createByReal(std::stod(thickness))); + if (!checkReturn(_thickness)) + return; + + _holeDiam = inputs->addValueInput("holeDiam", "Hole Diameter", _units,ValueInput::createByReal(std::stod(holeDiam))); + if (!checkReturn(_holeDiam)) + return; + + _pitchDiam = inputs->addTextBoxCommandInput("pitchDiam", "Pitch Diameter", "", 1, true); + if (!checkReturn(_pitchDiam)) + return; + + _errMessage = inputs->addTextBoxCommandInput("errMessage", "", "", 2, true); + if (!checkReturn(_errMessage)) + return; + _errMessage->isFullWidth(true); + + // Connect to the command related events. + Ptr inputChangedEvent = cmd->inputChanged(); + if (!inputChangedEvent) + return; + bool isOk = inputChangedEvent->add(&_gearCommandInputChanged); + if (!isOk) + return; + + Ptr validateInputsEvent = cmd->validateInputs(); + if (!validateInputsEvent) + return; + isOk = validateInputsEvent->add(&_gearCommandValidateInputs); + if (!isOk) + return; + + Ptr executeEvent = cmd->execute(); + if (!executeEvent) + return; + isOk = executeEvent->add(&_gearCommandExecute); + if (!isOk) + return; + + Ptr destroyEvent = cmd->destroy(); + if (!destroyEvent) + return; + + isOk = destroyEvent->add(&_gearCommandDestroy); + if (!isOk) + return; + } +} _gearCommandCreated; + + +extern "C" XI_EXPORT bool run(const char* context) +{ + _app = Application::get(); + if (!_app) + return false; + + _ui = _app->userInterface(); + if (!_ui) + return false; + + // Create a command definition and add a button to the CREATE panel. + Ptr cmdDef = _ui->commandDefinitions()->itemById("adskSpurGearCPPScript"); + if (!cmdDef) + { + cmdDef = _ui->commandDefinitions()->addButtonDefinition("adskSpurGearCPPScript", "Spur Gear", "Creates a spur gear component", "Resources/SpurGear"); + if (!checkReturn(cmdDef)) + return false; + } + + // Connect to the command created event. + Ptr commandCreatedEvent = cmdDef->commandCreated(); + if (!checkReturn(commandCreatedEvent)) + return false; + bool isOk = commandCreatedEvent->add(&_gearCommandCreated); + if (!isOk) + return false; + + isOk = cmdDef->execute(); + if (!isOk) + return false; + + // Prevent this module from terminating so that the command can continue to run until + // the user completes the command. + adsk::autoTerminate(false); + + return true; +} + + + +bool is_digits(const std::string &str) +{ + return str.find_first_not_of("0123456789") == std::string::npos; +} + + +/* + * Verfies that a value command input has a valid expression and returns the + * value if it does. Otherwise it returns False. This works around a + * problem where when you get the value from a ValueCommandInput it causes the + * current expression to be evaluated and updates the display. Some new functionality + * is being added in the future to the ValueCommandInput object that will make + * this easier and should make this function obsolete. + */ +bool getCommandInputValue(Ptr commandInput, std::string unitType, double *value) +{ + Ptr valCommandInput = commandInput; + if (!commandInput) + { + *value = 0; + return false; + } + + // Verify that the expression is valid. + Ptr des = _app->activeProduct(); + Ptr unitsMgr = des->unitsManager(); + + if (unitsMgr->isValidExpression(valCommandInput->expression(), unitType)) + { + *value = unitsMgr->evaluateExpression(valCommandInput->expression(), unitType); + return true; + } + else + { + *value = 0; + return false; + } +} + + +// Calculate points along an involute curve. +Ptr involutePoint(double baseCircleRadius, double distFromCenterToInvolutePoint) +{ + // Calculate the other side of the right-angle triangle defined by the base circle and the current distance radius. + // This is also the length of the involute chord as it comes off of the base circle. + double triangleSide = sqrt(pow(distFromCenterToInvolutePoint, 2.0) - pow(baseCircleRadius, 2.0)); + + // Calculate the angle of the involute. + double alpha = triangleSide / baseCircleRadius; + + // Calculate the angle where the current involute point is. + double theta = alpha - acos(baseCircleRadius / distFromCenterToInvolutePoint); + + // Calculate the coordinates of the involute point. + double x = distFromCenterToInvolutePoint * cos(theta); + double y = distFromCenterToInvolutePoint * sin(theta); + + // Create a point to return. + return( adsk::core::Point3D::create(x, y, 0) ); +} + + +// Builds a spur gear. +Ptr drawGear(Ptr design, double diametralPitch, int numTeeth, double thickness, double rootFilletRad, double pressureAngle, double backlash, double holeDiam) +{ + // The diametral pitch is specified in inches but everthing + // here expects all distances to be in centimeters, so convert + // for the gear creation. + diametralPitch = diametralPitch / 2.54; + + // Compute the various values for a gear. + double pitchDia = (double)numTeeth / diametralPitch; + + //addendum = 1.0 / diametralPitch + double dedendum; + if (diametralPitch < (20 *(M_PI/180.0))-0.000001) + { + dedendum = 1.157 / diametralPitch; + } + else + { + double circularPitch = M_PI / diametralPitch; + if (circularPitch >= 20.0) + { + dedendum = 1.25 / diametralPitch; + } + else + { + dedendum = (1.2 / diametralPitch) + (.002 * 2.54); + } + } + + double rootDia = pitchDia - (2.0 * dedendum); + + double baseCircleDia = pitchDia * cos(pressureAngle); + double outsideDia = (double)(numTeeth + 2) / diametralPitch; + + // Create a new component by creating an occurrence. + Ptr occs = design->rootComponent()->occurrences(); + if (!checkReturn(occs)) + return nullptr; + + Ptr mat = adsk::core::Matrix3D::create(); + if (!checkReturn(mat)) + return nullptr; + + Ptr newOcc = occs->addNewComponent(mat); + if (!checkReturn(newOcc)) + return nullptr; + + Ptr newComp = newOcc->component(); + if (!checkReturn(newComp)) + return nullptr; + + // Create a new sketch. + Ptr sketches = newComp->sketches(); + if (!checkReturn(sketches)) + return nullptr; + + Ptr xyPlane = newComp->xYConstructionPlane(); + if (!checkReturn(xyPlane)) + return nullptr; + + Ptr baseSketch = sketches->add(xyPlane); + if (!checkReturn(xyPlane)) + return nullptr; + + // Draw a circle for the base. + baseSketch->sketchCurves()->sketchCircles()->addByCenterRadius(adsk::core::Point3D::create(0,0,0), rootDia/2.0); + if (!checkReturn(baseSketch)) + return nullptr; + + // Draw a circle for the center hole, if the value is greater than 0. + Ptr prof = nullptr; + if (holeDiam - (_app->pointTolerance() * 2) > 0) + { + Ptr circ = baseSketch->sketchCurves()->sketchCircles()->addByCenterRadius(adsk::core::Point3D::create(0,0,0), holeDiam/2.0); + if (!checkReturn(circ)) + return nullptr; + + // Find the profile that uses both circles. + for (Ptr tempProf : baseSketch->profiles()) + { + if (tempProf->profileLoops()->count() == 2) + { + prof = tempProf; + break; + } + } + } + else + { + // Use the single profile. + prof = baseSketch->profiles()->item(0); + } + + if (!checkReturn(prof)) + return nullptr; + + //////// Extrude the circle to create the base of the gear. + + // Create an extrusion input to be able to define the input needed for an extrusion + // while specifying the profile and that a new component is to be created + Ptr extrudes = newComp->features()->extrudeFeatures(); + if (!checkReturn(extrudes)) + return nullptr; + + Ptr extInput = extrudes->createInput(prof, NewBodyFeatureOperation); + if (!checkReturn(extInput)) + return nullptr; + + // Define that the extent is a distance extent of 5 cm. + Ptr distance = adsk::core::ValueInput::createByReal(thickness); + if (!checkReturn(distance)) + return nullptr; + + bool result = extInput->setDistanceExtent(false, distance); + if (!result) + return nullptr; + + // Create the extrusion. + Ptr baseExtrude = extrudes->add(extInput); + if (!checkReturn(baseExtrude)) + return nullptr; + + // Create a second sketch for the tooth. + Ptr toothSketch = sketches->add(xyPlane); + if (!checkReturn(toothSketch)) + return nullptr; + + // Calculate points along the involute curve. + int involutePointCount = 15; + double involuteIntersectionRadius = baseCircleDia / 2.0; + Ptr *involutePoints = new Ptr[involutePointCount]; + std::unique_ptr[]> involutePointsDeleter(involutePoints); + double involuteSize = (outsideDia - baseCircleDia) / 2.0; + for (int i=0; i newPoint = involutePoint(baseCircleDia / 2.0, involuteIntersectionRadius); + involutePoints[i] = newPoint; + } + + // Get the point along the tooth that's at the pictch diameter and then + // calculate the angle to that point. + Ptr pitchInvolutePoint = involutePoint(baseCircleDia / 2.0, pitchDia / 2.0); + double pitchPointAngle = atan(pitchInvolutePoint->y() / pitchInvolutePoint->x()); + + // Determine the angle defined by the tooth thickness as measured at + // the pitch diameter circle. + double toothThicknessAngle = (2.0 * M_PI) / (2.0 * (double)numTeeth); + + // Determine the angle needed for the specified backlash. + double backlashAngle = (backlash / (pitchDia / 2.0)) * 0.25; + + // Determine the angle to rotate the curve. + double rotateAngle = -((toothThicknessAngle/2.0) + pitchPointAngle - backlashAngle); + + // Rotate the involute so the middle of the tooth lies on the x axis. + double cosAngle = cos(rotateAngle); + double sinAngle = sin(rotateAngle); + for (int i=0; ix() * cosAngle - involutePoints[i]->y() * sinAngle; + double newY = involutePoints[i]->x() * sinAngle + involutePoints[i]->y() * cosAngle; + involutePoints[i] = adsk::core::Point3D::create(newX, newY, 0); + } + + // Create a new set of points with a negated y. This effectively mirrors the original + // points about the X axis. + Ptr *involute2Points = new Ptr[involutePointCount]; + std::unique_ptr[]> involute2PointsDeleter(involute2Points); + for (int i=0; ix(), -involutePoints[i]->y(), 0); + } + + double *curve1Angle = new double[involutePointCount]; + std::unique_ptr curve1AngleDeleter(curve1Angle); + for (int i=0; iy() / involutePoints[i]->x()); + } + + double *curve2Angle = new double[involutePointCount]; + std::unique_ptr curve2AngleDeleter(curve2Angle); + for (int i=0; iy() / involute2Points[i]->x()); + } + + toothSketch->isComputeDeferred(true); + + // Create and load an object collection with the points. + Ptr pointSet = adsk::core::ObjectCollection::create(); + for (int i=0; iadd(involutePoints[i]); + } + + // Create the first spline. + Ptr spline1 = toothSketch->sketchCurves()->sketchFittedSplines()->add(pointSet); + if (!checkReturn(spline1)) + return nullptr; + + // Add the involute points for the second spline to an ObjectCollection. + pointSet = adsk::core::ObjectCollection::create(); + for (int i=0; iadd(involute2Points[i]); + } + + // Create the second spline. + Ptr spline2 = toothSketch->sketchCurves()->sketchFittedSplines()->add(pointSet); + if (!checkReturn(spline2)) + return nullptr; + + // Draw the arc for the top of the tooth. + Ptr midPoint = adsk::core::Point3D::create((outsideDia / 2.0), 0, 0); + Ptr topArc = toothSketch->sketchCurves()->sketchArcs()->addByThreePoints(spline1->endSketchPoint(), midPoint, spline2->endSketchPoint()); + if (!checkReturn(topArc)) + return nullptr; + + // Check to see if involute goes down to the root or not. If not, then + // create lines to connect the involute to the root. + if (baseCircleDia < rootDia) + { + Ptr bottomLine = toothSketch->sketchCurves()->sketchLines()->addByTwoPoints(spline2->startSketchPoint(), spline1->startSketchPoint()); + if (!checkReturn(bottomLine)) + return nullptr; + } + else + { + Ptr rootPoint1 = adsk::core::Point3D::create((rootDia / 2 - 0.001) * cos(curve1Angle[0] ), (rootDia / 2) * sin(curve1Angle[0]), 0); + Ptr line1 = toothSketch->sketchCurves()->sketchLines()->addByTwoPoints(rootPoint1, spline1->startSketchPoint()); + if (!checkReturn(line1)) + return nullptr; + + Ptr rootPoint2 = adsk::core::Point3D::create((rootDia / 2 - 0.001) * cos(curve2Angle[0]), (rootDia / 2) * sin(curve2Angle[0]), 0); + Ptr line2 = toothSketch->sketchCurves()->sketchLines()->addByTwoPoints(rootPoint2, spline2->startSketchPoint()); + if (!checkReturn(line2)) + return nullptr; + + Ptr bottomLine = toothSketch->sketchCurves()->sketchLines()->addByTwoPoints(line1->startSketchPoint(), line2->startSketchPoint()); + if (!checkReturn(bottomLine)) + return nullptr; + + // Make the lines tangent to the spline so the root fillet will behave correctly. + if (!line1->isFixed(true)) + return nullptr; + + if (!line2->isFixed(true)) + return nullptr; + + Ptr geomConstraints = toothSketch->geometricConstraints(); + if (!checkReturn(geomConstraints)) + return nullptr; + + Ptr tangent = geomConstraints->addTangent(spline1, line1); + if (!checkReturn(tangent)) + return nullptr; + + tangent = geomConstraints->addTangent(spline2, line2); + if (!checkReturn(tangent)) + return nullptr; + } + + toothSketch->isComputeDeferred(false); + + ////// Extrude the tooth. + + // Get the profile defined by the tooth. + prof = toothSketch->profiles()->item(0); + if (!checkReturn(prof)) + return nullptr; + + // Create an extrusion input to be able to define the input needed for an extrusion + // while specifying the profile and that a new component is to be created + extInput = extrudes->createInput(prof, JoinFeatureOperation); + if (!checkReturn(extInput)) + return nullptr; + + // Define that the extent is a distance extent of 5 cm. + distance = adsk::core::ValueInput::createByReal(thickness); + if (!checkReturn(distance)) + return nullptr; + + result = extInput->setDistanceExtent(false, distance); + if (!result) + return nullptr; + + // Create the extrusion. + Ptr toothExtrude = extrudes->add(extInput); + if (!checkReturn(toothExtrude)) + return nullptr; + + Ptr baseFillet; + if (rootFilletRad > 0) + { + ////// Find the edges between the base cylinder and the tooth. + + // Get the outer cylindrical face from the base extrusion by checking the number + // of edges and if it's 2 get the other one. + Ptr cylFace = baseExtrude->sideFaces()->item(0); + if (cylFace->edges()->count() == 2) + { + cylFace = baseExtrude->sideFaces()->item(1); + } + if (!checkReturn(cylFace)) + return nullptr; + + // Get the two linear edges, which are the connection between the cylinder and tooth. + Ptr edges = adsk::core::ObjectCollection::create(); + for (Ptr edge : cylFace->edges()) + { + Ptr tempLine = edge->geometry(); + if (tempLine) + { + edges->add(edge); + } + } + + // Create a fillet input to be able to define the input needed for a fillet. + Ptr fillets = newComp->features()->filletFeatures(); + if (!checkReturn(fillets)) + return nullptr; + + Ptr filletInput = fillets->createInput(); + if (!checkReturn(filletInput)) + return nullptr; + + // Define that the extent is a distance extent of 5 cm. + Ptr radius = adsk::core::ValueInput::createByReal(rootFilletRad); + if (!checkReturn(radius)) + return nullptr; + + result = filletInput->addConstantRadiusEdgeSet(edges, radius, false); + if (!result) + return nullptr; + + // Create the extrusion. + baseFillet = fillets->add(filletInput); + if (!checkReturn(baseFillet)) + return nullptr; + } + + // Create a pattern of the tooth extrude and the base fillet. + Ptr circularPatterns = newComp->features()->circularPatternFeatures(); + if (!checkReturn(circularPatterns)) + return nullptr; + + Ptr entities = adsk::core::ObjectCollection::create(); + entities->add(toothExtrude); + if (baseFillet) + { + entities->add(baseFillet); + } + + Ptr cylFace = baseExtrude->sideFaces()->item(0); + if (!checkReturn(cylFace)) + return nullptr; + + Ptr patternInput = circularPatterns->createInput(entities, cylFace); + if (!checkReturn(patternInput)) + return nullptr; + + Ptr numTeethInput = adsk::core::ValueInput::createByString(std::to_string(numTeeth)); + if (!checkReturn(numTeethInput)) + return nullptr; + + patternInput->quantity(numTeethInput); + patternInput->patternComputeOption(adsk::fusion::PatternComputeOptions::IdenticalPatternCompute); + Ptr pattern = circularPatterns->add(patternInput); + if (!checkReturn(pattern)) + return nullptr; + + // Create an extra sketch that contains a circle of the diametral pitch. + Ptr diametralPitchSketch = sketches->add(xyPlane); + if (!checkReturn(diametralPitchSketch)) + return nullptr; + + Ptr diametralPitchCircle = diametralPitchSketch->sketchCurves()->sketchCircles()->addByCenterRadius(adsk::core::Point3D::create(0,0,0), pitchDia/2.0); + if (!checkReturn(diametralPitchCircle)) + return nullptr; + + diametralPitchCircle->isConstruction(true); + diametralPitchCircle->isFixed(true); + + // Group everything used to create the gear in the timeline. + Ptr timelineGroups = design->timeline()->timelineGroups(); + if (!checkReturn(timelineGroups)) + return nullptr; + + int newOccIndex = newOcc->timelineObject()->index(); + int pitchSketchIndex = diametralPitchSketch->timelineObject()->index(); + + Ptr timelineGroup = timelineGroups->add(newOccIndex, pitchSketchIndex); + if (!checkReturn(timelineGroup)) + return nullptr; + + timelineGroup->name("Spur Gear"); + + // Add an attribute to the component with all of the input values. This might + // be used in the future to be able to edit the gear. + std::string gearValues = "{"; + gearValues += "'pressureAngle': '" + std::to_string(pressureAngle) + "',"; + gearValues += "'numTeeth': '" + std::to_string(numTeeth) + "',"; + gearValues += "'backlash': '" + std::to_string(backlash) + "',"; + gearValues += "'holeDiam': '" + std::to_string(holeDiam) + "',"; + gearValues += "'thickness': '" + std::to_string(thickness) + "',"; + gearValues += "'rootFilletRad': '" + std::to_string(rootFilletRad) + "',"; + gearValues += "'diametralPitch': '" + std::to_string(diametralPitch * 2.54) + "'}"; + Ptr attrib = newComp->attributes()->add("SpurGear", "Values", gearValues); + if (!checkReturn(attrib)) + return nullptr; + + // Set the name of the component. + newComp->name("Spur Gear (" + std::to_string(numTeeth) + " teeth)"); + + return newComp; +} + + + +#ifdef XI_WIN + +#include + +BOOL APIENTRY DllMain(HMODULE hmodule, DWORD reason, LPVOID reserved) +{ + switch (reason) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +#endif // XI_WIN diff --git a/usr/autodesk/CPP/Samples/SpurGear/SpurGear.dll b/usr/autodesk/CPP/Samples/SpurGear/SpurGear.dll new file mode 100644 index 0000000000000000000000000000000000000000..db49601e857f9b889444a127f70ed5e44cf01290 GIT binary patch literal 345968 zcmdpf3wRVo7Ik>U4QNPwL=jyKiW*Q6Wko?Z8P2b@2#nJgv9{-p8P2ZxttyTWU zNAY>ZxXzol%V#J3xp|{1A0_1rMqXP&8(tm_F3!lf?ylcuw48Ix)n=WY8As;t+p^tZ z881PhQaFph*(cz8u6(^+w(xt)jEsF`ll7S~J5xmc^~8O!`)X8G2bmx7WxeI|)){?) z)fb=hh&eVhqlSiZGc!ug!)MRTjIsOU^Y+Y)2pVmD@75U?q3HG3{q)uu-4%6JWqqp* zgAMNS*KNXx$rG^epvBrx`p)36{pDw5T-|Nlb;BnN&&U|p3E;rYI1-;rVu6bgM%`4k zj0tTCpft(Y5DSQU)!oLbisB=D%@~a8pT^ZI>UQJ!o39;pYJ!v5?derTOxOu3zPv#(usqwqf71-$;N1n)xPtveuTyfx46Cyl%hOQI5qlmY8|D^r>WDxK!QFsmC0dJJTJCJy@lE*6} z-aZQNapLuUSNOFeUSaZhy@uy!xD^{r!0W@NQOkrxI_J z!h4x`i;~A%K)hoV-m~8VZ{teg_Z0DlC69L*@jjBc$Uc#Hqm~HX{lsgRJYE~(-KFsU zM!YE)f*`-lAl{00N$a=lT;TQ8cst1NUcnnryfMk+jU?Vz5*OKrkY7c$;9X0+j>+R4 zO1wD=?>zGBukbD;-n#6h{aw=^cxNlTONlpSw(vWPc+--{yM=f^Njqle5O3i>1g{72 zx+Ra-g?P^>yvP3syt>x~?Z7Vpv%@^BR@%`fkbS)a+A2A2|6yIxTt5|F){M8VQ@L?)vjQ*M0 zRtKvm9Aj?Uki$TX7-MnaSlpvp#YGJ(uXw(t2QS^+?>hANyl}7*XczLEFCpZ{@APF1CF)FZ7>ZKk{4kJ1>4AZ+<(^ck(Mt1HT1*!0%{JewTam8yv@P?gIbyYeRm) zeZ2HLE}q|z162Gi#yyhQ_N}k9iR1|Us)meWqR`46yLrkzwUAT zraj|7zuG^7--uRT`aS2(Z}vc^ew*j} (t!nATZ>l%HqB#9lEcKt?f-}JHXit9U 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"yiNy-T5Q*?!8&Ho#T}5k<#1YEzk@!w0Gzs;q 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 X22Z+up)~hp!GsOn)5i5K%9H#HCG$8> literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/SpurGear/SpurGear.dylib b/usr/autodesk/CPP/Samples/SpurGear/SpurGear.dylib new file mode 100644 index 0000000000000000000000000000000000000000..086d91263bf9b1f2cd48ba02fea199f3ec8d5408 GIT binary patch literal 459584 zcmeEvdwg9}+J9P?W>h3aMqL}1p`&Q3La7oo95lob>e^DJMzx{ss3F9(XXNBKq(jK4 zOJ>H5V9*&tTtbS`xW_P>8HTuwK4)5*p`$VS%J2Jq)?RzBv(L#%Fz-LVS3jR-t^GXD zde(DW_jUGu^*-IXTm&om4jUBn74Z zsRGjd=RI!%82^Kn{+l*!{>+8*y$2*|{I)i@$@_Wy@Vs$A&W9TJaoV(b^B0^m&j*G1 zO^z5odkrxpeD<;m$o2S9XZ|z%rp=l;yK3eo`kbn7)zOCE+a41>r)Zug-}y6UOq;oI z#>}eu)8?OjPFTJv$C}ckM{4ysd`{tK!2aK9(`L+_GcPb;m|x8dQ##*c!sitG`J7A! z{N~NSt`B9>pUj**|G`CI&Ip5IhS5A=iF%*%sFo^h{F69|JamR$e_SK zK8JZ2jQPvBn*du+n>P8dlMb79#PP?Sc#>jlycKxVp=ZXi{ZEo<)6Sn8Sgn743q5u@ z;K%azALC zpIv?-cG_M8yE)hz&)U{*p=WC|%X`|i*=J9iciBbf%$+^0YW^jjp6UGRZKDD|Tb5L8 z_lG&;)25w!_WZL0fbnbaTz|EZ&)SX8F28`%2xE}A>X!o&O;J$_;dkh=V=*cQ!r zi{SsXX;Y3q?%1-)N1JHN$*K43R^v4U@40lIc_ts1S00|H;y;_Ufg6gkmGfp^GH>kJ z=U#NdoUxN<&bx5_+^VrhR8*XJ_C-~*XU-ezr&S9sIcnzFmyA8p%j|RRWwS3hCuf(O zoSI_rq&%faN|82$wJaH$Gm@g*G&H9bMsK}sXig1cg;G<7sdodvO-|08J8YcO1=`_& zRp3AWE&IOtKNk6Skv~wOng4Wcw{cF;+Xgh-Bg=YD{Nj^8f7~+h@Ybu3TzlzLBOhX$ zDZ+oXLH=erIrz`K@xhiu_e9=?BC{*7ygD!vMf_WFros)sfAnQNku<{Irz53}NU;bf5P<2So z*ah=084CyU|BNwX_8I3%&H5&|^f^P&Gp5p?c-g%9GcVfba92?nMeR1>&Y?L)DDgw@ znSSQK9lht8`!~&Lw=t}k@BVyef$uEvodv$Lz;_n-&H~?A;5!R^XMyi5@PFL`m66y# zB8%1(L}Jywk$82l4Bu#IPGr%u1!q2!KWcJLPC9wRzKyBN|$G#`d<83c6nd)>*+_|0m|PyK>1^PvezH~mgO%TpnN=I{Z%p^ ztMTR``BCo2CAlm0Tv^|c3DQZpp<%k{b}Q*TA|fR{lnEOZUm}AEy;{%ioYu zJj>UW_3bt!|KWDDfT}Z}L4{qi6Y%-NZ3t?6@Y+gb(V;o{4eeUs%xBIE;^*7q-S)UN znJIpXYIPjT~2Hm6}?D_}X1D?cYq$*NNTiWhciQZ4djF`rR1&aR*cy8BJk>n}=GK5fqn zdLt{!bQ=z7H)=qc>K;_Fpfi6lYm6kyx>*~VJ^q(-Y^vLBe;~`eofroDS_1K{~@iG*7wluZ>DjJl%mTK^o+@VR{1|-H_pMh<^ z_IevgYp>(}P030gIa%%1tO@M(B1r~muUMtT%0HYOgH7UyTvC2;Q@FjAt7OE;M z@el`5T!~<-S=QUv2ZEhJAa8uxhbEgJErN&G@gzIY5o>?d9V>sEY~^Z@C!Yow zWj@AnjO1)!`RYzo*!vZ-vFD`R)cGdRsFP5+#i_GXt}u1BuzXFp&XYoQc1k(xJkHd4 zHOo9<>TE}yJzkxcvCgJwA0r5|z!6kc2V;`_vZE zET`?I^zHI1fJrLc$F7a8vOMcFOJh}|+xH4i`ruqhw-cp{MY}91iZ`MbKFgn>g{`Gg zb~A!@29zaBa3qKVHL`HMFKEdx6xcS44xR467aMp5;SmR3XW$bEFAm_t3Br@_VDd zS}jNGH&$EsL$#n*|?hdjzEV$pVMLXZ|2zY-(| zITjzOZfGG|einku#h=p?Pgyo~npID*SZ(x4a@z}))oIrE#6*}N7i!ji{i>vKZGMdk&T7qWoi!BS$&|i?k4ms!1%fwCX!-xwop{p_ zsyO6x{Lhbmj}mbDbH=B%8zxU?9%jdP@WVRF&c6=Cx+=Cn@)xtcjQg{hiWH-~$hBbW zl?}^-B3z0=uJx#E3vk3xx1Pu|l1@iF@%Fo!;;n~x>jUvb{^wsRUbm?tSicQg zzS-dW4dm-J_JP2jd|NkWly7gF8KHEYN6X$FKlRV%peT4dRusz{C?RwDNADQuQOXmt?3?1xLIKLs+PATfYtMP>terC1)A)Cw{^0ad=!Icale{O87<)aqa~6Bu z3Z%8y7OT`=mvT}WFPx=h@;K=yL_dyX6NO>JL*l`>)-hQJV7wzjTpt=-|k!rhJ+ z#VPTtY^o>mE1aiZk&gRxpDV$dw=?aRM$dChy+lEfsm;b3ntJ~#l zQ**>AAaaJOxzqvHqh>x!H*mIQ0NYqnYrYvG!NAc8ekmCJ)BFMj(DJZhyGh>!pxj&Vt!Zq`MzQ+vNn#$Kgkr zMT_E27@ykZAPXiwxt#%vj8FFUIrCTsDCV);m)I5jCYC%$g!-2Msj4q|*Aa}fIV zM9El9@~%Z<#*0PUXBjVM18K*Lce?5ElA{ji_)s`O6L{!!k_bm(SxIV=M>u8VZ|((?SdoRs=BgOc3ef*j>CY(z~tERWN`M_9$OHIhf$j3 zU4g{dW8St|>~RK=)*i3CqxLv}6Oee}XiZ>`V@ZXvQ|7`4O%VOo-c*k81w{I?3A}#NNrDoxZ?b38&4VSg8ZIO zsgD~8+|DSUwv_CYeSw1%9T>DLycP8#uu5G~TYH!G>))jm$ols>eaPltb}Z=8%ev9M zm$BQRbN$nf4EyP;J2UkM1-3tsIP8}`U#WuqSq=Y`b12dAB<~$Pi>Yp>spSD^3rsm^ z3JRYEh6R@8k6xZX`UUxghg|k){uv#g=AW>fNFgKqIZOF^I(RJ3Vl^Ymno(X3@CrAZ z!XwJNSdd~cH=?YGL_2vzO`qnUiW)|gccv0Gl4yiS)M$x7Sx`nw98Scm+w)KPv*=Z8 zhD_RW3geo$zAO&eV??DqSGJ1kQA7$rsaZB zSv$G4ewsh^d3ayLrr8Hm$LK5y3g7MsBLkD*vvqG%ylmZ~_My;M+0Y2eqA?P0qq?%D z7dj_6p>3OvXE;b6y?{>8N6Gs!yNBphpuCw@HK$*EmL6VSS=~-$ncC>dU=L;5=4tv-JSL*={7!qVT_j;4-1>mSy#LBQ?*OJ7y@__$}OlQc|VYFYrUKS zLE*rN6%14rsz(F$fGdfSHyw3!7M*Azl^lZOXwStuyOuNGr7}lZZgrYfHCe1SdL+4x zR5h8+u4YaKHJ?5&q-GcZ1z43l_zBefEvP+>|xo|X;xJvx;DByx%~*W*J(Dp ziU%Ro!Ya0&8&WY0faEI4$7`VCQcznJZ>74i=twIY;6+p=-a=4HdmKr4!W`cG!%>}Z zdFX8_vW;a^r&(2z=-TM_$!#ubuhVRH6;FZP!zw2O10cCdvKdvp3Df|n zJ1#JRnrmePJl9cWJFAL!9+Lx{+5W6@{8*qR8ce|iX<#C@FiR>Lou%osa{Q+ znd52Cboba+=)vW(w`ibYR=hgRs_A%sT^rq$wd@B*b(-}}whRgiJRQ zC0$!u$)BR7jCJIhf5ME%hfD4d0$3dyNZog~7N@D?Mq~8eb%3Kbvh9X8Fd9Kp=$Mvp zIhRI@MSC22o{fW^Ao+(wuV?1_%~pDG=y{54mip0dfH^dKX#-RF1I`z%EIbiMEbGDZ zwikIO<1o*$KJQW-g>mGD&^=1np!7JdC!bSMwdF&!!l4$<&)2X5N;yxL<@_^$+iztGvQC(L%aDQ z+^U2PN*`}wb#jv<3*qvYkJN?A>{QbWsEikxJoT2VO}<{)wUDdq<1|ac<-Ru=oOf82 za8!+~hAq)JUS{pHP+6U3{jhyIQ`lA@M8jcw;zp?>D2=I;KSdGy6kH82g(K!io z^gqkw)d*M6a_i0r)%o7gQ~*k=(N)jz9!>+amcFZsVWGQAq z3r_)9fu5s;#{y{zBSZGecR2XQbEAnli@T4_Ht^()P`oSpp(C6A}qE5$4L`$_3Itutb zL&wx7J+zd6&&AFYGmKhV@)D=y!z{UzQE4Q_NVK%Gx>p=A2$z>%V=s2RmAp=~W||9h zZS*(_UyGG@oo4<1?MSGSwy3VcafT{s{D20OldPSZ7GYZPe&CtB0!S!Z$_ds7lr|PE zwW0u?OUZFoLm4JJk`pdB7^6>c=nD)zL9+E6PZp1l%m4uS9MU9ONGeqh4dL=sCv`r+ zvc%F2S+xeySh|t(PrGRiW_@e$1r%x4IOnu__ zyPbdpKowbOY%$sj4tNi)*ITc5IYHK|@CKqE#n6Lpq=m&~KgSkC$_=Ole8li!F==vW z2$$<$rB(K@)nXlptlEoctOLpU7%;**5ZUbZ+SfKtCwewLIn7=w+~@DW0y~6|$t1eL zkabne4pP4aBxe%>rMfBnP)D0C0AMYJ9}|Mh-LFuW9|T%5t6H*HZFDzkc`oXx)2y#0 z9F!gvQxNjuHu4pI$M4FW3#;)rhQGnZ>YbB)6}yD#xl3+3Z&S2%!;{{U;}etQ-bF z0ahiyL?y{nK@C7LyQW^WWN6y!Ojef}Rf>qd+ctEX5M`QyGqe3Z+aUtlswEms!31ew zBC?bN9V)^l7t=A6AgOE)VUTaq(k)~nNh~Z>IS($mFVR5jt$1~sRnxIpZS-^2@(fnx zb(-}}mvO;;FWO1iblYMMni8NH#vqmaIH+PJ{}C!oZW%85?g^=^tPZ=8`e`6nL~n)A z`G`oi)+WyVTX8bvZ9GToX^0t0^Jp&nFI-NCdXe?-mFCw!7g^Mv8(Fa&Ug?YEAHKYF z@#m5JvgJ63dG|)3Bs?-? zIe?mrB{~VfdW}ikB>Z7bv>gEX)bDlU3eXDTrp$pjcvJfP=rfena*WneJBrBrx@fYG^s>9qwW5UEy7=e8w&eP)Dy)S5Bp|}$D zfytgY1vu+a+0SVpBjY8JwgE3UKQ90e3P32>6>vcoFbW6 zEU0Wp<~5K`huS=&EBMe_#K7b#vui{)+$4fI`C{Vz5y|#YmW{ys*;{CGNaP{*}ukk1-bTuO>3?H9+R@oG4oA6=f<< z{D<=4T8#^Q$^#Yyi2K?2OD1v6*+9zS7>z*$d?ML;WC zX@Wp*m!$JUk;Fol?=Tx5Rkk?zGA|V#-&qzxzLXnjfmj9k3KwrCNhO_%*#Q^$16 z3Ux3qJ9u?WwFtKk0{fS}g5@_id?U6v_%bgy0m)gFNK$$U(%-5wx$?Xjut)2mai z=j3TFkf9M^0%RU=1Q^<@BS5h=0Gz@+`gJXyG6IYS!XE(?ZAJjX%?O~mSfYpkOu&?p zNwilg06==|-ZiQsz#9RyjE(>-=8ph|V>FjG#^i|!mMb)32l%XrZrEU(26MJ)+|F$Z zKfH+1rm+duw2&(o6(rf75C+Uk8{iCsoB&~6=a+rn?CJF4mj|{i^Kyb$w#OnELVU;{ zo%g2^Lvzl{U#mOJkO9%bcwsH9O_T^BRghp-*1zksHu}y;*xC^|JzyXk`?kYchJYI| zrHiW(G;m0t{8uP&U{d@lOq*Ui6vw6)s7VSj!p0PC#kU&EOf+kq9 z&<0~Q5Z*@C^pVWjKzLrgY@JDr2Eqm&9AT~z@NZ*Y7URr}u4xYtX=U3@+17xhjd@w< zm0e~L3`#((q|2F2O0<37W#sFc% z*DrgmDO(?qv@tJ}y|T3yL7R~gZAPHl>_%ROjvFTB0aR6TOD+h9M`>AV1GII0 zfK_^OS0E`S?eP9_D&};jmU@+;g&>&$GkLPL5iWl;cAM(ZHyV0^WQH{n_!BOFG-jx9 z=$lBNXrM_Eg~Z5SXe+iFE#@6oYn6Ri?|@yc7HeT?xz(X3T*f@fCEW407VOX=tBX6L zu|vmNKEmP|J9NlqU);Tdw&nSGHVmsfbah9h8Z?<U?yQEMey6#fdTu+~z*{{XNedIidum}JhzQvRODi(#;Gb#3qkS>(AE@$%a-LzKiZ+6Zs-Y;XJ7$KPq=Ie zge36oKZN+)>5ZgjZdO$ zqdT#dBVS~EGMha<_d)wrX`DU4j?z?vW{OW$_%KKE-=gs+zjs)uKE|3;pjIx}}k^WPl zUAP>^iEJ#IV*Bq41MS%cqI(yUmc(=FmAu07lE5rbjLuf*8vB9n4QDZ*v1=P6N} zaw>pC$g{L;ZQv?tF9pN#6XBa18X8vG*@AFPfIO69-IC`hMYybKWe~2iI^kUd$ZB{J zT^s#~Qr(3ef;!Fm;raa`8MZ{PKRi7=*WxD!DT|k3hlBvvB1Tdu=7s?nCQ~U&!hj5Y zvYPMX6@mF)V|;k#`-_3A`5rZJHQ&o7ujacN@s~U`EdIeEfM;M?1dhp3K(dWA;ZJ$9 z-cbGd_czjNwNIPFxf?dnthrIR=SxV4S2objYwhsk!Q~Lnk1=g?=z9%4K{6N8+K?k$ zo}~Dg%{uh6=;hx{Q+T@r?>2l0k`+$q3gOu5C%d`R1O83qbC%)L>hS3_d~At8L+syhsK?#u znm-DM>HkuwtF?wgP*_5(_0d^@wf_06!qr-@7`R$%U&e}wKe-8UmOSU6P%A_Hr!+fI ztKAyGG5tJQZM-*_2ItA29q8F4`Nu7^GNt(*{rqpB*i!WV)%qd+reWR@L-Cu2(b#C4 z`WhxF0>^=wmmrPq0O70xKJ@O^G-^rg)fF@_ zD>vgD(?)`}%QugJc(G_bkQUy|$iX!Y(w{Qf(*qVDTz&@t=xZJNWrm(0S$SqaPq^$( zyJOAa&^M7D$Ie7wgXM{>w~3+pInN1V(S;6uz2Q%gY=fY;^o@oO(ef0xW8pOVwN>E_ zrkaFO#ak$V90*}772(qHv_^=s_&s-uah^i>G6Po)Ha6`{wV!2HQ?*({3oDXM9Ek{* z8~?}_bg5OKPP1lO4s>nwCzRxPR8Xf`zioX1>C=wd4mjA8*lAlUho=T-@{r9#fd9@g zq89ocj!a+`wNRZo!%+)eXW(j~_u+IKA4hVYc3)V+`VaurYO4siBg}E1&|g#3&pu=BmI$w1tCPZGys5rjX3mGhMpjK&K?0mWx}P<1bC@KKb`bg=Meo9 zv`4>QHi&;5qYf~3z0>(PW`>A+$K*sB4M zb0Goy8$P)Xp8~^&AbG^$Gt%%OTGrZQdhjV#c!Q}Xp;WlD&(aq-+7K?iPpEU0#oOGz z#iW<;ZUa{lpEd9agpW2Mu9mx&4IgU;t*wQX$`74JM7Xs6o&h_|Dub&C$eJ|+(71{~ zspg?FTtz_E59N&WrqlON59O7cgaYM%Y2KvPdg1ZFTK8j9+FI+62Cmk+$-vcG|ABKs zqt-eLahCj5SlY!QfM-vc4vxw5fdrrxmXc8>?0S2=Ue<0!5+FlicHCO9INVx5mbTmn z9koVp+Blhyb&+D6ZXv$0*0+%LJwVa1b8dOs`UsF;Kp3n9Ee@|7i0eTAD*}IqDvU)k@2zPO}+isKAHIE_;jI9!x}B6XKD!nAUUg&+a86h8iDjwk-dxyJFIMgi%~@dL4IWNU4|=}$TWv5;j+cuG|vhvT%Bgsa75Qe zpJOf0V+){8v%cY$WHQ_z_Dwe&PS8^gHxeaXOF~+e{7%}**hU(u)`{Vg`-cFaRvq?) zcuD+#+c){6?7DDw!D;BE@eA^9Nga1L{V3VGb*TTRVmAstT5gv+IO(fE&81+ef$R^3807M_%3-$&>c zW_`EZmdP#KjZ1gSl_4(->bD)L*0n}_RjbF05wwzgNW0t+Vhf#BpKBh5i+%#6>35K! zIaK$94L@zy6((QGHoozRN~50X#r_WHYY2boK+S6-={E3o!XE-WSXkaN#?v{8i1+L2 zH1cX)lovd;u13R0>$=vdYr0d{e5bAm;K`Fv1@+@>_!0E0h`46!FkB;yxA93nj;c*y?bn+zbbGilPV{^firDe&3By6iy zhAk{6w>x|Ym&9*q!mF%YcwZ5+YFwggqgS%_2pH9AHoI|)_x7Z5j9Wi?VB@MP;~mLY zVsW0F7b@wgB99SyGLT%2@-}b{6nA zx>pBQVOFg|bZztsT4i6zQKwnoDl;;L+;)4VTji&Fq*}#laUG@2fK;iL{{f1hiISjJ zZ`PZrsqvdYj$EWOvAPBmo+mUErBB`+5mS~R;dfwdeT2(hjCt%% z`1J8M=4C9G4Y6pk4>x?|D8l1ygqz&pn2 z{}}orhrSeWy5P68p%9I6~bl9+ZouS ztXXjIimZk_(KvXeVP3wEATn3)Wos5K|DM_x= zN>$cNjmrwGY$!Prgzy$Y(i^xqs&MRN7_=tnoxT9oAN>f1lZnQBneZ1Z+(rqhVI@WW z9mv{fzOA@UvsC>GXzeJtEgmgHZ+}NCy~xaZDV1DJPwYB0)dl0trOn+KpiUaE@VF7mYye(e268qt^xp1B~LU8tDNVXygJ}==5a)6g-brB zqrEA#lT&D4lkcL%PByb`WpIqiYlxgx0U3vx9S{8#+m7fUz`fIQhcwMJ81AIeFjwv$ zxQlRk8353CIP}X5JwfsnWU%g4`r8fwJtn-Q!33Es4uU+EhH&}fmu&tkEK4kkk=2fY zXe^4!`5~;Fu_#8?cl>;KCT+{*Rw$(0osQw*jZ$6cDJeM+F8M_WnS470@WhvWAwlvf zAOTQCeq}tUijnwiH%Lc1YWL19_!|IdV9%`ok z%=-FgoD1B#OS=B|g!_b#LjXw5s^oZ7lI#Rhhkih7360TAur(F00RW09{Iw8VidB)8 zKoMqD5f-bBK14-UW364M+3bqEzH_=Fe+lqkpgr`f^HAa}_i@NPx~4VOzyPuggCL$rlz%?2-Oh>=^J z7BpQYY$26w>_m+M#sdHrRm!4;q*Ch85H5GzM6=&)Ypm0(I)v!j=uNEgwBOMo%=!+Q zk*Q@JUX<<-9J_|?uflPEHhFnEQl(1%7S1^fNYg}-p&}YmR~{9(?ALUe*VG<1dF|tG z!Qms|Q>pPM$GW=^o!fa5CJ%FX?&sDlaPiE{R7w+Uq;PjD~V20t&3am13Q@h#_GFce{fLg`e z0um%A00}?^) z?I44`d%!hca>U3qdr}`+gQa$I-8N}RRwS3a8FuN{WRRB^q1i zOWH=bTnPZ^BbMG2$nCyWll4<2S$?y?_wYu{tUo+jc_^n7YwqaEL*$=4OtC8 zqVXCuavlNc>on_IJ!ANNvAxIL3BO0bpJowNsEyM8DTGWmhX62_ig`U&)yX)J0L-G? z$HA4b#{?@l;3EOIdcKOT!RlG0@CF7*B#}@myh)9E-5tb(mX^_|2Am2ECl-_+*h#(z zm)(}oE(h3(alDMIT8zbTyiCsTHqm0tX1CZ1+p#$on^~A8EUT%)6bJ9bb&F$hsePzV+!skDs^EK0cSP)}`30y{9P zb|AVox*zSZ@($X8+3a?B3O$QT=GbB4)@gQ7;cj>uTAUCPhOU`?qfO{tLHRTvTAS^!(lMForkqJ4ug^P4Sotdo;I64 z4!u~|;LTg68ax>WKrvP&Lr_UF4r&03`v91}gKFA~cM00~>M*Jl5j_HEg;NZaX$MYs zP2_xxz_vuEmS`{q6Qn_JNS5*|Tiz=xRUEj{lY&O(-==N0RZF*!iJV|3Y@i`rsuDEN zdMh5*naHZ?h{o^IS<4tO!tc_N^-Z@Vlj*iXHy$?Ku_HpJgL%WFE;W*eX(>wE|%is({f5lFc2{5-z8k*-p1Z-)!g!lD8dt!etC5 z6KE)14t+h~-o>U)fU%fJcxeMuY34G+>tGtmJJG@-QZULh8J8dJ_>(v1ujbwrgkGkE z4N8ymYVxVD^BABBm+P0Rla<+4UF!spO86!j zvKk0Pb&%pK<82Pg{Sj)lUJRO zqM_c!mCuwZ%I`w}tNqd7n7kfH0MtIM$El0ktvzh7Mu1F2_l2*9S)47i*pyjj;kFC` z^2h-!^MJ*nQ`L9#R&ZR6MVov$R!DSHyoDecftqaC5H8bA&)MkE*BE+&?pSTd3G9>1jPne|;iKa=b8w@P>YMtP}j zfIzCu4U~4<5Hk5u=n|zTzWlZkK6)NV04msdKE$yLixew3;L{;6Y)6np9a|7CZy4Lv z`1J4r3D1B*V$mynuwf$$0LIUX0FFgxlP|Ub$!2f#V5qjrp|3F25+u6cjD0YOhL_BgNy?}88= z>jB*kgkB>n+00OP1CGrXMQo>Gvv)Iw}!>zc(g*rO|6YuYlET}2elSnV9?7H-9joU4A5irY}zJ}!6yJ%v4)y@E41DQMSsj#F%7El&u=K7S&D8U zm0TI1tyo0M_l;OZj#vtxV?@!i=a{@!bFwEEe;M2JIT)Pch;^B%H`j=z=#ztb3nvMgv}pt}^^LMo{U(AHW+ivSL>3LLQ%UTQ?qviq65Rx{cYs~go%Cxah4 zV$Cx3F4TG(6g@hqw=mD3>lNKXDtWX#&00ju2}Z13M=XWk-J*(X+1pHBt673Pt%aB1 z7v$~N$%j+>eOl~P-AU)RnMC0dw8lZUXF)Q67@Kl?Yo@4~p8pfHt3e!N} zU`$j_E#xb|cFGbiBd+E!vewF5r&%3fh^~!(!Wv(~dbv)s{s1!xXAWsAvxi_U^`Em8 zo`S2Mp#era>e>h4>z{^@$)m!660}gac&6juUN+ka;0I;9ncvIgJD4wGJw1>%h09>r zY9IODAC+w*S^dT2YnXo?`Q$IZ3ENpLUT0XD{?X*MkGq6y5C0}?wT~KaSZN=%hspQQ z?c0;>>d?8wpziy1vH076P$Os`(`oX}gg=XX^2Tq%ww}eKhSfsmFEe@VBQ7G_N#BHR zgsk>4tcsc6#pJbJf1hkW!r{l)js$IGE0?Jew3WSR^4iMAa%&!6Qb}cdNeJMzL%BME z9-tCP0JMiG-c);-ZrcJe8Dic{3ToMOv5sXUoQpbb=lK51Doc~L>;_WFtYCYz@Ku9u zRdfrf%%@b^lhvYH<~hSVIE=i|L5?C4Ghb3iNIi!FyMQwt zKn*EohXJQMfMulEGe6*=fNdQ>Cn+LM5d|FJ0J=$WWEfE50CeMW?ly*-+rS_AK9zQ*MB9Z@%${B+*1nuY2hR}J%50G`5lj3HFUcQ}m48@Mvw!{n9m zM3Yy>`3~b<0k=BoCE_jFiajM2FvJ1q=}T1@FwFsUQ`%Sd40tG@%>n40#VKLHLo9my`o(?tO#4xoq>=Q>OkaH0b!CdD~nzzGgO z`_CTqrM4CYyz2le$m6SF0fhoSb^y~!v4g`@0mBKvzCI!VpYPcbPw1Ab*qvVeEWd-L zA9<{ojTKQ{BctxY&o75(_?{i!pVyS`k0UWxxMb zWWSe|_4~xD@l{)_h}UY8H|6;u-uLp3fXqp#2ocJ9B8w*EUtBx!2UIZa`}DW+ zgf#v8^hQ5d{_)x6A5=WN^&Essl)S4+-oYzuJdB61{l>!%)PyhPD-*fyB8`XjuTZ%{ z(FE}@T$M#A#p#L^8+qTWE4A@3(D&G3rN|(^$NnDX%J{B(_&y^wKax^4DIVa zjD!8RFV|itUJ04Bow*Ib>5sCu_YO?yQ~J9Pcg@(|FFIVE*KNWmXrJlrVb^aZ&q%~h ziac**?tj`28>~EA4J6MXzIQuO53oxP)g+$xr%x`RxFx5&sPPoh z1o3nsNwUUMh1))3{91Q8`mP=_r_J$sZ|n-j$~)wT+D7#YuR{uc0tnJIQv-ozNtae_H&T&0%Z-37lZuR@c=|VG(;rA* z|MQIg7-|wHyFN;{@j!=#XjQ;aZQsneCO0 znzDa-T+5!$vP~?zZBVwX>+{l)=u10Uo6axst%TSL+4G7aIb_$WaMW-&BFpFhYYSbp zF^l07%<)qSB8l=Ij+SVUvGPvIHBP{cRXJi1?UXw)VKP(lM0Jn6X{Jx0SdlA_rfRT1 zYe-CbrcJfq$Y}5so*ugs7&+zEA!a{LV&xxVP1_?evc@^N;cw^trgr`Av##-uTFP~; z9e>l~bH+5(*Kd1Ad=6s1b1Xsy9y?x>yx$`+{poK|x0NexeR?gBwm*)`)KV_T`Zm&rpK?=4WpEm(=#Z4DrMEuSeT?_u=WW>ruZ{{xYzp zm^R!@xp1qGvSG5jXgON)t1_LkaerggPuLgvZP@E0Dh&T$>A7^?0px!J`Tx7o=Z~^W z0b;i>4?Ng!LU|0<3kxC>t9$Yn6%ebCNCB!vFNV}UPb}}r{~7mS2zd^jjco&vkgMv9 z^Vzp{$z-p3`h=;Zie`(Q-vzkgHzW$WMk@h;Q&%O5Q931pb*wlC1tIvi|93{*m5)X4Zew zz8dYB<{w^v^X18q#hY?un?LNjz|sZYO_?tlep%!FaXmaPc}kPK9dMp*?73A#7JF{E z5fyv!KIb&G=gP-vzrqepV9(Vg$!gD1Yfr>`tbC1`-LFO=o!xhvc^y{Km7Q`=A?^)T zf@DEwBz_25Lx*BHx9{-h_9)>sh%eRftFaJV9V`U9Wiq;EuR(BbzfZ>g-kmQWfgNh& zhk!W6zPQ#gqD&{FddUNVA^OX@WwRToywent=&>?1g)NOlekf!Ze_VOS4UypYSv6E;S8dr!8S*)qS7OF^P+j@Tn)f*6g|AoUKm0GVzXEsn zqW>e0Rdr>n?A$q%Ki&8;!L=5=(}U|}jwYG+U%SIy?Q->F+WzYcI7$d2%hT74N3Q>F zn1`DB?O%iOYqd}3j$i5gKJe-KiBH7CAm%3r4_C41Gq=7XIt$LpK3-m~r`9D`X_EIg z5))6a*Jp{RCxEo^w9m;JPd9Ul5ihLO1o3n)NwUV1Z!ewC>$CW810}Ql|4HhFcYk z@!}aHn9qKw#z@;=zE9`9-!xt(@?1Gla;PSGw<0m|azi{zyj%gKjh9b&uNdba7|GH8 zBAOsxE+k3Tc$x0T3(h~LVCG`ZK;A{kN_0Eboo3O25xBfvey}+?>I|nGW@K{*R6p_FSt;-jutoJ&&l%V$Z#RwD!FHc(vy+PLOc^zfASS`9Ddr+Ox>ov!C@r zXZZZ>q0IX$lXTLN9!~{9f60D*L62;8F=QIVd}3*ZrE|x3!;kHC^$Gps-SO|4to03~ zKSx{>Ki2=5&mZsmR{ig4o+HEmn&eHn%lCh6Hva?Z`@h`ypA#DR9|IzVmhDNB)&CXN z|6IQhaGv zgyVDT%;V#2W?!M(bh*KLD2S)+v&5SlPd8M-3WJE>V>9wYybWT0^A^v6asNY;yn}yh z<6->Iv&6#=K-ze?4i{e0zpm$ij{6^)ARdO3Bx^hj)E?68eJ94T42#6Q`@64@b-u~j zj-4d+Ki|aifL%$(^OT-&dtIElze@Bo{+W1i{k`j4*sNcF56+*%e*+$gl6+0_W+O4< z<&4Ey{5b_k>(3{TR)6ksFa1|IQWN-dB1y9P^J}$ln93U~(Z2Pe-}XJ)%u9pz{RHSU z+!xry^o#wr?{s^Qp93lSwRbxGZw5in@gjbV<(od9xc+`HD?j6JrO&>9elYEqb$(ag zzdV$8`=c}A2VZ}|K=mK@t@xiYVj%t#Gx0b6qkb3qc6R+Sxc2n;9pH`ipC)-bG}-pF z)zw+r(}o%pvg<#+u2`}XBQ4rfhbCxGt4WfzJwd*#^Y7yDc(hyQ`S*_BYQFIJ?M8o1 z@^*k3On4yi{?`OO$ zJp!_6zwq_rC4L*qCQ7c?BySB8W3Lac%wn&XfVA;)2zInFp5BF#81`z^1onEIBw6h> zP`r5OBEfoXUFLZCcITIIoGnv-P4d0XK^T+W0i+z8L0yK&ze0YD{ z?>}%b39It{MIY;Miex=Mnf-0=UmS+`M>Jf03zNLP@nr5_{N-{#8gM&e;)R*cRyQ$a z%S_p~7)edgLVg*P?eG4@X%IZ+{>5KmDF5vC*Jk3@CA;cOJ>&h03E%)Tp|c3?U)%_o z>GF7G;ymq6P?+~GlBpVa_b-kxZDA1(o1y)o)Zk8Pu=1zj`xpFH!NB(~R$P|-{>6!Y zoMnn1^bdnr54?zTTzKqNP4f1F=%)Sd3Yq)u?>7h1wqJd}X}n}r6Af6{r3u>amykVs z`-OadykYO7 zzvlc*ZMM|#Ut;+0LH>Fl;vbj#{89E^zOf7UA&$U1@z^OLF8){VLkvft*e){Y?*@vu zwDsM_nd7ZZ=V61{kNSY!b-(`i{g?GTdJN8;(LTp&l6Nf<(>@pd#J4cVgVg&Mvw^hj z^PP!0z8=NiHC{MD6ZqtGl4KoU2eMb%e(*_|?RAlvhjqge7&24FH}p^LcsTyQV6QK4 zPD#k${sM^WSrQ7q6_zP53A|M+3w0I@$ycXq+?3#6`b!Lmj5vB z?(#^Vb2&2nsIKfIyNgj8>VHaYe;S@Y>tz{U3hjazow7Gu#~{ylcUG6Co$nr_BWmdP zHHa7M&+O~hGbljT^{YRwrT2$!yeyifj8e99!ttf+-7NfwfBX>3$E|Om_#YV_pXO(d z|J$};KnM}-@o1MCMUHzhZ1D(&*br>wEx{i3w};MwYjwEf_J^VL*wy~>_( zKRA8-{td>wto^snU(DPEAs<}6mQ(3-jCk8rSv|bH>Yl!gzwz7_uRRQ6#GRd_j9>8W zK>q#mI@Fjb>C+_d44hh<@!~{C((iokV2bJOU)+zEW3d0z`+0@Any~*#LX%1R}tv8y_-|rs2$ZoO3z)(L7U+!Vclk=3-y2L@$n_B-OD zEcV+ANNc~_^?G8-Fw7)izh2HO^!$q?S?ve;w14RDJfR>we)Kbc`a6EF9`p^F#<$bQ zKo)OHAm}gB<8j`(md@>A?C&=QlD9Z4?`~*~8O~?E-G0)?Cge@*gkMPlNeYqx&m z{R$whzdk9}ct7PA0O9;!6U6(4B+2S8V=u-Ndm45Hv9fjXvUTAWY|jsUdRe*;c&FKa zAbWO)?b%QKC-9DfO#TP|L5v5hYatuXe>KUQ60`O^;>TI+xfhVup0|%xdk(`)f$?9@ z1oqsXBw6iQ?8Seqa$O9+bVyWtr!m_iwDt z!Q0kNyASWq4>vjoGJebc_ugy31NYxG$=e)eH1W6*_SO20$2FYDdHwHM`>6d^U?hh9 zS~Y?F-Xcj>`x*a+$J0Ljp-{&0)Eyi%jHlpd`Xg_B0FU&*3Fv=$k-l42a<+pxOWOoW zM)-5GT=PNSTZ2|%`wRMa-1CRUFnn_IgF}8^l7X9jrVF~KaAd9Qri&%!@juhyf41T8 zJJaQF+L!CkXGopRpIQ6cuJHNEv+zuY{_D(dHQrnvg^Y=kt2D`b8;OaR*U!rmFHZnz z<7FSbJmwQQ)HD0E>{>A)yp!-Ywey#CyS*tXg2YPCmEY*jveShi3 zCuz^L`%B(TfFP(^GJB7*6 zUefD-&>XxDxZZpm2QBI2L7;DZ-|YA?1K{7fN%JKXw58g*#?1ANS)Vdpuv9b$kl!F~p}!=g0Ol z9D$t8A7h9|&%TvUmp=c~xkOnn)>L+WQ{>MtZ~JLs-@G}i|9X)ckaxRl(o`uZy zAn2>S3)q%lpwH!?$$vN(BgZ1_dM)b3ug{*Yc^~(}pH6Sx;rT4}#f~PbFD)?C>HN1R zeo;F%)Kx{p@fqYK+zfMEJ_$K#!&GPWnQR6s^L}tSDAb1^nK>n2V^#8TztJhTFXO|lC970x< z30#Gde9|k}0g>ksQjx?0Om(o2+R~%v8PCay{Ek7qjgNAd_e}%j&9pFq+rs#u0dZq? z41UOsw!mcEWtw4>Pha!wHdW<;gx=WiQBE zw2&{UII9DCluL4(kRFZl4C`KGKd=G|Y(_3S?ga}Zs%xQ4J8Ggb|G}%@0IG-31j#Xn z1zxC?*?1yW7BPdb!h^)BRD&XXR{!}x`5xXL3d&^xWyzU5^Tf-P`Np^(kM=o~EHv;4 z;XexClWxLJi!6cg;L{xNX#)uwVhcgCCG6-`s&F}*hK)s=9D2S85A+1d`wsm=!V?XY zCz438db}vuBc|N)54^C>GAFT|gjdf(1JX$D8LAD1kux+p+Q>qBP7k#FQ1f`d-Iwc7 zFcxhLq$)Z7GNsGa@_YCdmCQ5n9=;=RasZ!HkL?p#G*Y#z5BRiof)LsfBpU~wR=AvK ztXJ#McNuzuppHwPL&VnRXl@1`FH*1F8tO$CO8b+mr@-C!xiRC!H$Ix(; zp+-NI@AFdw9sa3#=sLvcIx7&Rr1Dawn~plxw`&zk={uIRcG`1u6Z9MSw zz6F2JZh_ou3|!xg`HKKPX;bVR$-hj*P7V09@tv9wk|5z1>a0eiRh5PUO%h}WjXYw? zA(fEHC6;GtT)eXyq_S|TN~coHHhFTA>6(WpF8!BkR1rv0@*Gky8TibpZkIv1UXaD}t`1 zhG8h7TmWgUt|XQ&I>d04YrzS5m9NI+RfqYShpzD+5aSbRfhZ;K&et+kR z4XhcuvLfh8YUoM{<+sik14t}eGc55|Z00*oQe9QPCrn;-SjPN{Xd`Gaoq_8o-Gm(+ ziQz@K(7eYHY@w-&AlVEHDk~S^aw-6z7l*#a&=VwobLbVGD4BW*s`*&~t860((@Ihn z8QGNSe60U4vjo_mokh9RlbG}$9E-?;gPHsq5p;=tE8!2lX?c$RAn2OWAZ zH~D3R&n36&ufeUDr4BS4bU@tOJ%HTGz6Lk#vW6HA+GYK_ zLN(PcD~Wt^JuVCkR#WX19yASVd&A`2E;q!hHp%x8p2_QZF(EPOq8J+C zbZCG^*kRim2&bBcPms{~wxb|iis4((w>$LH4Lw2f2cRvz!m;?AgKAFID%%Lchtf#7 z{&>}1nH~$N>J;pE6l{}d_nQcgef)O+0(Q!M19_6l7F6j8Y>_~vTX0+=3D$+Rlq2E< zBO*bvg`*PTa;7msvqN8M=n0Z{9D0Q(N@ib#YJRR&wh@G{Ws`C@qmnXR2t(k@*#M`h zl;^7SX{fi+!V_u5B+vX4lU88sMIK{aSP(fPjx-_?Bom>rwL0NaXG~D<&=(ncf@HX( zlEM=uO}IKL4{DWd1l2~bC*=vpsh5=LZ&9jF!D%Y(dx7I6tY=cZq=or@`{eh*U*!z` zK*Kz0*b6)~(mIPPy(_=0*FW-W|TWfE_o(U470bfgWm0n*zV4g9xci0Au^WNjVF zr-kg~;Qa$9vcgEBg=l%hsaFBN!Pk<}jJ44DbPT>8M8ee|#D{~e9{6xDvVPEgz9}0< z$xI$-Vph)r$86)*IO)2@uu)9+)}o^=3lP>)lDK}p&|nCcQvpC&6gl+uhMpk# zn?tYgM9KT8UVg@_5?Ez`v^F}5ltss?RLXQd0<=!SzU=5B*sbXrwUiYP1-%#WCA*>( zf!kD8oM=$=kPm#t3U@K+Dn+-DN`CRak5)s#(nQM(2nBFbQhdaVf?acr&s;7yd97hC z^2tgZTDcu-FPT&lGXuuwh4vjrQ^5N_!irlHa#f<3&qo@gM2^mY3#E-W(WT#A`!A(hkzXd3}UONZ&o zl@#j$${CIL%;hqZ*BUNDK6xA@@cnE}^dN2U6HM8COqyR*h%pYgQRK!?N~uoq7Ss8* z)l=B*iStyw5XMA3%|=y4Zyo4TSYpuaif$p5{Ptbn5>{2BWfF?Pkpdm9gB9LzlwX6y zOkS(0MjpP~{{`Pxk7!LQB0A&Q<8h*5aGK`&Hv3#p{z{9u@sQsHZl^lOk0OkS&5sd;Q7A2LP@b~yzLSRXzBOs_r#v}H)RY{Bhn zY_3~+s@kQ36drq()-@7jkD?>OetZkb$YPSb0F2V!2a#Ntm2PR6sKSOKn z<+j5X1-|=Q2*7lLr1Ck6)kg0KO0_BZp%f-O#Z$}=h}nZ;dOm*k7V3a~n9CU`JP`RA zWAo}~dGf_?+L%zd&61sD$xbI(yt-ZX#}8%mhwJ;?a6YJ?yqWCX2MRwgT2qR{G@Neo z>ILqvT%%g!CJ}GK>#--U1pR`*_=2v;fzRbHhN*CUqz`L$&$JP|mvsurb&k2>X{_n{ zWOqmqD|;gelAL(i8$3I{aXH?LS6kj!SLVMux)j>*`W0S;eif>4PrI$Wi`EqR=i6D| ze|k1uQ}Tc&d7Gne^6q~@5S2nN<%E8Jv*vIVviHAK$C4En0EGKrn(+P?NwVJOfqdET zGa=AuTK}^0eyAzKeWq%q3+`~)`&)z5pU1_}Uz5DeVFpis$lt&I{DH02pW}MGWW_9_ zzb4e5Bw6*Z2> zr6kZ>=+&JvTl>kfWga1fxvtbxCOCxbj+MU+>vqaJ#O;joX{POzr-6eMyxLTOki*S! z*$N;u4F5WGru(|X84_vtMGO3Re7pptjgLb(fy3|L&(rv5)C4YhoFv~oKDzQ! z;)6|K(D5wCUkA&e2;3znOck>?1g=x*c~I(TppXN$%#lyyfpts)h8; z@^6jX%4Pf=NBm&{Z9QGQ|DEN)jw*#1tOzVtBm&*XJHnf<-Vff7x-*HEYV@Z(EGgK(j(uJcQwg77)Si3y^gnP zLguvJlkPxWy#5>qFwm=HJw`%|XQBz(>u{qk{KL>?EcsoaegA9L_cL{YtyPYfwfxed z`)D?vt-aQEv7u+QmpCjFq7Br`~`2tFz^SlK?1>x!gErFw6w^ z-}Js22cF>mTZPC$wBN?N$pgrw-&ea3ym6l`*T|5LKNfi0ms|eDkjRYXhA4x50(~;w zPm6ETz$pwbo!O=x8^$JCYV9%L_fBxSmgd{6<+XR|RUxnwol;5K{h7QwvHy2a;L!X}W-PqIe@2~7a zK!*Ztf0aFQKTbgc?`O3?yYK})-rHe2>wx%Yk3+voq^?cx8LzQv|T;ZVjO=HQ|!UjJO7Jr>5-l_rC} z4D03>^Z`>W{-}0BBz`5jyoI?)(TCtOBW9t~Ezj7(|71o#d*SvML4SskY#SZckvZ6_ z1^53`XN$r3ul$|$PGr$5n9!nwd=W#S26?PFTskej-SW#n8iF|}UYIU1aHuO^Tg!1f z6h7X32)0RC?*u(}Pu-@dytj7K6ujL}a_gh4qkLJbyvl4m1@`@t2cq8Z6?7V7e&f{N z?*TIY-a~zv;rAPq$HW7sLJQ-!2eMyAyf)>)5Ty=EDEbDF_~M2~E( zx7lD{j)g6`?1ZqTa66&#Ha^Oy%;U_^pDCLkUGQ0cf-83>#tBT6bmI6_&Q5}f{^+6) z?NWw9790;E>mLvPj>ndXNnJBR{W_^}S_i!4)Pyq{KFcZpbbxX5=BLyQc5KeYD&nZRH}s!yO?Vtw@6CvsWI|l0ggsW&}nY+)elLPI%S}loQF%3C>tc$#|5cdszkHWt5CZ zU^IvZ=?y;u0dKd&JD;O6JsWXg#L3ktoX9Y5V7#gVqdrO04ec!WbTjxEJ|loUg3Ng5 zV@4jdaAVp=-mGw<4LJLZ?&KmyxX;J{0?qTthp{vTCan!PBha0El@V?;GRRJZP){L* z8E``?0>~)FX<+05Cy8**)69N?GuQ%uf#3%eJkSeIa#32YhlMFH{EQ3=jD}eIqQD@a zCoqVhti(La8b!f#E6s`|JMJahKfHxmXQQcRznH556d3SIoD3)L-h~F)<2c5bcPQCt zOQ8X$1tVEc!D;uff+x9nCvka?%$b%9LWamrg2{duFU32Ld$W@xo+f&GE3$yJsnEm6 zQI_OSa`8UH-i-CNnH$l8ux2T&Gz+{L!AC22su!N*qO|Of=q8JT%6?}aD1C@puR zf{=7^mJC8B=?EqpGoQD-*~t+P5WRO5y+J12vEyl$jzF>jV+}NOBWe*=PleUf0xwPQ zXa(=)g(vYoO&RWyuCpbBkV!g%N!sig?|jgkog9$@DP%V0w_$}y6YglNq$7|_V61jV zu5$iX=WslvpgpH{sR2=`hwVwA5^j`>#_lD0j!8-(keqMsUShbssLF>~%J)>|2_%R7 z;EgkW?+x|jbu4?z8rbFp(o{6w*?>x}sZX^?5%oVsEfs;iEfr1919^TAE)@+tSr!@@ zG2G~GhKCb8;OA>bZ1a}x=;RcFWA8&}%FZfHJa4fG%viT8{!IBh)XqdM;^p5P{MiE_ zL9s)2Gq>2N%B_U&Oe*)nVAR_Km|JW-<(Ogm&88~-sX1s29QS*wMV^WGA?3R#*cZVT zQ3FYlq!a?lYL=~H1eec}QL#D9Qa)IfCy+dCDbH~1f4U27CeUu1WEX+rodHy`u@a4m zz6}Q_GT3X2Eai(jkP&!-Sig?VNro@xL^52`5Ngx~(-%|_z92Y!;YVnFN)gYB7J(US z=}ji(hd?=zi+K6JpnOq!%$?Lk_iz%a0)4_ttRvOwE7b-2gc;NKa}1RZl_PfmhxOtg z3IK9^z+>B<4QTRZfD>*L0f{Ih+%Z^MK_#l(9TxplIYLxPxpsi3`2qc3IE}jjxl&3b>J^{K3 z&a(zy5+^SPG)jZ&RElhwNhIo{An8mu1Wf15K;xQBwxGU|@)i>7aXTTME#hKyo~4paGxDXes;>!vPDN0ha)POjJgeD}yvPL0M=HS2PJE6OnDuB)I%m zl}|UylO7}^uKs^wwMOj^3n~wJ!6FVh#s(@vkuwbIA(QF7T8{PWLi+J}TG%pg&_+}f z0d!LYl0C2*imgs&E|ZrBLzxw8^8l#1gHYGK0SP`CB=@H%<*tWdvgVLiY;KfElQ$d<^YbymPsUrHW_Nfg0ZJMxGXt39X`>24L)d71AS^PT|!>IY@Dz zYtnJFRotVAdtD260?=52xPJ>YY<4oSTwJ`1FYcVvnsPqj<`)xhhe>~oDJ=NmOg)7_ z@=3VC2sef&JHCKW@}46UCH%4~_S;j*6Sb)lQ_@?Bo2xc{1722?D+wXN8Hap>UZCPb zAlc$*Znzu?0Ll-yln++r2_#E?XO?F;PEsei7SozA+ISR=cfLX;J3uZ#h?$%XtV9NT zWqeq9;3krB4#EpOV-23`AwP}D2q3?NCGezS}H_x za{%4RmzdsTMg|+jV;Q*R9(uxmdlNnA({?jJnh_)kryd-w$=f2#`58XMFMR2y?3S?t5w>V4xG&=U?x>6`4FKhRN)qKH|3F}z ze?~5Hba&`9;8TzX*+xNZ#@iBzV~mzpK89m z(DQX)za1oT{uf{TkK&^2{f!|a8!gX%!F9+q?A?S0bU6PDgFD1qJYNuRi>XMV_AdOq z&TLqq@ck7$--y8g@3Fy`oC7I=ooE?|Q!A!1KdbD)lXVp2YA#ehy_&?QNzwf0y;=xe zZ$20#vgCYf#?@T7cRPp~|K|K?8>%5(&TK!7`S|PAj~%zMzrN;+|E;YJf8A8QkosXm zrs1zQkFmc_w_|@D;tTwBCHQ*&@@>C5s|vJVX5seBzh0`AfQr}uqZ3X=TjtBDUHZq@ z|BZMv>Vsuwq9s_ffRgc&%pqDX{9S`6EAUfFGG@kc}w;SSyQW1|B)a)}l15 zMLDt(%p32#fTYL0j3*Ppg$?#8I4OhO2LR+h^knDdZDkZ3B6XL`y`M7ALy!;>A8vF0k9??xGQ zv;x+asANVZ)}C0&o3ZI3k-^^3DvvG-Hd>2i7T|?bsoL2@!*OpD1_cwy{+;)klgr=< zoZy&OYE9X;ixkuc3|SL7NkQ$I<=Rhz+@}O#7C&J(M52?xUP1bkc_<_w#5|+2@F|`{ z-A80EVCu(eVOFOr8R3jI$9&pWq09W`u0T_{m%!P*3OF=DLBi8y3c1IbQNHvR*bj0)zm4SaU_%bz% zF#6*+-nrh8HIb9-A1W2^bdew*2be4#0E@%;$aSMr^^%z{%5i*>s1S~U7X!L&yBN^joc!DB zoQrHKidN-&tgFiX+c~)607lfVfL|zTpWcBh=7`A0pHUj8+mXu@rYoLG<8(X9Zi(p3 z1y6RY#8xJGbQ{Xx1#lF_Nexu;HGd8kVkLJ23nw)I>kSeQcs*sBoD?{T~}pm_5ru?%(7sstma z5zDTai-Qs!qrj`3;uWcshyztpVjDq|_~0K|ODQoNS%$FDN(lnVImpfhPj=i&O5B?c z5@_pLiC3uP4;5GmVkKL%5(Lht#I9Q`O8fxLtV%HQ6=FG2ZLAoJc@+7Y;uWfthy_(r zqLfmCZe=%0;{Z3L4PnES5(JXpB0Cp6*)agsK)$_|m7t>W&Zntl9i;@Zl0zUzB7^fO zA*@Px=QlmgJ|njxC3fUmQD6z+M`s$SQ_Y&o*Gjz7NAHqX1apFSh9sD><|-Mi$~rw) z|Jqo(Qq%B({?BmwajuntCLf;&2#&B+KtH zI>F^}RX*4#Pf{taf&O%^G#c(NqmzRIXwq4i$hl_icBG?qL75fAE_v#7 zqJGz0ukTYBp5!8lWj{zC@2qAp^JA0gW84{y6!(Ce1BjksUdP z&k02?L2K%%xQ@zb$53Vvu}hvxMPRNrq0HANf= zQkSisf~+KNF0iXut?vblt&alAHg9jD2X#lb2^lSEcxbNz4+GoocW|o>BAUs+{ktZJ$Tqcp~8u z*3>sO5L+DOaLQ}A$ubK?ZyL%g8Nf}ZS21Yg?A%|VErwV7PZ5+}(qNFRj~Omcvw`>4 z@1yxHoIegcDbGY1wFVG*b~p9>?}H2%Pvj&|GNs2m=Kw4hVdf)|lisdgZ8M4JN%G9x z1KJo?8x&9nwb}M9^U0x|1^>|ei6H4Vx;II|Z$z7*6OGB$g_z7R$m5?USfM9}i zoJkKjtuznC#z<_9dWXjhOYiZtJBJct_JLofd>U48A8l^|yEj|!$OiH-O;9Yeg5C5= z1GiuvO4H?L;bFKA33nVy0~hs`%$(qiGlg>vqR9=M#|)5spZHTNgLa7E^1LcP+){qH zDo-Fe0d#YfUna>>E-sVoNU8(-CaqJ$@=!(All5jOvIcpwFsj1z5$8wj!y*S<(3wzs z&ZgjS4l=lN8H=7u#yh~%J;!QG_h{TJC021tIg-rGkqT>4FC-qB`xM|Z_2oV4k;-RniiD+(S=@P|yet222qc`B91 z0kf2i7$AZ&3AQtQ%4n}$V?#0N0V++>$-N{6mid`P3K5jY0Wxq2E<5euak(id7njvA zhl4RXz}_mkN4bN^EF||~E3XAD8zU%4NFdqJ5_R1acgmJp8VkflvCoi-uE%)5{c z#;vg^d^0N?@q>foy(j!62hD&27^WL~yFF#nRGD^ErlTqo>Ma8@6ltYtwHW7hlObZ$ zy#aveYIK65E7-t5DKx=kO#;aWPzep65nL{s%2EWH?(5k_ z^~+W-Q$DvI(M9DEU2_#TA}AZfUIsUU%bHi&OiVgZrCExh?-H(SI+I8_L`B~Q$iOAI z%z`M`S7-{##pN25#=b&;z0q}?jik=gzaJvN%EE#cM_jOljwIY+k&vv3Cr!$h^Ia?u z7foHa_^|`+pxkg49L{e{izHYAfVhU~Vkr+VijW4K*5-!GrBjfJcSX$d4viLz zlUWFMldrr( zxV+a1<|l%3G(d(1;RN^vqTmG;Q&4q||GER@d;)u&e@!``$;3be=tn2M8`Of8ganei z4GBFv8!1n|^*cSq;f!emi5`LIhJeEfTWx=mol(#|F;_ek9sz8G5MX)jtI}+Q!El8; zv8^?p23hYs29nz`_;f#-Cx-=3!@df4TjZd92vk*AkV4U$yxu~Hl*f1iCP_E61Klh< z<-lnKlJ->7R0NlalaPr=7_+?N7%fBMltRk>X``38Ch4ZEwGW54oa9O+r%E3bbMJiE}c8H+&je2VE3g3Fi*Ac)bnS>7=Z zi=9C0M%l~0^b&W3@Jcf;NXvIkxNA7kSJMXwo=C-w2+9noX#@bl<%UaaJSP2_O0yKz zCbF+uGo=(FC~pSHz$Lhx0zENdZVKvRaQD3wJOs`gJWS>sM1X#A7PL^}f&n&3H~^~! z1{bm>f`_u@y|gh2XN?jFtv3}d33>AbPYgC{6g7AviR^}7E&8jp(jQ)M=iFwccFKAO zQCQi5c$9JPKn`Ny8|4l^qFXl2>n6m&wnH2PgDg5{UuB&MB+q7sf~OOFvI%zyGF0+ZDvubTY*?5G%AK&0VPQu5;up37lU}aUEQLOv za9wFkB83RbP=E|vg3Afe6FX2%LAki>mO(K<;Jh)wWZVz|UhHN;Tc{)?kbM4jQ$n&P zVt}&c-KZ-Nh>IpTJ5$k|i}_-pSu3m83U5G^{-6P}N`IAB`ojzElMXAjZPq)FZR87I z!yU_!0{|^FQB(0Tmc-;x5)PdmG7tot(CgGmz$;~xNMhzOl;>d z%R8p1)mEC*mUF)_gWz`s=Q-tg6YdHm`pJCaID&w(!Ho#YuV5s@#Ekao1(u&lFHmWg zqFf@8;PXXM7m1*(3Xp-DL83UZ?+t4Zrl9IL(oQ=m2nd`v2$;-qhyeZkENH1pLITO2 zs8t3RvMRV!wrq{c0)eB={&3?wU^Ylc!R71Oa6u2#BC`HTR0NIL zWpJ5G@Z=QAmMu_OAP^VD0}B<+I-4&D4#V$79TM~;vP(e2FzsBGR{FyW?s2)O4YuBS zY$LmGgFCt*Cz_U922hiLSEnqxwN|V_%QHp>*fD~? zLP)j1!xaMp$=%2{j2A|5ypTzJs#E*wvKLMy=!8QM!V4ypj5;fqmJ3N?ZF$!|4r+i+e!qGQ()hC=QJbFaQQk_`{PZxW3^h~UqM!LeQvruO)Vu( zC-?#je3~jBNAP45?n(y$E+;y0IibPjR0=L9elpW+{32%YnnnuY$l;c1$$+t-3W1qJ z65fYKnx%M4rCHJ;oOV3IbX>!U&L9gN20RUW$2-Rwx+ZdxT~68Y&M_oa2~ZQ;PjOKm3Hkwpul=v~Na+gF+{->+(U zB*9mjaMvIJ;94pV*HZRfsT$OUXNjzQ*5cXiSl&RpM=0{V31=Ge9EgH3Gx+pJHU|r_ zfYXlgjO%JmxEC$B444E{;_1gw15Z3ivNtI^-uWy^(h<`-iJbI$b0`Eg*0{cHV6n2f zw(fK8oi%7{5m;CR{`C}mmL6uI2DMns?KB~=3^`CZoTolhNp|Gfz} zzK}rWd3OXVDjkD=7v_wZG0~RuER4g6a?cOR{fgSJKd^$#QK~cxcPsV4$q}3J#-B`^ z$BIRpg1RKQKrsTzyD)S^W5;v|E+^7h4$oj_c}FBI+M@lV?7F4`j+>QYsRS=)!uj*k z2vjQHY#X$q0$#0%u-swcnnmb|w9JmtEv0KKO_*I}m1fBvC6gydoTe3z5VhN`wIQY2 zjzy&BA_v>Cj0|_Jl9uqePOy>r<@+bu7;MxjD$PbcNHRZpOVO#ZG7l*VtW1imC@0l#KdtRkkvSrlN zB}d$c#V2|9`>a*4DWxkGxX_9~awEn;27Q9d%1Wz1v%KRgC4Fbgp1;)8>LX0yLzLD8 zPcq@IK|~*iZ{T87D=OnvjA+aIE#@QySxza&)MlSx%FJ<+O0#hLNx0;Q9<*%t9yVdY z{CgP9(7^t2Ep7QIh%aO+}~1%4B4k%4||; zR>qI0jRQ58U(=D9ZNs zP()U4!pP0z?uc++dq@c<+8r^TGQxlX4}d7-Vg><9XcnR*ryaklRi^B0;C8m)GT;Jm z9;aT7=NV{*TXQ751 z7BdVIxNXP*Ad{C295Gl{mV;(mdMLc&KoM68`pV15fPbW+81N(%LRBJ=9B$f{;c_bg zD4%JTcbvV->@vu1-4>bteA2VtNbpD#?#d$iXvlFfs!}S_-l{~jWsZe0A;|T!3Cl$# zWtU?n$9q+pgqDfqwO62BQELWMD`laU{T)+gYHf*HS||Y`4q;hB?wG;0I%MkZS_rnV z6@g?>`%L1eY^a>}Qze9cjuY6Dj-FPfS}i{e$@qCwLVT?pi_g(U{_*8dD^^h9bi9 zfQ2iSmQ!c3p_o)dr4F;JrP3@}FS2eYQFKEwwIfGaNT&9+N;5T`s7G^|h0@m;3$oJTg>84>^u@D`GB#wBB@rH|O{^k%V;w|3I-PBmYU=I^gJ`f7f#gAqdfjj&DNS&B3k^@Prf8OTJffC* z11Wp;N2aaTUS_mxyu2mfH{q^uqMtmK%5%_B0k5HmuKKMuLv1J!_%%goWB1qE@dKv+@Mp5cpn>!PX6L>+5OhLa^>9{im@Z7n+7~ z(YM)PNCL_67&RFx5nO&p!>9!3T(i8RvI;K#IN5*&rXgR#A}6#@CA3FPxGRh3qou>e z2s$d`wI$J(K^6}Zg4{QqZOPPPzh%nIvAasMaB~UiMuLv1g;=Onv{36p)DF}jRuSj1 z4kk~ijXBdz-CYYwm!uQ|$!D;g*svAB<);9^Ruj$gjvtjxCQ|m@ADXs`y2Kg{CwL$(jnnB6cLtZEnHU+`r>J9C??hJ5R+wgEmWE%dxhM3BSFX1em-bYJEhW0 ztszlc8p4^LpgRqHWF>4F$s2SF@Cu@wPTNZoobje%T(J-xh9r=zezR#vg3DL{P(IEq z?--*D)|s+@|G+fl)n8bQ)&xIc!d-)iK3Y0ljG&`3URx4vIoHCN5aiQp6BJYXvQ}N4}7%h$9>n!lI3cirw9~yA1vKX6;=2C|JF7Ke-l?4DSMGPXhnD&ZT%nNBLges4laHb`%fh+9DjOsniHf3pE-e*euyh^iHJvi-nOfAk$ zCz?AfG#PL|T#IQW!!DRcLXrpRl#OX5lCborJdK2;x5h3+|7lDkO%Ae-ihAc7BX!7i zhesXDKoe-@9Ta1&t6P+e=wd24=^Il?r%JPuuOjV^shXP-tM(wxgtR~oNN1{n{fj@N z<++Sn;nkxRWI%0dfwwN@GAvplNV*xu;73WillxN17LOSj-sq+&`r$P}0c-0h%6$9 z$Rcb+7UN(}iNxL&>aB?py?ALNg;1pvPgRBv4EPXCAu!>}^v-N_7N+K27K}K^K$T{t zN~ttgt>M%OVxG#P|9;hWgc91TvrYXsDYzfOds*Op&NG{=OMrJU;8eAy^9~G`q>PLR z(*UhO0ac3_zyL%K1|W18fC{5(kvwuIM%W%jBVx<*Oe~?w(WYTs444nDFaR^!`XC#C zrKz!pC1Z&LRGPIa$!SLwrs>Kg`36~NGT;JeVrzn77i>pBlB*VF$2;#N2^V3)B$1Qe zki;7w-l}z5WlLbY|9aJ8FR!0vdincKtR#E6Rfg&1Mk>u-u8p+&;y)w-o4Ku$fX&=f zNx)|Q{A<(93ssuUJPT>}Agcsam&w|LX}050<`{+ztg)W~o@$xVVmb>~@7?c;-LAW?l?Q4KYanJV4Mc}%sAk-<@D z)H$vlm)K;Se+Krju1%1*;!MkRd^=67{9~Kh4p$T^#0sz&3%A*=kHmU*dT1rYG zy0R_0JtO`H@oGj2;mCa^oQcSjpbE~+p}}rbiW;1DR8cD-a|t&d4-keT3@AI3;yl36 z1Dm^%(&e1+Kz9OsIp*E>UDXQK;wFu)q;O_5{HN964$ScB#kfnVNb3j93M z?mGi5_)v?*KK&$Q{L1L~;;Dwg024Y+5|W*pim z`TI__XEXbP*+}(7X==m>CM)0W$>^9|dc0>T5&7^QF@yJrHd-%2LhD6B$%<%M4e!lh zoRsOvmRn4?ivgz~60{;*S?&QM=VDQxf>cNo2l)`E9bFXfZUkCyp~HZP_jtz6&;c`c zNU|p>8#8vKN%lgXu|v}9$?+CXI{huSzo8XERwcxu%ANO{s!ZNtsxk&?_Y)N@e4r#N z&>gb5Bas6D`}jx|q%l`#s01IkgGrIynk;biUDL<+smd2h@J$BX8te7X!3u z>|?@}^*gX(Skzayo9evCX~%fa`WF>FY@riKfX6`x=ffL1Byy5{Oxf|yVZ1Rs-7^4@BukN;qt6vC0$Ot^~ywWhLR2v^>99~*{6otkc{ zlfY@mO2s>!ivDJy!+>F+gY7zo4vCy(A5(U`a|=loj#-yPPWtq*tDMF5H{@ehr3)HU`sw;VG?u2qcr)LVDi}(rjNhRVQOi}hmVOFd`z_AV?u(D zNhtXYdMP)WK}Z}?o0tDm2uFsXlkvb^47eSlLMy_RPerj|SkzCqnCdLxwBvx{9Y;kg zTj(%g66oNRWkZKVPO^_FJKjl$Q^=0<$;XuR>Emz9T5NwqK4w)0z`BMiliQoB{J7av zuCVa^OcI2tN`&Moi(j+{F_=@FuaBzgoQ6?HXaG5T;yW@d5*W0uz#- zGB0dm7A(|Bm1e;Ya@rBdbX;Ln^g|0B25bZ!yeMs`ju)koWN%V7-jyb)-o&#y-jznu zr#CBeA9InhuF-fW_3 ztRGq6nF*#h`(`p))-QnHZ-K`s_#uKf_rfjS3Ns z7z7w~b26{Ir4Xh(X2M+zs5Ozj$qegmG=&OMX%@U3rych*9ajd)cECc10hb^w-cB)8 z#~Ud~vNtI^-Z`G6TJb)4lafBY8Byx5dXrV@0ukT}R^`#JOjYhzX;$SK_0lxd5{20FG2KihG<|P4&@)mg|`&zZMaz;PlFa ztf}Dfl7Nz z^S3wA$tQe_4@ctH)K;h}EKjO58}G78v+*jBLp{Mo?Gw^$ynB=&Jf6I~j^S)PyMnXv zjw?7DPgig@-c|)?<6U`-m1g5DS8z7oNd;%)O;d0--VOz4W)srDZ2?@;PW;(*GQdzbN%lrsPl0=-{Xv?^VfB< zAs;9k`qOBn&>eBMOzBEA`3s@=7=dYVo#}|Z^or)BC-jvsV#`i9)-+PFTx5fjTq{#8G?omjTD;|!e790;v))X8Mm5~P} ztnttrq0rC$_)*eUYRCz{YbtU;NMF;?aM#$3;H%N2XW*HMXUVzZBY@ zLY^XgU!=x5B$N|D^0`e2?LF z`VRIm888}7<RZXr3aM{rS3RT#b5OhbVNa6J@KD|T2AKb#D z#^C`Y>H<}{_6adZ;bsg?j(`9~HC2(z9TVXBgsy4w*n>Ga?GvB60MlebfYkQ!Ppy{Q z2$&Q_h-ruqR_5 z3|Z?XQjj~X1yb6mfE%tt^M(%$6j zUq|LDt}S^<8jQHN2Nq5@WJSN&P*y#3jSY>&gR$6+(nGUQXQ|4n-w^=%Ir z0^T5rVeu7e#EUVWPpSwCk`EP)%FLNWv+=pw-+dtGtNo>!y?o=N++!VI-!lUL zB8-PB>;&~>M*v^^`{SaONKP7k2(9q}i0X@An4DM-~e)VnNb2Kma zKW5*>+d)0qv79gdHmsg2`<7f%h<(p429nYLarfZZik=hpP2~&qe^lf@YF|&&Z`!v? zHQ({;bNrAyHvfA3KCq4L`ygNZm*Ar8JAY9j_8o^z!@k!Ba{N9=1C*qoZhV1#U#BAf zQTt}9uGO^f=iJ_1MtgVJZ13>=$>s8o&s2MbXD4~Z+fG^gGc&&i9H;t8-}!B>lmFy( z@?ZCvpS%7S?R#&@XxecsG%AzjdvCXr0rEb76d}IiGmI9U2ZucDz*iUB@Rt}f14cjM zHEe54vEeD70wOay$qyZsd_~=&(TYKf1)p4iPih%uXnrU!#xP{M@o&iLeWLb!@6_uL zNR{QGPmQ9_@6Y{De~(Xo^AXJwTjQbl`-nyMANr(rbZLr!2OAQQNP)@%+!kztLKALtUi);`^V_x1+z9fukzS z?}J|b9ngQGzbLMM)I1sOQz7lyf6D(OogV*Z=kovMV*ktg;5aqDE$a9s3K&Hkzx=n< z|1M8@{EydNEcKtZsutJ(|7-sDwlB1eHQ_6H3Hu_9cnrjb26|rZnk9GR6)|)1*E_#x zJP#z5%{~3t-rIf^k8l5*>-T8O4nbb3r?VYP(9#w9_q8~G)U4k%ahI=tV}7}K{Pv%1 zzl-hvpSAyukDo8n-U8IGCoWj)*E(z|%U8dQ_Eqhz@j0JY?En9)|BLNkY=0rV-zUu9 zAJSS%QRhGZ?>#>har`(Q8$^AKA4i?di|@cbULWJnPDRBZhW*Dr@GBM-|I#_1_`9*& zuW0h0^@%_Jy7;mJJv$cs{YUxgL|^&&M&Q}O(4ar?thL;uqGiQ@kG zdi&>!>ql|@z{E%a>$k=Ar?~#yOz(4JH!igE`GlDyw6$ue&&DO`e||dRNOul zw@(GPPsR14xPBDZkAmw*@%&)%{NTTPez16c?>{-eSKL1r_s_-sb8-Ky&KUD`epqq; zT--lXFM$&?J?GUGuRm}^}f8_nSg4R!yk9*cn_Z==?KjlMZGWq)$dCxyAZomG` z?N{;mws?G7JiaX+-~P9bZ;RWf;`XVyeJXCB{#)Cp;`NE*=ZAmu^MjA`mr{M6U$oo5 zi02$si^pue9K?4Abj<`1ln{;-v?-bU{I$=(bnw_Rg5F~)G?@1 zZnfdNuXW-mWb)3BT<`oQ{%(!h8(tUad`d750i^nue|xxjerjN|-}r<A2rh_e(i$r zebyKAvj_azL7w+rOQ6v&@O@Wrd+TXG_oJclQGdsmDZrkgIAPhd{*dFzb`7jFaH-6f0)ZB{_c`Rls{#gPyF#k#UHlbCw`}b@c%-6E{@+DkKf%|0sb#? z`!x$67AQjdbt%iY{|n-uxBjFY_laMzsQ8yMed6yH1?ZoT|93v|#}^g9pz&Wp_&($R z|Ksz9iyUu9ixzKA-~K*!?OM^!`*nWd)8BK7iobcCPy8N5#jo%Cd8c+!@i(XW>-j51#827llmD_J<8Swg zKcL9?zT>S)QSmSNw%_?bim3n89X{n>R#f}~>_4E$_`c^yniLhktMBpE`QMAEf7dU4 z>t9s-{YQP`4=5_W=XZdb`ka8Ux5Ba#lLjSC;tIO#Sij5zGzZp{F6TU zpTAs0{R^=FvZCToJ>`@CfTH4el|J#C_{KNZpSPB!A+PltRqA`!*UQKHP_CzQJc}pb zSzMgKSQdvA&;cI+WXg8G@oqHCd(ikkb;)pJ_LM#{P5XVFjUm+rKm5qEO z^M$_uO+^a*KDD<$CZQxg!Hn_<0^i>gmKx|;zxT`fN6{R-@x66LkH6QhHl9kIXy!XG z#+Yx&9giyhqy!tt5e`u>Uvyh^(jc5e^NL?|QY6UV7f2Gy5$GX(`y-b;7Wzsa=t*-> zvh7X|am0I6rX2VS-+1Hwwk9ldzIgvj@$|tE)Gox+9b>HDN18=no%{>m7vy+i`{tV1 z;&}EecMaiX4K1?NUh6XY!&Al|o=oz<0Wh0IDEh-xk6-f<{cYQECm%O9ikl?}Jx(5=- z3U@D4~y`pHgbCw8J`^=l@qWkD(9(< z#`m=gtADBfzUtpftkqKe3jt5F{3 z!jFg(DbJsy4#V*n0vr8pG+)r)zCc9^?QcU1iyz$zUueYNfS)-24tC`DOXmyX?JaPMencWZYB>{3j9N}lN1ov;Y67ZAM7XLcQ}3cXe>?8hCL%|=>v=Q@ zsGy`7wW%jQ@0|2Tx_l;)>c$(H@?2dZ0xJ00-(-D08AXf=d_D=}_8RqB&h(b^xn7Mk z$8#oTP?-b_kN9zI6FxZoY(SmS0OomKF64O;5l*d)j~bGD{ro64N)*`s7c@UG>MV_y zOzQl+#m_^KSb}M0G)6;{Aa1j5@!J<_@m-I5+|i3*Y4KlTIF}ijI5;>m?nf;$VAU2F zIx8~q6~1qe`}Vh|#m4{%69&{0W&Vbk_*9FJITqjy_JE?3q60xDE4t17fsq04Y>A8? zb}TXKSbWs+#Hi!^O<3rKA()Tv6Xue=74eR4b6dbWX~vgi^NweW+FtvxHip15HOJTY zq(_cc?ZNZIt?kjySA6*6FZG8jDSk0tET4;he_!-ER>2x?v&P5I(K4j0uQkHT|;(b(l15B5i<(H|c>No|hfKJ?@m z54PqD`r{|5$Uog5PsY+S#mAXpR{wOwU4iXELG6vJbS?w z=!*S3-&>!^|Ka%{&)ghZs4dLjqo}vK2h_35M;0{yLmLUzv#tCZ6+1c!uA%4LGWn^Y zn=$so(maH>51?sRlt#O5%y(JrqdH=mK8@s-4#9yol{zBK;)&?3_#te1L>(PONy>6? zg2dP=J8=Fc%sLtRSe^&v7b+LLefB?cvCn*Kdyfdd2BC(@fYCjeEyNp@2CKwC%!jh0 zzx=*rw6+ILvy8rdJN4l7{2ws7p(=Zb%kuM2hFtbK#XHRmp!c{P9ZJ-p0OvurDwJwj zgUyty4QG3DyjlEX#9snUAzHj?+TUW|!sG8MUa&Sv6vrQh_dgncG?Y`Z?>qjU^qFt* zAJ!MV@neIB49|FnIcnV{nL@QYUaw8hX_c)35oG@2g~GpV!bmn&auK zM|{dxD1G1dH|odX7p(N#;_ff||9bV~3atkxJ97Bq-yIVGs(w6-#l8aDkG9A(>c_G} zTtBMa!S%zBFQ^}ODpE-OFzR=a#;Zkb{|8S|{+aQ-)qYp|{WbgLo1ek35J@Rm@x}bk0~AR-zf-P~CzA5d?@T7S zY3%He>8tC{?>y`smzcu~U*l_E;~OL13h7UZI$zU2rI2_kIG(NJchB?7zk0p~_Mqu2 z{9^(sscZI@s0(N@XzNOOwCI`92?yy}Bxh1O4=@R^Wi4hch3ts~b2V$e)^}H8OQS~; z?<1A>dFb!-FCLvK{0U1X{P=68om++X`Qm>S7uCP~g6D<;`}4 zXZ>a^D4OGsn!e~4p}jNbgK`BTkAHlRPd=b3hUdIHa`B(_j1T?(E`Rhr-US5jey(~{ z*TH`+I9l}g#ow^+b;m!n&WrI6U;Mi_G~)B&@`c1_TVxvXx$J9>&uTP)N(%Dh3ypuM zNTKohSL*LHW&gFka_Nt|eC^fWwLdJK-~J!KEA0PV{Acz2-{NnKkJo~u#s7bY|MlYI z2v)BUAIJIP-?o7fA1(X}iI1AdG~#3YE{>1Ov=1#QNb&{oQGts5)A3Pxw(`%6r>*w6 z+T(xAKYKm=LvrySQDpuT`OlcI#hPJCJp8-3lP|TG7ct@3{WVk*mvK zSu*M>;vdtgSfVrM8v}t;DL?)-n&DvlM+pCwLh-+)!pV*`Xn5oT;-BQGjcuEtyn)Hk z0vx>ri~01R(nKzd$^ELt$-7>e95D}Aa-7nK=_QvQ@0DlMIuJNrx-fnE5q?L7-&fh= zQ7`^z!vDBX{AT&_YkTqA6aI6B;{T564{1~U>nr|0(u@e(vlQVsC=~z8{P@ef_?x~U z{Yw?5e*)p}%;0!9#h21Ad+|pT{>O#lKScQB6#fE*f2S9}J>frBD1LRq@2K$mD*Q5D z{8EJ9piul1ZS&#p21wa&(^}HMWMTS$LijtsR{Ha$^t)dC(S-kTq4+Nm{y2rdK;ifB z;1Q+j2#k|u8~S;fem3^_d;a}_e}Cj($-ig#_bmUO=ie;;y~w}6^6zi_o6Wy}@b6Xry~e)+1MHmoCHS`# z|CZrjKmIMxzc&7@$iIR7TbX~W@NZTA4aRTB=+AP z!hMud^w8|a<77_k0!rbLFDG^nrPfnQ!0YbMDaHGWaB@aYY$t-vrPL@&y-TUplp04V zNvV;Ps)&epV}nCZY%5A(GCwD_H>L0ploR_CrJkVF1WI+LR2rr3rIa693wK*e^`umD zN_|eLFiMq0Tk5V&sV6CgGmmm&mr<%brAnZuaSKXyp%mV8$%&mqsk4;&l~P#9&WU{h zU9y|vE4Ck{c2jCBr8ZG&7p2xxsw9?#-76?ni&7s^3I-BxEYj!1zE9;QQ!15G@sv7G zsW&Orj4*~$DwrVadQ$2cNJi=sx_siQ>qE2KBUymNaf^c zfju5Pr-_wX@D)vL*9IVNax{1Z4@GtKr$qB!LQK*0J(~DPLvn11u!&{F=OwDlDI<=T zcyN6g@mb0GJIjdgO6rHph)X4PSw7L;l@x~%x7l>g+i;=|H`D7mJz?RZ&n zt!x<5i~aN&<-|rm+ro07fOn+ zwEAO8iL=@r@01dYOH}!wl=!g(r5BW}vZj<+Q!)XLXS{N)BI7jiatz&)K3Rd{GV(5$ z2wPrCEG-$ht(5qxr0sAiF{acTNXM7flgo&?rESpahtgv-+*~N5|5{dzEo*c7i5+D} zYPi|!ryndQ&iL76IkBwVNDVhB<@L1{#IEwT9Tmi+3L`b#Ots)$Yc*Hmf*Di_LS=4WYu{>T}P+Od-r6YZ=whizl zp?1(d8rpPoT`{q)exR<%sjCArt)6Z4P2xzsmyq6blYMf1k$khhyuMg)vn{PY!svYs zH_5lu`Kp0%-J&0FAoky4%W5FrYv9yyGe1mU*id{CW?R!xu8;8tbE)ildEf?=%&2o1E2fBg3nH)I#iSZhNn#xYXRX zsHHg3GJw)8yDn@awmT-lxkqkumc-5FJ8Wy(h%s&bkUrD4>WOyZw}|=LzDTj6o$XYl zn01#Q(m8j1t1Y-keAfQ5_HC5dac`?l_lYt0>HF^!7w@wp{Xw+-qx;3)=;o{M7xOyk znfHq|9c(|}FaGQ>Tf@!!59o(FisKKoLV89={ZdCUImV9kS26Z24~mO1%?~~(zU-vO zbr#=tvQ6qNWfQeLVDK|iD>Q)K2;ACu03UU^%Bc^*mw65$9mY0 z_Y&iuwrBMc>z~%&enuR4y6)s>L~2j{_%kA-r!DIl@lLNGq(AAk0mhZR>mfa%kA3%Z zVnZMM@#n;aKK88V#QS~iZ^w$S`|6Wp#p%9v=f{d|&+1vR;>5GIxBH0&&wW?|H@o}U z-+NJ9>vzwh7sZz6^)Fr&$DX(Ed{K;lLI3VW@zD!)&%Y?%>921cAeQvE9U36A`cEu{ z8|O=U;$SiRCELuw;>1fMHQdO-`o^ImZb;pIL&f?b`kzC^fg!f>!^DiC>onXP8Kxh8 zMf@_X?oY3X_g>boz9RO&Ooh(9Z2NS$`1F+^q-Vd@oow-1)6*lw%GdSm5#syT$=H9q zZkzXpSU+O1hMV(m)ZFxznDC~)|1GiMP0Bv_rtR8WV&+?@e~*e!<23#7+nU&qD{jxl zX|~I_{q${Z61i&YC{5ovS`)`dX}0fhoj+RZP4}~%n*GCgP3&@NO;d199;4a!;_4cs z-Fy<)#Ifpr?N}{5ETkK;9cAFc@#AvnsNo~Q^-o21zf zP1eLWlQjJju0KuEY-6TqV)d=4s-$xtc!x z15J#dr`bNib?-c=K!D#q(CRMzP!kL1Yx;Iv)8=coBe;(K5WOAnFl#evA0@uB` zrZ3QJCvhG3kv6de0p=})H9yhBnuVHeHLiay)JAFq7`;dfI ziu*aMwA<+Z@G96hRTCFi!M?bzTCHu@2;f|!>1mtbQC#VM=NiN=?!Q~3g`CIrDy})W z&RnbM6E|z(#9Ebqajh1z8TXUE&_WL2y5b8>KaFel7b-ttofa}{3(Sq{Qe3yL)AaSY zPH?IGxh^f_7u;{ab@WzE9CK;1rPDC`WTX5aEL(>o9I)0}@n730K zgSlBX?x-ZPFpkaAY@17nt2C;*4t!)Ofye!bu#KAN`wmL~u7xF)6!S_fKzd8bz|B>~ z4<+j#tt!Ts3OiF(d{Iizu8JX+eM~hms~I!57osKoBd*SvC$S57b52R6MUDyzA{9d@{dXj5z8xv?G6#+0tmh)K#!{- z_5?(YuOVgzhRv!WvI7aeppw43hHzDiI$A@FtsHiyhWG)$RmCJ-pH)+QqDL*NDSpwz zQfrDMRqTK#1=-Kk6gfdF%HrnpT6R}$aj-UJjICpz7%CQpQu=VH{bXG+t{$b=)eCyJ zq4>4l#1gnks2{kZq1aPjU*Ax;>+3rkiuZ1b0OZIm_KOWgQUiNjBQZM6hV<01kQt4{ z=V2iW8;RYGDEC?;`}D?Q)U5$XPrEf_Wn;1G){wNu;^)Rxeq@u7jm^cpCLw#8i?k;C z@#bP$Q-UvS8ZxPc*xEGY{TAZKruxzr;*;<&zz>ACJKjRfXcls=g;>)}ztTcnZAM&N zExSUVX%2mhLo9NPp$N&D>93XU9O%?EZ@lCk&*r@^|5Vp?G=}E^FX5L8tZ<75UC|3H zm*k~K`8CTo^XBJhX_~-#dh@XwUT|Np)t^#Y%rCLLByJ9tu0N-oSXbs#KipibXulFD zehko&z80WQtt8$J44Gd^?5<=dNF_Ult`{p)ZlbP#Qbl~Ahpet5#s*RD>LAf#)y zXIBl{S6z&)#_($T`Rd|GHG6!BND6-7-4Jm)*uEk}90;M@F*Wp*8e(4!N{_Coe^yiM zsyUH_{JxfbLLG6S_Nz#LT?exkWVakGw_WnuAxHZ|2;_VXXlf<-=LAy(eB_#(5F{_mRLn*Pm)CeIKm$q*yD-M+IF2qVyt+HZ!nUM2k z#Sdjp17(Mw{m1g+H$Pz&J zGl)+m``pUnt4fqUTG@U|7h`oN23zBT^ea`xiXeSzHIW{q&#xvjgF-&7CcdgVz63z~ zgCE!!A{JB+*%Kl*Ro9P)h{TY!l(DVm1FLI`_iBY~t}Rk)>EF~A*J{-Pe0FVK*oJ)| zBW%?saCr&wxc`iKT%4!NI=$=56jm5teiMsRzFovjPbMmf++FZSpql76~Zq0i?tQ(qbiCs z74%6J#YkJ-_bZB>HhoV;@q^8FyrP)lKfMHQRtMOfmBr}*eM)7K6Hs?vWw9+#|E97y z5okM6naqRq)=Gg_DvPN)!I$b`Q&HP>`~0dRv5Nj_Rq;WUx*MvBvsLt;tBTPb7+?#O3N2HQb!95q6-q zm|4^QLv696rhc)uI9ao9Tph8rmcFu%*j&q&R!3Z^^^1m^U+RP%sVC-!+VN6RMyP(d zo{*t+oi~YdBIgvPcjjm6X^cBD5q(f5Xn@0#eD;o?%0u=C;KgQoh`aB-$7 zl^hvvTiZV0;zBEZd26xwHY&66Hrt8TV&?6{cgOAaxCn9Oc71$=m~zLhvm(T=cM$x; zHul{SVqY8mXoNW1rs0_gvAyk|8Zvg?X@C1}arI7p!rkJXb`59WEiSergbyO^U*9eE zM(W?)EzU&V`qSNF$6buD>mEHNN}RftslC1@O6+P+Qk-gU8+EU6-Al;l?zPX1 z7PIfuKZzD8_uaZWTDYSL{$202KZ2Rb#}|DgD|Gr88hfi|nWMbG^mRo<#F%PknVCJj3am z`-snb*}mx`Huq|JqL28!mwus-*!2wC@EO~hzT%g@>&P>oKc~;`Cw4v;wz!}8{W*P2 zKamnkg?7c-e(EQj&lAy<=k?S5#jfX@UFt7Jz0h>ji(>T)`lJ^{&I?p>T7TQuFADdI zRPwz6`i?>3(*e!C9VAWX{PQJ!`A{)+a5L9X zv14%49YaOVVEx;nV(Snpd3=a%+A#6yFe-Usm_B8=_mzyphE>6CzyM~L! zuTaU2uh^~(7gJxQlAB-EPrNR^dsV;iy14Y}ZGXNlK7CD38X{>-L`FnI5~n! zPI*IL{+3w$hVFVxY<%Ok9dC)8H}r4c5?kM7?r++rVIm37dsHE&zOC)lcD#+}r;$j^ z!f!#$(AC?e+EOy+@7JmSAQue_wRHzA0~C^n)^WK#jhBCbXFeSLckzGvWzFZLSHCu(@# z-ou9Wje5E7fT7X2@85T@=+v@TpCK=_>^*RB-)6TPff(Vuc3Xp_z-JBt3=IP6bUki`hiTX~G&qg<2_WGpY&&Yd6bJ-FYXp@JZxB#2O0LqdCn4k6fc zfQ9xR_~M{}17LH}rSFh|!v^>6JEW;WLxeYL-lC?;1`K=gk-mM0#wx%wy?VdUzt<4YUF^XAecSiz^`gof8r!e;3j;ty z-3}f&aOl1L`uFcUv`eo(3e*Q>`wku4tAFQyLwkE@yuk{v{IK`1zC%ofLc>JpP~zQC zL_wy0Lt;e?(EIfkLxv)PdJXO)a><i6V1cbMcsJ~-zJodK$7+9AIi+`2o-HYO-0&-#tiH;tbbpCI}Lj=l(L(VW@0Rj_-Eb^_>=lirpq0sl*&*T3-4`t8PzFp_7Q&ruwLCkdR6ZG!e zU7Y51&BSVV&*cpPjA)8L_ojA68(*Co)2)39!Ndnf}ARMx3yw#A+<9Nup31h}j9@{-+bNeD4 zvR(H96MGI>cVAQO?db|u`Drj=^7!%gYcp@$_~da^IqLO!Nk4w)CC9F(-7>{ zZ7<4$WP#DX?p$Ms2NQb&o2gsF#@Nf(c3J3p30WF9Dd?RzF&IC(XP@qMgJ7%PS((P$ zOVF;&=m|lQL{4|GcX1&GJ)_5tn>?wUyD3-0F44GsCd}%7v|aisayGgr1mh-5nYh26 z2szciL?Z5JbX4r5eufeSj7`;z7FW|mcpTKkSVVHzJ~6ep6%?pu(LN?*%K(2r?HoB@91$8x_i22U9xMhZC2@? zFt+c&T4v1To*sMB?LQaUf3Yz?un+sMHD<7V2(JOQ)%J2|->Pl39}A1@KLJJdz{o8n zTDi59eP6{k?Iv8on8enpePi$pTierPf^BVW|8**~b$W$;pX?~h4;fRpb<@75{TW+_ z^V@&o-nrdW7i=>vTW1T~5$t0BRmO$r+f88qE73GtNA}lw&gz*?O?8!v$=9 zTUTv8LfUOTO4@Bb*4F8QHovXSLN>qf!ZyFH>$bi~j`y?qZ5`SAE@`**6Vh($>2iF4 z%`a^0j?p%L5u4xEk*x>YI<@t1Ti0zp!q(wpHovW_wjOKinyq_n-Lm!3(q6IorQOyS zNxQA5*}A#7&2Q^q37g;6iLIyGI=A&l(r)XHy=?oEHovVCTMxE%ZtLN;ZrXZ;v=6lT zrQOzJrQO!O(r)XcrF|)zU)pVbk+j=-nzY;cE@@xd=9hL`PnULEe8vzpb;i+s#jGU0Ju?Y%A>>wwpa{ZC?^*fH}boZ~* z+SfnEXrY+q`*uTU)KezJ5B|+7kOZsxH&k7A|K8vV2=x zb0z!wS-GvP64>@3ZEcx-ozxGue29JB9n#ho9A=Ln*47rC*=Eu++uG6#Y`cA!3)@U& zAE|xRFSPA%+pq1TZXd?J%_g#s^c{QrU0d5n-9F5F_PBkd_EEPF``?S&T6RIg_wAVM zqh=p1`v^a?8crvVGL-qxEH5Tk|WsCSSLi#6EKSXxc~c zjb;1D?W1WQfw9+yedPAhw2z?8vVG+C(X@}C-Lie;_R+MDV7~S?dF@3DwYLTK8n@SV zTeeKQeLqWkTV;9s{cL&LzN&2>Y-?kMxs+7C-%9Dxx;`0w#K7gSa!N;CL_M zwU_TaH-7Q$_6Yq{meVyu6-f{ypUJx=))=Pd2n9j>e|{*iu%7jFOH9Ogx5=k^>42Ce`EdScNr;M{}1P|{txi__g?pF zfLohuKW4=Ljd^k1Sx?3HwFcI|I`aR;Hpp{rgpI7svN~{rw7jzXIQ{!1pWg{R(`) z0^hH||KC>N{;l=*$#g5NPe6Sd>hn-fMSUIWTTxeE*BRdpZlHb+^>ozlqMnJm9eI~V z9iSe7dM(t$QU46}mZ*0?y$9;OQCCqPiu!2Ozejy0>I+cM>3ltb_Lop!iFyX=8&TI$ ze}MW+)C|L*`Yv|BndySqnZcLYbr=xv$ z-Bx2dceKaG>^r)rtG8$LxZX)yjTt%89@}{I`0*3%n;Iwf$bpd~hK`(K()2^Q+lno1 z8G78f``|I%Re9@U5m6i-wbhQjeaDR++qrXS*wr=W;Dbl+HEzn#VfO1uOG{|-8F8)-V;ZfG;2>P*X7N2KJuH|u0sdk>NI_3)=(17Fm`l2#q^}@`Ai)m2RU}U zJ?&du@DC8cyoJ`dYaigazUPr zIoCIbr&AZac6QF(-ou_w?HjDRJAUhA&F;LW&CfW-*(q~9zdM$CKm4ro``z%_p5NR% zzdM#bznQ&%nJzb`;+&^Bd>-Mu(|4S?o?BkzJG#Q$Pbn|-Z!2>>qc_buqs5f|t?xIc z$1G*PHS9FuAp4!7%f20X@&VoU+eObp#rJic#?bXf+c%Mq>h7`cHMgH^7`c}ORGa|) za7S3YwZFJHhHfyX_z=WqhwNa#%XIaOK4|1vk(QmSv=OBpi=POE7H=~~#Na#PQ0L9= z8}8HHTSQNh*fqWrI}D$=D8{yN@x6YO{Z?;(kl66>yW#H7ug&dGGYQ*h?qMSkw&i!i zHu&XU``P#SZ$8m}O2WRYeBy+mq0X~!#PN5e4U4s$+pu@_onh2s2tN)EIBpXhSj1pDEc-jQ;OWa{_+2m0K6=*S(m*>U|Y z>96r0=udx%H9gOKtFPhq(@tY;BKcMM|I=^JBje)4G{4j9xPPlkE&S$^2NhIvJ;_Kd?@!f)2?0r_|H|<@f(ldF2dAY+Zw!7R^vRXCo_M2=z>NoCy zeTpA<_6{PmK1g?U|EihRf7U18Uh8i^Xr-T<`&WN_Zs`5~vpz!iY5#A3i0-TYeIKJc zYQU@y(j7m*`3TS-2grw^@N>(YGr%k`)Ev{X@wiD{W5?}d|E7~m_uu&AZ={*tF)Xw{ z?cJY@#g9to7q0c<-kz;GcMR=I#0|55OWH&BE|+J0cMyZ9AA{=}TafYzVgpQG#h ze~*rg$C@`gHX3Vx$B_?EeRmvP_#uX$Npl*;*m3rUrTuaFVTaSj&^i8M~bINI+>sU`d-8SBSX1Dn9ZS%j|F`sFzZ9h^{+rU0G zwzp5|j`B1{p7u5!9jyoL=S|vowDbawitxGpYJS6lxZ-B>H|+2vcLUBY?3*)e}~EKp$;>(Xy8XbFX)d?c22bc z^&;Tj;<-_T;lseiXMs(l|Ev#Ho;;w#JabgPHhdWQWh*xeZAS6jDxPN+&*{;U^|<0W zE1u6Rp7Y{)s(m)|;}v6`AK;!1^U8p4ucvuq0G7qPGXP6rKD0xr6@Ar<=SK0|ES_8T z86{mKuqBiyE%kP(^R}!lZ>!>%tr`R3D2bBX-g(kOTV$2IEeZ3sD2{?4sy5~igQPfS zwY;q%Zq{C{J=JENBnYF}#-?rdDGB9&x$QoZE{gwWZN&(}D6~ysn9e70xjh)!PGmII zPyz#c*oKN-wSC!MZA@tU&f8+!Zif~|f&HRpJGX-gL@KnvK1Z4~6wQv<{!fnDp0tu& zwlCxsStelTBwb10X)$S?q)l73IYT=LI}O{39h!Z%OCUqFEwP=Wj3Wr+VrF&)`-*g4 zvC9?)m7o$uVZ|%84Jwsl;IfWI$5Po5r|q#Uco0`)bWv>AB8;>OA^~|+Gs!B036dzX zkv5H8S4nTPR;(9=Ss)qg2pe)5WQ=yq+L4_}B`SiND@%}kEy<#=c4Awl5{jXo)r&Q) z*&ZV4#vZ7*$;A`w>~$E~OEa;r%eG1%*h`!dMOT6JD~3H>bcLR(c0O{rXtf4{HGg0mzcqXXW42zz zn3dYn;xp^UmJ`5%{S3R5`@s=-z@i$TfIBTOYCrOlg3m&G4Q%iGSM=WiuV(*yjO1&9 zCx9#Vv%gaQ0uI4nfn)II74@s&lffC--e4ab@EhPNcx}6t zpUf`opb;CsQDz4fe=w*rk1&nwUjwAWd2KES(z z!#`{Lacl=a0Iq@8vDcmWP4HxJkgI<>xC(w3oP*c5*QNN;`5J!~xDNgt+yY1Tx-7#~?1_)KtmvBtj&u7g*%*J%+C z-WQx+qVa!VJNQ|)U#ji>>~&iB;2pu~RBgWrT)9knF?$_Ld<5PZoPhrTPQlNDb8xVh z`gQQ(;1>8!aCo`qdmo&DN7>ClC4UA!7~BHi4i2tRzr((cBt8bq>rPni!6M}hu(?Y4 z1#k$Ko!cb70p1cEUaj#N+rc-1%{AKo4LAUgu&+DmF99C|PQed?vzq!#4$=4;cqecJ zd?vVht;XL1Zi1JwuUpAixlY@E2CjmSWc&5nehu5f?}Ib&F7|aU{nf!2fRkzJuV7#I z(%u3e0}gJ`_8K?^_g@e51Md!wZ`Ak)!FBL@!!!NJBFUk7)Co8VKy(QVq_vup?Nw2AuJ-?aTgaCp1&^K1wI z^vB2tJ__6f-wQT%^;iE1<^$dtoPqzu_B%BG8*l@>@lWC3sqMc8$KWP71+VrqjnBdR zgQLHz|0lMC?*=!)pECX~jo<6%+FuoX9k}ujZC@qQ_8RyUa1;CmxN^6~Z@MYw1HKHL zfIkE0;E|hYd>womxCwq89NeS*58qtlBk)1s6nrB%2Y(H&gSQ-^esZt&Hw9b=-@^9$ zwEabJ100N0zXcux&hFRv-?ANiKiePB_IJT`@X#%^zb5z~aPXkU-wckx%lty)tKcqh z4!#)N0Dl0Mdvi(IWJ~qahm})s4g7a-{D`){$#(E&TVcH5Ux7_S<8KBB;AOVf_!zuB zxC%ZMoPnPQ=Z|WCt8Sxy9UOy$$F%(ha18zi+yaN&BLCwWe-=0ezX1-O(DvVKr|~)X z4RG+Jwy)Qz?FslWa0-4ITm%2;mm1#yPX@QZSAgTEwEyK|jZeX2z&ZFvaP+jsZ??V0 zH^I}um1nel&<^Mid()NeIA$TS@18=qq#`Chq?+4Do z4}%-vWp>s0YE$D=%kuNI4t^e7c}3ed*iGB3;9pyopNBd4GO&47CQoKK`e+ zXW%OMO>hq0{(m&S1wIoTOjrL&a0Fg)4~a?tj&9g8vLQuW7y+ z-~hb#o*Ey454J4pmw>MYr{ER4G(HFK1FnOw2RFeVgU#!je`un906xgF&D2IhTTrh$3iuXn)aP0jbiZtcGU?g9tkGr=MFQE&wAx3~H+cyn+9 zJ{(*H-vCa*?}0P$n)_&fId}}X2L2Pc4t^Tk0586;`c3c=VBRV z8{oYy%X+rJ*PuO;gSOZ$^osTv{DXgw$IyeOn znWTPYNsXTXj=)!ftKgYnGf?9<=~X`jA7)vWDgnO>Zh%KlM*C9g*T5;b{}gSnfp-GS zJzS-n2hPE-f*as<4pP4bJ{nwEM*T;@_CA+Ie}fN3KJX#n7Wf&1%HP44BUMf<^#S0+yH+A zw)gie^7kID@fGkp-~_zkuQY!ZoPaa%ao`>5t>e5}5ZTT<{3(kM{>W1kC&VT>|F) z{vHQsYwLJd`nCGukCe9qXW*0BzK*tE2R7>}e+JIMgHr9U3Emc58KUvGfD`a)M{0Zq z-Wyy4UjvRq^;h_f#^>PC;3oJ|a5z-s-v`&hLyuCw1+IdFVH*EDI0dhIH1dIW1vkJ) zgXNybQvLxB)>D2L9D!FjM*B;^+kkWMq2MO?axm{dxY}`=jQDELr@F;Kv_ZMt{ zYv6vz!Ut~xu8h?F#(_id>0sUm@b6&Wk8k*K+Fu>`xjuj2ep(He~0w|?+4B@ZT}P7 z!Oyb&58B@UMD-is;o$HTZ9fH^fS&~0{jZDsJDj9`4SX)R1^yZwoTl+>{a)h}@U39; zM{QsDWNnYY6Tnq)4sL*7V*BapZ=R_io}rwAWAK`P(DvX=ZJz{Az)xCU)HY?{A*X13 z9ef42dY1ZMfNS8xPu2MJY;C_6TnGQ?G;MEzM}gyWH2z$075quF>yPTk;8EZj z_&jg}{06vcw~LiB>~!^O;8EbpdD?ykI0QcnZh)6QL;cF1HGU&-6?_Od1K$Czffqbe z{RVg|a0`4i*uL|m7;h6?1rIt){R}(?9GtK5$AM$;?cfyrF}Ma^_H6C14&EJXF3|qY z1;^l5!Aej02p*7%kF zq<#z@2X2Bd2Ujl9__x3jc+2zD&%q~x>)@xscC-0n{Dc0CeBcAYP4JE2%2bX292|l7 z$dM0x5x5Ti0Bkp4Eb>L?BOmw_a1;C-xN^D1uX2ILN8sOrbMT|!I(W$oHQrpI{!ZW+ zd=9t?ei~f4QsbAn2>HOj1gGFXfOGH*;3jzWi`5UW(*CA^>)^kFTi|cN!POc+`V#e1 z@O9uic)m-uy>gAl?+VVr7lIq$cfh8m@taJ={J_V8Gw?Iu;98Ae`7(`^<8 zUh;B{xBIjf=X+0Z1ilQMfoFn)>oxwTS0EqwNN@^%7+eRhaHYmqrl~(3oP)0iH^85P z%?%p=^Q+X4z{h|y@FU>hMvY(WYK#xu36?!0q?`Vwz6R^2S<9}R3f8Z3Hf$swcH*5St*JAwOEx;-GByb)41h{gG`YT_jehyB+ z4R8)Nf7ST6!4Y_)>($S|$AN=eHU4363|?}Y#;4#t!FBLu;L2_4&ji~ow~O`s=?&^P zz(<1Z4!}kG!{7+K!i^Xocsw|`UE{9@$KcPvDflOUQ9lPC4sL>P1&4L*PyV~B{QXx4 zZvt+CCxL@IH2!9A0{#YE18;S+_7~l$@yCO!;CsP2c%fS~z6stE9R6MX6Tx-x-QX7Z z8*p%!#&7*s?JoiU5nKaL2S@+V_%(0U_$v4Sa1Op2+yuV|4)0cf_-*Rf!4ttP@MYlO z9*v&?j=)3yrhW>Z0&als04MjV-+sHsXW-4ib?~WRbDzdf2gl%z>*~uk>{5;fSMFDS z7#x8YzC+^^@b=&od^)%eejZ$TpiR0rgYQ&72af?az~_U_gBt%1I0A3{cgz=jJUDnr z;~xRX;DL8(d!&X47i`|w_@&=aKLU>hXW$#b!3P@uH8=*3oS}XSJ_B3_zX`5< zsQ%C2)c73yJ8%R16j=85lJdj1G(G@N0w>@)xCUPQUzpFw>hB7!g3klz;E%yg@V0NO zAAX|#rQl*eF*}}_;1=4qd8sG6g@`JYlr{Gh-4e*QLRq7XKLI1Mdp1gD(b~Z#4b` za17r36O0dh0=Qz@i~bwn2weFT;{$I4u7i&Pn>O|TVR=!TIs*5bsholj2It_{!Ab~+1+V|Pw%5VEU^AcgcQZHwe*{j!;TQ11`+-e|`d5K7 z@av2Ruk@w*vX`ZlZm{fWDdh^V>}@IKL$K^|DP`lY;De6=%bu4~9tO+amr|DgTH|F8 zOeuSSWiL!AXMw{7m0tnN9+^@Ge}nmg_Xo@VeNwIh+r9h>{uG>nN1C?cd;|+?`|;oy z{2*BN;FPj>o5sstoKkiHn|{h?fFtm;;1s+?B1SI zrhsM7Pbq%^r{FKavKOe7ksa#Go}f~W15vg(5H!98HvlT^wyu2Rmu#o?3F5I*Z}z8!@#n4s+5PovWKdar5Dk7*-KT*Sg`D= zD&(cIRLZb{8gKUyEjYC->zRX}1)CMLec7e7JpdmHPQfpM zo8UE;)_B?TR?5EM2z)KL0hagWNPe@T#;?1KatNMeS>~I9pJ)3@8sD+3#%JJl!8!OW zuvuB-9|wovj^)&kz#T_WS5^OLa2k9);B^OUe7KhS6Tva~8gL6da5eP5w#IjXtKhRO%k?gM zL`zxnhsq7`sbKRXw6Cu15%_3u4E_+DfxFhw_!_tYuB@Z|ZMmklhu}NFF?i%!+TH|T z18#xCwY6RLwwBThj={HsQ*gf@X?z{LCAa}T8eAEo{oMu*!C!zg@XyxK{%YXgfE(aP z!Ie<^TWDR455PNHmhVRq_;zp(UUZ1I*TGeAFjV`y2^@jH0XM;WhUkBo#$O0dz;A%f zdfL9_P>oN(CxcV)=inxIn_(JnHxVz^|5k7U{sf$XS6xrzbMT2^v%dNtffMj%!!Zh%+VNaM{W+TH~Yz`p@!;CsOh@M0UQU-_~6JA)JOHQ+kM@!O^Dbzt48?Pa=)4gL81Ona00mS-xLJ;I>VbQ}FWO zI(R*BWpnkn1;^lSa0WgC+yI|Je}wuq`r!NMgI}c&{*wMk^_SjE#~Xt~a0cEQ+yIXS zSGG|92>ReN>4UGM4}OsTFVugXKGre9i{D;gX`eGfu8|C25#<*@q=67&%tIFZC`YRj<*6H1P;I(fJ5-s;0U}Y zI0pBCm)%wS|1Ee8@Y&#vz*m!Z)A&2V7wxJ16nGl=E%067ufb1%ml&z@nGXIT_#^Np z;EpcszY{zVycc*dcnWwp_yq6>@Oj`-;OoF+!FPju!Oww@2EPkF4cxwkj{hR?(%@;} zwZM0Qe+GU6yaRYTcyI7W;6uS3iO&D`;DO)^z=Odzf`^0e2af>11Re$c06Z4Fz%O(@ zz2N1+M}yY|p9bCxd=YqO@HFs#;Jd&_fS&-L0-g@O1pE>B7I4RCo&Uq&f#6rcgTbGG zhlBfVsq+~DUI{!3JPbS*yal)yygT@4@C5K_;NO5R0-p|^2EH787x-`BC%}(^r-NSy ze+2#<+_9I=f6=XUJ_Esnz=OdXfQN&(29E&m2_6OR0gna$7TgOy8+uAX3AkenUjN{M;Jv_u!3TkV0zMJEE%{P1JMB{-V2iN*6Tt+C-(WlS$$l)P3ZGoouPi0AGiLc;>iEfJ{Sf{b_~f#F4F59t zT-I;F9|fOW*5~~pkAzPy>xV1o^>a0RGW~b~Z5Nj7-{s=^Uq#!mho6EaUcP_D z+C1y^>$3O_#6Jn2Oh58`my7FvkOnNbGp>Iy{lxQK7Qc%4U%)5Rk38RH@oVr;f={OJ z=IgWvT`tDIswTLT;|J5vwRzV1xm@H&e7{|E{x#1}J>O;VLpe#d915Sz{6W#$_w&nT z@niURz$cgWtMC`zRmV@J-|+IgEctoA(Uahl=|`ULviRw08t^oHGX22wT^2uwzv6B> zelq>g^IaC7_doqLd@_AEU#C6jviQ7T>R;fK>E~X4m&ND(RlkN$rk{Ae%SHYlYQTEC z>->3tR{HLIW&AFS&-=HY0iR4i_wu_eKJWM1giod)dA`fy^Zu}F|BsHJOh5K~m&ND( zWPb;rOyAAdX%D(AKJP!no%YFP@p(Vq)8UiphhBb{i~K)A|9c`o*&dc}O@TJg z`u^*(_`Kim2>4{?Pdwjc@p*sX9{6PX?sz-xL6^nn{e&NdPo^Ju`CS%2UPl84bm{!b z^mEU5S^O6K?ckH?C!X(ek$+tcn9TfO`nl)3T;xamUzp$XtDf(&_`HAex{1!8TsA*X z$Yl6r`VB9?%aWh>XTAhJnZ7&TPJ7U0@p(Vzl}79M$@Bv+zstq^hiX6RRC({r2*LGp?T^67Bw_bHG zT|YAYMD*`7Rgv|EvLjV16+D#PeM)@+1BZ=J))-^IaC7_vh{y zqw^;-f9Uxxi_iOc?+u?!Kk|H+#Sd}~xEem0e(d=!i(iHR2z)Yqcf6hUpv&Ut@K+zJ z^C#0s^Q`mlviQ;YrYIBOlj*10Jj-`k{5t%{;FIaQUZm~a@X2L;-k<(a_+%c$z}Z%`R<2LF6-y;m)Kv&PcG}%;qL~YOn+YM$Ndv- zfKR3$dF$u0tY3J!27CdZOn+Yaxj(~N<8}VzvVMmAC&4GvPrUKFEaPv%zZO23{=CM| z{UT<bK8d$VacBh*di?Xxj)7(@X69H`4jt)A}oF)V2iN$+)v|3_+)7pKerDl!s6!w zwg`*gxVk`dAAGX3mzh8J>v$hNnSP+%&&uzzrtki})M*d8EI#)enZK&zC)0QHiSM%b+@EAy_~f#Fqox!5J$y3#T$^XD zzsr)J`=2}tpG?2%`7Vpk{Zc-JPo_Vw*AMqsi4WBEBhyd3{4N*czfJ=Vg3tX~=;xmA zviOzjHQ*NJ2h&eH-{m4d;%6|w=LeqeviRH|X00AvKb}9Y_2Ygr8GJIwpL_XTmi*j* z=6U#J`kCjuEI#+E88u1APo_Vw@pFHhzriQdPrUptOMdQ$^Co;U{dwiD-Jl6Z^y>J@ z^m8x2%aWh_?VJjqOuy>+E{o6odFG$2`N{NC&v#jT?&mWeKAHZ!=Fk0q9)(Y)A9(p) zmi*aYG+@9KT)$xY^U7aG{4wy!^dm37%aWh_5#0r!Oh5O0m&ND)MdlzKKbii##?SqZ zegL0b*60368^I@+^|_zY;qb}yBX9mL%lx_j(q-_;^kdI=S$yu-^f-Jn{oM0i7N7e& zEqAc4KbgLpuhSlMS^U~9nqYtUWcrDh-(~T+f7Au=$@Fv2ce%*_R}FZd`N8y4&v#k; z@Kz1j?GT+mnSS8;E{o6otS*I5rXPB~%i?qYtIDC8pG-gUe3!-Nep$Q0C({o+-(~Te znE!e3$@CM?cUgSy$Mqn5GX321T`uz9rU6SFrt@!t>DN5pW%0S+*YDwz>AU$l?Ln8t z=l)Nfrsn(GcbMkd`o_p#jhiN3VbsCz{~Hl_}s7TR`}$yzNu@1 zwqNP^XR$q8=I@UXegdD&{E2oy>-S%mi}izlGW-loKQ~&0W&KCuXX%n`ffh) zT^2uwzbAY${oH5~7T;y@xgXs{@X7QO)#tc=`QJ6*Ddq>$k38RH$AT~d z-T1k`-vjW;Wqs}kIQ%!7pG-gS=I^r1KfGH54uwyqKdbrXP9vU6%Yg{9#Aw z_{sDG&v#k;I{YKxlgs)|_z%G+(|5-!=g(!yAKaq@T={4nKbgKeUh!QPKZ1V%d@_AE z-|X_I@N4kN^xb^3%b&x44?el9Ux&ZpF*<)T{oH5~mi#Wu{JB5mk?_g%6V(lUm&NCP zlGiZ*y(-YpJ>TUb|9u+pA@hUjS3Tcl@ws2+(!bUDlj#SZ@3Q#Z-*PwjWcs=1yDUEU z!#o#0nSSE=E*JUl*MQrZA51^@e3y&-4`{%A$LjnuF#UOb|KR?dtHUSL54`*?OMdR> zxgUHo{mAoO7N7fn*5H%ryZJgL-sw+#?icz2d@}uc&7b>=#>eUUk<0q|gF2uy;giey z4frp?CztiP-|5=N>-fp^Q~AOcsbu|Jmi6QQsFUE6CBDq>zuZstX82_Kx$Q@au;kAL zY!R0H+<)~;_+)99{E2-?5f(oYutiw>+9L&;K_}?^$|4!#mrtgkd*3V@bKli6S0Y15`pEc|n*zzEJGX08t zVT)9f-(|_q{ci`JsN*L~yqv$lKBNfGZv5OYcMtev`iaQ4&`%2LyMDO8?(y)+^yj($ zk7y#nSSE=E{h*Ot^woVlj+ZE{M;Y-G5BQqxtHH% z$_+AU$l?Ln6%e*^iu;gieyE%;Z%C(}=i7GcTnvgGG}&eP$O z>CbEa-2ZupKj{3)^aD*l>-FohF1vBviRIz`aSsMvOf2tKI{}7Kbii# z=Fk1B-+@o2U-icCvW!2q_Ys%!Kc`~-!1VK?weS0%%i?o??Cao@>BpY$viRIjdzI5P zKbd~$`7Vpk{kMMupG-gXe3y&yKc@ko!RP+n^xb@&_Mpq+bARu>|ES|9)6c#9E{o6o zz^{f+rXP8}%i?qY@R#6|=_j7=viRI@y!~_?Kbd~+`7RgvU(kS&@VQ?({lxQKF7m_g zVSX_E!1G-epZlLrgHNXKp07@O&}H$tU;1)q=={m_-SLX=viRIzeJl86`nk~}EWXP{ z{uj0VROScMcgHKf%i?qY_S@i-=?B{V9KZi@zxM^s)cKR?C!X)JO={eoxd{K@p)@rv)V_|>L%7{e#i zkF|N$`nxQC9sbSm$z}b@E1F>7**bnQ{lv@faxs4R6X93E^xgH6`MWHBj`*A4lj*zp z#CKVI^QwJF1)oemFIwmP^CyQt=p3CtnSRalU6%auKQ-V4_+kpt`7Vo}!+!!knSSW`E{orQzs^NEelmSGU#C6jviL3dXTc}auXy=g7T?U!fW z{ABuWzS-pu;79Pu^xb^oyDa%b_3`)=%JH1fN{iufl&3KDn%)!e4r-&YxV?&)~=K$z}Z<{t58O zW&IlbyWo?{`gQnU!zY*Z8}K)}OxKTG)^Eb^flsFI-VaJ%|1Qh-kIMWKY0S&;$@J&- z{Ud#jh?Xk;ZHRpG?0|wD#q9S$x?iNXp*u$@GJwwa<51`~?05@X7Q;&v#k; z4E{s#$@CM?cUk-v{14%i>F1vBa*=;wiL~o*rLKPlrthv-r#?=|^6Em&I?v|M^uqe=_~R^IaCd(qAI&{?PEr^rND+ zZ~iWeAH#nTKAC>;i<9j`xKp0wfvWHa=z$Se>-b}^935;Qu>{*9EWXR)=ZL=sKACd~#VoSVAK0 zIN+1%2Ssb&`nxRoBlz=8!}kv`{mAoO7C%M&FW{5uyX)0y54tRVWl4#&$KjLdyXz&s z%i>4yAL01HW&JAR7r8;_Pp0pVcXs1910~X!-QbhyyW^eR_(S;Tz$cgW6ZkK{C)2MM zqw72WF3b8g;Q#VQoj;lWyyl-QC6UHl0-sDjC|djSyDa%r_>2EV^ONb%YyE2Q$HOPn zkG=dZOMbJoJQ;H%d@}vKXzd%n%i`zozkyGtKdNK+bQF9<|E_J z5&vWOWcu!UiSM%bHTZkLC)1CdeB!$-ehdE5@X7S&wSK{J5^2ok@X2NU7=8;rnSN08 zKIijag+Jt0T>s#*euntn;gieyHTZYKCztgb@CV$c<0sRf*ZP~~CDQ&K4xdclyRQ~;7Ugs}`zhGVGPcG|c@Q1@E)6eY~qzKFSa{*g~W&Gif$C@57C%G$Z{d^a2VQ=c#jnA?2R@m8?)ff@ABPfY*WvFvelmS`zA}E7#n0g%4xdav zDthm`eq0v63I9&`WcqHt+2s$1N~AFh-KFCv)6a_5zWgpr{yO{};FIZxp6{~wE%>Lv zCzthuVG?P~qwvY}lcKe6{4PuW6#h^Cq4Oux4?N#x@pJe`!za^s=i6xyx-5PJ{>|{o z^ebL|m&I?we+@pFe&qQsiyy2fk;eS+Zk<1weo(abt)I){NAQ0MpIp{Y;2#d3Oh5AS zyDa&0_*cRwm-U*t5d;<{bEB=6B;e?Ln8t58>YrpG-fpeM=D*KN7G-So|vdPvMiLU4DOXuNU!M z7C(nS_&!}fGX22zAw^jHK)@DZ@$2ya2%jwNl0UEyDZ;b!oAB?1Po^J_v`%0^xgH6@w+VZ&){zZpFGRoLI*5d_zsI-KT%qY`8#|v{Yuf= zH-DGKZ@~WmKDn&lguluII)5^KcfQ5=o$*Ni%1IJw%&*{+={KBs@m&_b3IAH=2h-0z z-(~UB-%F%1D?O;=Czti*bBj{;fKR6Hj(2wBZ^1tTKAC=A^xk*=T$b@?ndW~0KAC>v z`7Vp!g8w!1gXz2ZWc)4{`Tro1#%%JCu3rYG9~G^A<9Av72I9xVC(}j##j z^8G)u4=KX4%O4?rKlo(&^O}DZ{v+_o^b<*L3-c!h^^L#5@jj~KpT#z=%-`SD)1_zo z?ldD({zdS~^aIa#S^OCOEAYwm8=mj7_`#VHY0L?a;rap7kBZj5 z@w+U3g7_!klj+av{AKVrcwF<7%ldWr8GJJRnm2xzW&G8%B+{4xPiTHJ{itZ2^ZaY@ z_kd5P@2+>JJ?OIJPtTS}V_t+$rXLlpbIxCfzvh!Velq>g^IewwE%+zFC(}qn*^dcMozS1y!D``>@ylgs)M{9E9Y z=|@HHee-u&@~7}Whfk&-d%nx!H{fsbqRyX8Kl6N-#ZNAhNMnwGPo^JwzRTig@Na@o zF6-CfzYm{GKl1XsEcwmF@?^|LFX{Zr^y8wnZ~a{sKZgHn_+{r6=ZKe?O;VD^n%Xm}OqU`2&~r zBgFp?d@}u{=)G_LE=&F#{%!Ed^aIa#S^PTu`CrxXlj%pE@3Q#jGI=s)NBCs=anag0 zewW3M;hztmOh5B{m&I?w{}4Wze(3owi(k21B8~a+KXLxRW&H^8zkyGtpA^0K&EI9o zpTmCxKAC>t`7VoJhd*pO&Yw5_$n#wm-&`S2#`MA`Gk;vP_Kn|V@niTm!Y9+uJl|#U zoAAGcPo^JwzRTiQu9Qgo{o^&9KX6%JKDQ)g5_~fKsA%n*zsr(8g-@>|V=uqU;)hpBq%p_AC)3Y7-(~UZ@SlcHrXPB~%i_1- z|KJTBKe?a#=rx|0;Yk{m9GjvgEJBAM%dQpG-gYe3!+qOp{1s z4u?;spLxE^;^*)mf={L&dcMozH{cI^SI18->zf-S(!T!?KAC=0w9e)FgP+5X!1QC! zcUi`tA^vsvWcr!syDWZiqeR-Dqwneb$@D|dcUk-xeic5ste?Wa20od7uc9$z}Z%ejPr!tY3%!1$;97pqO3X_2;szUlaZs@9X@@ zWqos#L>jXTd@}v0Xzk1IvgD88p9`N%KlXf=#n0fs0-sDj^L&@Z4{nx7W7hfr*FTtk z==m;-A0vJod~#Vog?}l0GX2QQ@3Q2t!+#e(nSSi~E{k8eMIwz^|3jTWnSSQ^E{mVT zPvMj4ho0}U_zn1Xz$cgW&0i(bUSA*K^-H$LO8xhL#BT>b^8C2yz3=*US;n6s{w(-p zjz9B!m&Ffm)$zXxpG-gWe3!+K;Sc#(=T9!{r|^5>lj%oZewQVG9scd`$@F8-cUk<( zZ4zlrzfW-ef$3+S@3Qzg;&+2jrXPB~%i=fSp9h~@);E8XNPGWN_+O;V!@5M;_aA+x^C#2KJl|#U>+nazC({o- z-(~UTb2n1Xfln^$2Y0Cd1bj06sOWvp*KY!U`OkI!Wcsn^yDa0c!B60m>1UqrviQ-R z5@|nw374%>0viL3dtADBUCzthuyCl;7`xksN{itZ2%k>BU3it__e(d=! z%lK=E{{%jne&+cuiy!?%B8?gOmCm0`KlFT;#jnCY0Y15`pTmC`KAC>x<#$=~H{mb# zwT_=mKlXf=#Sib6Nc(dDKAC>z`7VoJhyO?TWcs1!yDWYSegi(atRLJXk@okGZ*=}- z`a#j!cm266`6KvS!6(y?Jl|#UQ}`KtGX2=|T^7Fq|7rMS`kCjuEPisYL>e>5v={fk zB-0N)-(~SL_+#Lc%ldWr7s4mgkG%XYOMY{oJQ?#5d@}vGXze?HE{h+-AK9k!C)3Y7 z-(~Te@Xv-%rXPB~%i>q=mq`2mBlzU9eguC=yN;hsKPYO;VWBB3xc>RIP`YGZk!za^^y!lj(<^@3Qy}_?N;bm-Wpf5^2mk@X7R}qIE9UAN-9M)cHqX`myJ`EaT4*e++yw z{mk=S7C&f6q%lvzC({o--(~S*_$w@g>knMkPZ6KMC)1C-{4PuWI{ZuFlj+Bv@3Q!n zM4%>0viJ@7hr%b9_03}vY0NF~$@HV5buQN*`~~{q z`UBICJ>O*+e}?!S;FIZRp6{~w!Q&EX-$n|bOh5E|m&K3a&wx)Z>!96xA(~rFT zE=&G8{9gFvvc7pjBJKNU;gjjdMQh*rbGev5{PqEO{ekIcp6{~wO~h{ppG-gWe3!+q zJSma({$=pVW&H^L!|=)UqoVh|`MWInQ}`<`g7XKaAA7#b;x`aK9zL0V=J_s*pFAaz z#@r5{Oh5E|m&MQEFSMwRpIp|j!;j&U=|^6EmnFY>TAqx#5I&iHT(tJBzsuss@IQf1 zrk{Df%i=fTZ?~AvpG-gWe3!+qJR_0DoDH8`){o%74xdavDthmmzsr(8g}+t>*B_XE z?D;N>-$48X_+c^IaC-JTFhSANXYYVbR)` z-(~Sb_&32Pm-Q3)-@qr+kG%XYOa2`GR!i#q$@F8-cUk-v{8QnR>1UqrviRu>5^2mU z@X7Q;&v#k;8vNA;>iEfJ{U-c<;gjh{UVfJ)fAFG2+MnO>$@Jr*weS49EPfUKqD$fW z1Jlnu-(~U5OY&q)H+(YvuxRbe@3QzI{OjP8%lZlYui=yF2VQ=cC4UNki=}n`Wcrck zyDWYk{+aN}^kdI=S^Ub&5^4YbhEJxSdA`fy=kTLt@cIGM4?W*y@f(Og5k9%BZ<-Qm ze~iN?(~pYQzVq+03$Kl6N-#SiS~7Npz^pG-gWe3!+K z;eQ36T-HzFN6X>*1Je(@{4PuW9PvlMC)1BS-(~Te@b89CrXPF0%i@QxN~AH1F0bP! z)6YELW%29qcZW}=A9}va;T<{m}DW7QYIA!5`@O$z}Z<{x7$DZ%9_@VvWgOvN>lj&!k@3Q!H_=5sme_;Bd=esO^3-ML> zJ>O;V8}O&XC)3Y7 z-(~TWw$4{o8dA`fyH{nl!Po^JwzRTiQ?B^Dw)ZmlL`Vsv1;gjh{Melv{cUkhM z@HZN)^C#1fJ>O;V8}NS(pG-gVe3!*f-jPWA{R2Lke(3owi=V;ozZ$MTa9O{O_-){m z=|^6EmnFY>SDx%`(BPBl$3<)3`nxQC4F7rfWcr!syDWYa{^~!}`IG5~p6{~wmG>ml zm~rsQW&H^Lz`7VoJhriIe znx9NR^n91aZ^7RUKDn$P*v}0}xePv;epIyfUB50%{sex<5FJ06e(d=!i(iA^1)oem z^L&@Zk7i1wF@J+krvLwN_bzafT~)ns10jM&oJe?zmo^{|g``eZb$1ov(etQ;W;!$N zbSJ!o>YA!EJ!QJ9D%I7K89*5gh=Lb}4-l^S$w(l8AV%eRQ5Y2z1#x&N81ynocqkwd zgCYU^);@c!efHUB?X&kerzZFJ`|3x9SzY_T_S$Q${aX7~G4MJq@FT?Ew<6^y+82Ks z@f(OIn((tm{yHu4KZE!)h$ouxiw0h&1%Bqg#DCx!vOvmDG~rjGUt{~}w7{<*eiQLT z6aJKe*J*)2hxk87Jkf-&71h{qqq|v@iY) z;y-|Rq6xofh;8!sHGZ9ZT;ZGTOofi0Wi2q&0 z6HWMvf!Aq)-v#^b#phdyC)yXki1^3P$?_9T_{E5OTz;Jv`JY7mixE#W;a3d2P7C~5 z#D50yL=*m$f!Aq)U;n;H3Fl|$(f^Ppe8s@)w7{Rj^kc*m?TbHy`1c~7Xu>ZV`RlaE zf9Ai%e`aPbTtNRrn(!;pud)7hTHseO{VL*#Cj2P_uhRm54)Je5Jkf-&7-y)u9U;HBCAN+VMKhnPVlbHS*#1rj{KZE#}Bc5nq z{0!{-7oU$Ho@m0Kihhm#N2i7TP9gq2Pmtv&n(!3^uhRm52Ju%Ro@ihE?TCLq;)y2w zqLIH&i~Pm81@ZZF#1rj{A0hstC(7~@?Tfz!@oR`D+82L2;(r72MEl|^7s~Q~3Gqbx z;zx+T{7G1TqB#>v{RyGjv-g(r-;8*o312brIxX-ki2oPF6YYyXiTKCvLHi+1_(dasofi3@ z!SrLq6YYzifpY`m^B%+#?TcST{I?NLv@iZ7;vcsc%a61#{tTvn9^#4i#m~UG1M&GV z;)y2wO7v^&KRO-RAMy9uC*@y3n((I#yiN=JIZXdF#1l>Uihaq|C)yXk zi1<$J^_*)SFOvDrIi@zQ5zm0gJ39tLB z@IRdv_CE>d9>nK%#1l<;-CqS>rv?5N#Lqni?T554{v4)1fq0?`zZgkp_uttcmGZwI z@kIOL*Aai=ekniEzWCFKUq(F9zW8&9{|&?w?TepA3iAMC)yW33+FDx=NX76+84i$ z__rdSXkYwk#NTa2%CBgU$>;vVbBKQm;)(XnfA#^g{QnQ)i6;E4P!4REh$mY7F65tuulNX>!>=R$lAn>~Cz|jp5jw`}bku(!zK!@>kS6@Bf!Aq) zKa1(#hlnR9r5o%Jkf+-G33{2A^#$rdl8@S zBc5o&>*W>s>$JeHApRBCNco8-yq=%H>$Je1M*QayPc-4zBk5xO>$Jen{Fs#gao5WH zi6;E4f!Aq)pGEu$#1l>Ubpx-{0)G;zW8&9f6`N>{6rI8m-hhtQKzHwKSY-Q zR}nvhG~pL#8Y47^T9^8dJ$|7Q?C zgS0PRoZAtfmm!{L!mk+l>$J%KB;r4Xc%lh^i-Ff^fv@}zng8RTF3V3e;nxkkP7C}g z#D|C{n((^}yiN=JX~e$_@kA3|&+h>IQKtod=Alyl?;xIN!dHy^bz0ynh_62b%a1hS zb$LbpIxX;vm_9^2(S+CK6?mN%_|u603&aym_*p}Kofh~ri2spiO8JQK!t3&K@}EZhzayS#!t42Q`JX}j?q{R_Ax-$xGx8&7f!Apv|N6sZ`Cp27 zq6xn);a2;fLHrjff20XNYv6TSgxB*Ec%2sbGnoEi>!^PNujj|*e-6`cBA#f3s zM?BFAFa7}^@qZCsqXmBb5fVS!k@6EQl8O13-d+p5P7C}g#2-OC(S)A`9^xZtfu9uw zd;~4kv;g;nxkkP7C~5#D5s^MEl|^kCx@XtS99sn((^3qWn4?l^^lXLHr8R zgxBR2c%2sbTQL1?h$ouxdVXB~XAxfyrTjz_UeAxqzw%SE{4Ya1(S zk>L)h$oux zr)T6x&?0}G7UjPk@w<*l`H3d{x`eCxqtgPv^3ziO9mEq&_*nz5(*i$2{29a(?TbH! z_&X6#G~pMG{B>I7e-`nR4YVK9gxBla0r;a%3;fJuWclwvJkf;L^AmWT7WhTPPmap` zi6;Cm$U=MsE$})m@GFS_BI1cA{GtHEhwzIL6}Nw<5Wm)!`4dg}SuMTDU#CU>w;=uu z;)y2wx`Eeef#3C5slVXoWd1}GUeAxqzk>L;Af9Mn{0ibPy-wy&G~rJf^6Rva{~Y3P zMm*7k*XgcL=#@mkIR48({9ZC6#Cj2b$5g$Qw`JX}j5b;D4eqDg! zL-_TGishdTr2amRc%lhEtEK1iUqt+au9xx?P59FWUZ;ir&LMss@kA4T-N5T~r2ndv z{{xgi(uAKi@H#E<>zMw6v6P=^!k;$qIxX-sHJSgD5l=MX*A2W*NBJZEEtEgfgr7C= zIxX-gG5zg`Cz|kjeh1)>IxX<$5dX|=S$?7kujeQ5IxX-sby@zmA)aW$>-ll{uOt4) zC#Zj<315LM#7EEquhSy`Q<(m#h$ouxdVLpoofi1hh<^d%i6;EI$Q(X`7Wj2Rz(>#m zKQkxG|8>L@Eq?N;|LcgqW(UiUG~s7~kN5~$#mKRYkwza8;Ji{Ax)7QW&mXfFRn#5ayf`H3d{x&Xt6@aqv3=YJaUzm9mK z2|uf)=kh;;_*)TAG~pKwyiSYq&n(FD&)p#9CtBgfKj0(&PvpO-(E`8NkoZ%GCt4&E z`qTYY;B{KyM~MG4;)y2wEbtH?K@0q>AmAftfj@=#2OXF46D@xCvEMC-e>UQYCj27s z5g$Q|{1*iQA3=-!Z%6za5l^)E-6#KDO{u>xBc5o&p8-DNBWRKT89~5D&?5h{h_9cJ zZFFnkEV7*TQlXA%GC=V1Af_QmhILY9Aoc%livqU9&#*J&aDI^y4rc%liv zZs2uV;Ljj_*K?)(L=%42!0WWYpF{lBh$ouxrwzPL3;fB)%kuv!;)y1F#lY*dz~6%S zcO#x?!tXNhIvtfC@&ADMGe{GD-N5U#z|THG%Ky0MN&OM+i$96@*CC#0!p|D{>$J%K zG~)jS@kA3|m-hhtQKtod=801N)t{I06HRzMKY`b2fuBYE>k&^h;r0Bu{7)kO!e5a2 z6HWNjGx8&7f!FCM|0hZL4$Je1#`G6IU&>Fk zZ~kzAGRomb#1l<;JwH)?osP6m({fH-8q!;)__=*qV7b7a}e@-I) zFye{!#h*d^a}iH8;a9Z$g#0=!6Uz-$gvpzW7s!|8v9> z?TbH)_|GApXkYxUeX{)Drt%~0i(kR?7vCuThiG5?Da8L2;)(XfpGEv$#1rj{-_?@k ze-`42_QkIt{st;P(!TgpnEvHd{+#%;nEtI){+#$-SIY8#h{}(&uly^R{&Q6RocL3i z{=caFIq_#P{e52`{f}s0`FC9<%l}x!6YYy%LHt#SC)yW(3h^Dp6YYyXi}>eK`H?34 z#AyGBehs95#04`m;@pP#ycOwnq~DM9SCIZV(zDAl{cT8Bkp54k-@GP&|DhL3{%4SW zDAJ!nx`y<*Yi0VYkiH%1XCgiGRQdZ5>0L2BdF5`W;BW1nCbV{W_#Sh4ddHeH+q$f%F|ne-`Nr)@Av>f%GLv-{V)L{0~R^ z0Z7-8{%NH5A^jwz*N|RCx`*@z(i5bgi}VYSei_oQMEWMA-+=VHk$wl#A3^$qNPiCL zPa*y9NZ*F^5B#bu&mBnr7}6JXWce>g`Vyq~BK>frpNe!H>Fbc*hxGH2UPJm7NcWI_ z6Vel;--q-Ikp3H_Uy1Y=kbVQw|B3WFkp7_;%kq2>>4zfyDWq#i--h&6NZ*0Jwf_Tq+fvakGw>d=aoo5 z4Cyx@y@2#Pklv5<2a#?g{VAlkk-iP-7a@HI(yvAOg07VJ_mI8>=|4mI;Yfc5>Bl4e zb)=V(zWc99`F|Ga2LL@AX+r+z2?pIW=ocIGyA1jZ27U4WO!B|NphJUxg+ag9pwAif zg)dF=f2={T8uarG`i%ztafAN8K|khY$^4#f&@VFR-#6&b8uUF+CHd71`dJ435`%uZ zLI1iz|CT}DV$gqL&>uDEe=z888ua%J`d%+jmgi!FeuzOo#-JMpz1N@*8uZT^^z{b) z5`%t|LI06Ki}6xV{0Bdx*8K?3x8G0xVIR^b14%!f=toQX8%WR8B>i~63jEneN&3YR zeR5{>B}xB*pnve>%;NR3et!n(Gq4UPKH^$A@%u?wmk^&v!T$;R&9KfQK8KKAgmokF zc|OvQLVhE|H5JCwh_0qKVz{V}9J zg6Z!>x`XtkFxC|O-+=T1q>mu}c}V{|{{B0H{^6OK*ZiW)?-r!Lg7o{4z8&d5NBU8} zB-4Kq=@HUjL3$nO?;%}5`bY06^IJsvF-Wf<{bZyci1aGbXE6T|=?^1)4C!wp{d}Zn z5dUJNXOaGOq(6h{Z$|nY(tm{Xy)gYpkv@yRe;Vms`1==-K8?SB1?e{E+$0|P- zxzEhEfCdu&D?j(VFrwj4@-u7D2Mzj{4EoIm{c(f-ra|BL2a@^iG3b#&zt*7NXVCv> z&==e*$^WM$Eu965xMtADjr1>-GzY@h>sx*BkVE4fJua4-Gs{Gd&^s@}QC-KVPjv4d| zB(3=Umht=BjNdl-`$hPE3BK=y@0a2G75M%$eE$W$Uxn}2;QMv>{wsXH0pHu< z`)~05CVc-LzIVX)Tk!o4`2Ht+zYX92g70_WdnbIq3*Ya<_Z|hVKu;_agY-2fjZ7-(B#%7`{IW-}}P%68PQ^zW0Z(;Qu}N&cMInbJF#_JEZ$z z_&xx>|9{cJ>`c4;j3DS94ZGJJ3MV_`!GU_Gw|!l`I~<3#mC1PNz-pyk-_zL+TjF0q zeQD4gZjCm>Nw{`m6t-Heh(oPEI5ynenS?9D{$SGUi9c2=8{uT{aBHhG=q(LKJCkcW zn>!)LKd9=-Y#AL`oz&XxAgCVhZ1=nE?a8=5*jVZwSe=7Ec8_+(?a8>)pKLF6Tfkzj z-Rx{`4!fPna4i1PYOO?4HG1RD4OfMoaaxe}{E?mQ{%|nAFWl~L3~X}r`aSUxMQrxB z+r9nFC*>@obzl%S`{czA+IxuEd_v-f+z zF_K_Aomek+lggwOCi1YgB`sMMyb$~eOQUmS(#|7GrdV8RyR3+4AL-(tiQUkm0^<*yHC(=4~pG=*t`_5!^L zhr;chEx{g}o}kv*nGDy$@m7BT6}ELa{weAZf(jISM^@xuz8kd@drlmJmZ}YnYAb3I zb&t}MHz@gP)NV(BmHk2&iFPm8JsNHHq1A?Vcmev4DBUqLRieLWcEKOEquwZ;P;VUe zR$JK#_Av?O4<7!xunYYdsJSbo3M#TBykrZJhVrAgt}nNU;!g&9!|A`LQ3j7_3}R5=t399CY^EE+S&r&5>@0GrMl&LsLW7rTGL?$4Olqn31;O5i+N3< zlu&)dcxNht^#|MGc+wL3FI~#LLF>?d7|E4pv@gJ#FP*Cn?Pm{IA6RXtN0UB&)>_fE zF4*-;vJ*`-`D$}A#L+D_sZwg~&y>0u9`A-D(JE01S0{0eiYioM;1oau7mpHKBG0uY zfG9T6U#>k6RNC$C@#CGt{bNBD{=MCAM~!TI0%Lxt5=Vv-d##D>bylKWdzn2x8;-@%AVjZx5ke?N3g$k5$B9xBD=U*%oRJfpZ7` z4gZDibEX~rb1U5H9))2v{QtH{FcQ1~1OJ(fH^ae9@5E*g{=IX!eHeODIpWq@Q8jf6 z^bXB3qX0M8+SlaN%Lh-kXY;RJ1BzY}{mPL}*EWgEl)#IFlA%oVy*F6eH-L#+YFH4f zb75%<26=k_T12VdTvV}`S#h8T$0vJ+$4eS54<9AZe#VWmf-Bu)hp}nkkUnjLgM(Myj(L=;+$D=L znxq*dR1j2Q!m!-gp0vi};kdP89r{(dKEBGwWLU*}sg0F4i3}=Ra@Gp|7!4pS5iU=G zS9iBXkggiwTo}0S*_lj+12H+;mX){}|F+bnU!X^P#sODgL)B1MLgns>g!)_>gCIOd zCSlCcFSrpi_Ddi0Hv=+Em?dWJk=V`|LlgRd%+8rftT@MQN}@K@pfZ#jS9Dgz@VhRD z-&#FLWE0eO5(5nTNG9p}mM+DbXA&JWV5TPm%lpD3Vul7IV2CV6ZmbC!4;vcT+Uv>r zcs5&W8F-^V3Agr~Sd#OIa`iTnJ2qnxv6VNl#a~Dj-=hAwsgK18n9>K$POm51mRP0J zX~Ccoga27o;$4)4C&i_SmFvw(>6YP=)qBHmHu5nhqt#lw6{#y|FRiuLDnQvvoRx!; zten+ZpHE92z|+kU^rx8D*aRCeFDjQ)kN^e?{cWg+{a)*Mw7vp^i0O1;QM0I7I<7k2j>$@&MhBHJ zmOVB8F^by=kHPYdSlEd%8SB>mlMY)qkj&pQ zzihsl5F}3D*p3z|?e)yVvq*}DT=WE9IfV$C$Dh6zCaIG#^zP8ntZa4$uw}>Aa{AjD zMxG|uY|(U2Oc%>xYu)XYE}}tmw3?>#uBvTgtcQ#AwYD66X+G0}s7e?ncNi;CACl0ZhWYl# z-Az?9GBU1V#+crbv+gEA5*jRs$ia!d(AS1z*tXK&+2&eEssOC-m>W&}JG)Ao#s=03 zZ0+Hc1|uCXV5BvT_Lfv9oxoPEMAbtjG)A&W?rPq^!rS5lbI}^O zbExWKQxm&UWEZ4qu(1RcGukx^+as{Ga&dyLEZ(RQ+q4L)p4CbujN3J0S+sH)O}~Q+ z-)a*msG=>Ghr^NEoNmNq`ibeDGK^Ofrj4eL z!0vF^Z{zm*#+8&ZkHafeFbC`O+N=-<%ooX1T`O-M-78Qzu1e`j81=wA-uP^p(!|3GrLf^E7BFIMJXIv19M@GuC?2FRaFhT|(Je4c>XhtMzl-r&57<^7T7mdj#j0U~5E* zVKtr&SV}8)h}L`Ika}v8Scg1(>0>z}Ht+=iAGNVe{UxR!g4DNoV04^(U4o z)Bfkg8{I|J-jJFCIGSU|qSbH5@i$giJ+|Nh6}-n4+nCuxa9zZ};A9f45X1QlI8kIS zNd>9R^~o3@r;aqn(%dV>#AZ)pRh7_I=(4&{*(^%AsG8A?Kx~BH4w`aeePw?FXQ)=; zECU?ENL#@eRs>Bsy-uQdCr_4(gy0yc!Wq%Wv>NhNcGZt@nOdwdoz53SPP&@%G#_li zxsg($QpWzH+97X7s@PdBQ;{ySd))Q#l#29}C~+PK(Qv_h6oOehIu7M|&HND<6}{7% z&?s`Z+DL5|GJTyhqN5~9?J*33I?QFIW};&*sp)_+T~_T*j$iPAi{$4Xx0uCD!1?ki z??}0rs$!bi&S%ZSnhaiLtxriCBpbazdayWyv{=pI6qR>L`+D?;;jP#!9+&(3Ca8F((rnn@qh zfI+5?$vEhAt-%Bia=`fF%KmXRsz|WLh?_WpKHQ4VT*_6F4nzaVK~rkUF$=81`D=!; zt&y-R&%(%|#z=Hj3eO>^K~rXybJjS?Kq)$es&#@$$0_KtL_N@mfAUxjpWvCEO8-HkKJ-)TEF<+(oRPH+e#a+O|Xg??N3>V#y7Qn{v9(! z?FhqHS>?m&#>FL6yqB0MkN500R;|td8SdHIQe{dZ6YWEWTQD5BWjv>YdM*b#`6zj$ zm2kwZ)|rAj>`;J^uxo)TN3#^v6P>qfn;APFGgaP z>jpVez_D?ZGxAEBNiz5@XkQorz18dK_jvXr|41>D45TrLf6oSunQ(ys4Ou= zjKXDFM4Uu3%*O|DVYtZ@!6pK~W}}qpHDL7Xy8|y?s$Qj9iaf4lWaZtCsdDog%s1{= z%nY+xdK6W1zD23ly0EWkXR|Y2>A?EIcreALrCQr-;ce4gM*TB%&sV*;r?PXhOU3i# zn=LDsWcxL(dMta{jGd}E+_<{Hn&Eexc3d=;`J!_1g3iXIzZGtZ z(06K;+gOZgtWipbOD3{WsGv?cT{Rx=s11K{CCr(f>IG69a+oftQ=w3(>}H&X7usI? zxLERzJEt1sED?}LnajPw7of4J>z|ru!1vzix>~X z{uz77R79P3$H{yw8ci8>l+&!9wg#oDK?2h^0u}skz@$GS^*C}MmuLIk(&`65h+@rs%;2Um|@n~uy8T0Qck0FQ)vXS>R3ekk?ju(oIRx0Ca%^; zo3K{^?$n2?b@eO?1JhURdge%F$}MWGXc_B8fpbNH^F@IRMS+c?z@`g0XYriC={i=V z(|4>$r}J2mPVccIo$g~rlK;4>?>t<=)jtviW8+$ZA+P{e#`LCP_jp5$Mc~iQTh7#l zY>Nr2^_}W zLYLQ2sB9RsEyLllC=EZ}Z)|Ek(?$Na|899xO9pM(TW48;;J*xKu6v? zpt+J;c_d^^`7{mreWvdgZ4!&@r=_x||HQ*7Mq;T}Gma6ZcJhhW@5+o*L7IcfSeFbz zC9h&@9vP0eI+N(4dbp@Rx*oCBD<5G@FR;hO4uW2|-5vMk@=p1@v~ZrjF$3mOT$9L6 zv6R!sKA6S^HN0B#$_`wR!JVoz8{jJ35*NJ@CJ}f8^mOC5<`Zo5@JhnQ? zb7T`D-l2f$L>FF*Xv2(3J{>cK$&?&pM{^%|=K(W&#(`3^OECeACn_3O{nZS$5jXM2 z^uWQp$p?neXJy>~>1x+uxL=OJ9LzId*9^xy22OC^{)d@&8Y~>$X;oWhiCffM zJYrSSWkWF|(;+oqroNg4%%@8qv{8zjhe>@DS{|K?bev=~uO4%yS6;!^#tW}OrKcWE zg)&v!D^qv^4lEjFofM}~xz1NWw9)O1I$g0nN_LrLtQgecZ7c|`MnPNPi#H9GVhNrh zSju>9Gz`*TPcvrToz1oTx^LN|dZX%R;iv{^9Ou1b3leg$!FO$F>so zTxiFyTJD8Z;kX7(b#JI)+VBoByi**Fw83`K3LZznBNYe1ELG|q~WsG3KCXmE%yTm{zI>o2>zFwjzHBG(-Bp*buDB`R;-4C;9}V% za}}dlGivR_yu1J9y66O#4yF5$)D=#Fl9q@z_Aj~~Xd3|EwtnM?4I zOPcE?7)INFlh1WC!(sbl%qp>qt6Gb3CCrZcRs&t)D1w_K^lL8%6aURfOhMpu&`Z3E zWs@*75~H!QaDa`BaLW<)y;^b{p#yiHCn8knN8^wLR^g!nS!J~(aVFkx8mgSMnM^`L zc-8*e{&xQ`+`g)X&t%jt{R9EVPR%=cnMiO$Jns;_(>$eETU>xx4T+Li=0ee(1YnnR zVY2s*8Bsl-td#$6lo? z3_ewD^G$ob;Ca;%g}U;1E$eiQ*Yk@n|7)zDWkEkx$@A*L0*=o$^VF{xTn}Wiq*MT_++{8l9 z9_C~pchP?0IC|^=Sx{iQRen|FH*Tu%_FhWpHJd!uShR5LEmX#wfD(TsVS9sZ*)qH-#esx4z6Qm zCHLWNR};fITTQTw*LVUCs&%f)!{D)5U@K2XavJQ$8dG)0`x*d>PiLPU;udThcq{61 zw9FU1$CYZ!^%a4jA}+4pb3(j+H-(i)dLoi*Ikckye8;Am3Jo2D5}N_E6iT~UPLSC$ zY0RuV7P_>tE*gPp5S2eYHfR~$s?x=dL5OOtzl|IGdQUwX4pzotYik7COcJN;B6AZY zsG&gAkJ$!>PM-tSQ0+lp9$u#kZDJjkjmvHTtKw#~^ds`+XC#gTFy7NMxqAa&-HnT( z6yc+1CNrC^;~Y|>wCyW*HaDNz@4+g5Y95%hWK|p@+BY7K_6=_sV3QTucsey*+M4*U zPELp?YixeV@2IlWl_@COlAlfAT7~A3%}w0WMR9Bmp`4&e`@U=&{h3A}#!TtR*I{sZ z>%qo2H;d|-?#`&H@Fr$YK9o8|Ujms$UDxh=)=$t|WVJdQHyPtwrYU$DmzmAYWW0G0 zPJbJu)?g$Xf#^+WdGP=Ys(0l0dO8gN_4aYzswPdsnCE36ikb@eD0?^F1s|vA4bC;Ayn}vEdk*-#Vv2>Pn>4>w|Y(_wgpF)6z zkCz(3Ep1~N-58NK8ZG7JP|+`*G1+*MY%!>F2c(;WE9md!kXC(XSOSEW99rP-`@ zY_Di#?~15RJl>0Is*(^!Y+IcT@pQU4Zz^Yke1q+*Jvmr8eZX6);(ownk=qwMc_?lB z_yfb!zwZTqV(`2{GyQ^(o)m2w@^N!{M=oxK9mJALULVQ9CXbs~*yiyR3yT8I;*3T) z+YUDems2=76m|rSb6(>+pvvG{I$r&1wND%CDzrz4trlN#z;*&rNNGBqfHy0bMY(_+ zubslC<+8|YV_zQ1Twa|(T8p--&Db+<)XrHwb2D_=HZQ}%7Pe=U*UtGkDQo8mI6Cc+ ziU%&GAl5z68^XEVvIb#E@Q-V=f1!Vd1m#i?l@F2z-xuwc6=u~_WRm3+i>ZhxcN_Pb}p<@KQ>OCda)_4RfBzQy?Wqd z%{Fi*2v3Xm;ZR8*PI?zsZw_8g9sBbtu4pcg+}ieK604jVtytxSHSW*Ksc>&r#r4f( zkz3uKJYsE&>k>q~TW`V(>pKrKr^a(IE3R`kliXT&aA6}=f!Lrdcb(aqlhypsr7o<9i-+OmLVlp> zoH@GiE=4-U*_pc-v>gz9!Skuu zpNDeN#?>8o=;C;BFLg3-xv7gmtk0ZBNMpwNw5VUk9wWK_D$aqg;#qwa*~)ckyr+{p z+4woQi%o2dLe3qtj};qF(aqWs@9{}1i^H4s9>#s~Q&uZ*bz$}_FkPbJ4E?kncuQDP z?_5Tl2Hh6O=EPN!tVp|7LDEn%dZ4|UW$8;bKCwF)*2{kC#Iu??nE07Jn@LGi6Z2x` z%|aXcR8P+BjE`BLyzo@3A1^=cdhsf$WFwDay7pjVs=T&(T{!6;70(8WQ&@bj>dsWwaNws_N^3=Kyud+%{=21}RZYGAx8*o86Jn&uC$(?Nc z6zyVDQpYj-V(QJt8=4KOsM_V>5MI+P*M@lU^3$=GTqPB4S8IPhiXr)ghyB{iPT zrkLja_?Q-GwvJE6JG~Hn+`ZM@JzdMg($f+-SeCU0n^i%Jc=JN5z&`Qh!`|=*<5*Oy zB`ZTZD3gmvr1x?>VnwI?O5Y}{o~(biae-$& z@#7X-E?t>3EJyueN(1?9n2Sy9)bsKc=DkC>T(>J0zip~=Jp~bXb8=P^Urw>Y^H!B~ z4*8S~6~>Q6s$Y;(uPgf#xG859cE}9M&Itm1a@C8ar@!Z58QY+k)3aISGluef2d{Kv z#+tE28-@X4-4vPCDXlWoUvhBtw5>nKvZm#7Dri|>R;KzYvbyaacgs!HTH4(?>*r(74ClDduA7gKFE-q37hhgNT6Dvq1U z$4|FTc}gl*<6lg>4hE>+N_!z{-ivQ-bm1d)rUPld`NwKZ^T>#PYURqOJ_nFnv(z-r zPgdQFmO=f>K150<(^u$WW@~5$=mV=|G z5&SupH3XMaL1SdI${2ZaK)!By4M1xN1DETY13zY-X7yrL)}lrx1&!&!#i&^Df&lEn z+u7`lS30mTF&<2(dCSe#&lY*vmb8jJyJGgq$IrCX0&l4)w1w3otUWDOfOT1`WoB8> za-KZx?PU=i`!t-@D(@EMTF|^)J)I$+tY!VcmRms=$ivR4yN$K}R=8O@Q0ZjjX9gFW zl6sHX7gKaL-q37NC)Hjx9`2Oh2I|SpPtTsRl~i{smttD?Vq;al+)7fe&50$*=9X9a zncSwPe9Wb+@-x_&%C99nzohQ{n0cz+i&5s)8@=~vW zugcUMyu>qrAnDaZ8&sK1%}S zYg;SrEL_~0a+e3?x0N`@8{Ki^yiq7if$9ktkDGEb`FKBzoW;d{1#5o&9aKS49OvLCJ^wmh=s&BtC2Zx$fRq5aVP@y`_! zn|S6_R3{!s)IGK0!6|N+(mM88j?j&(3M;@7i>!?~p5+i*8!T>Go}q@gScdEPITMIhf7JPPi9ff@!dQO=MQij zZpH}}59JtlfRr_r+F?y6u-=|zuB<;LJQ5FGr1gS8ydV5ihsgt^e8Ra-c?V&Ma<40ks{5SQuh03{x?7=W| z5x#Jl{nq^4;swT9LSBLV78qbmBm>_}+|n=FuQ-&8_Al)lz_YXayL?Cj3gaE;Q35eV z$`!uKV#GaP#ak$gOWw#_7Oy-3H9H@gjc3OL@DWZiD~wj4R_pL)@S*(&;O*e0wf0&C zDC>*k3dE}`e(xu}`Ng^BrC!c)FHr!o+#phlimTtaW-x?kZ zmkt$PgKD)}2L*V3912eDad;#ghl6ei3T)LUCq`lG;A&Gw=t|YB0Qg{}uN0rE$wybg z`Bil6s0$=d9TF^p@orc@6KtSi6i(*TZ8fJ<4VD_X<3W8 z^ja>ns$mnbU=HlH_O?7YCFEH%$<#;Saa+E<`xV`$`?mdfhM02=EXh3I+|U$_Lo1(3 zX2iP{bOW#=K_$S3ty*ihwCF{+Ys`6N~faq(QVVM{6ZQG{AJ~iBD$jUaKK(n%qs1ufd^ruxth5L zp%7=WiNML(=vTbNrTI$Ahsey1uQ8U_Ll2c`A zS)YRen8&iGtF#ot(b|+E_6)Drgwc5AREsAYN1-y5>oF4}{i{rDl{DpHIhd#KbG7AS zS7w@re`|nt$s;ivB`zQ}%jbMZ4ufj_!c~7!4WLW5w1vDFl*3u_|PUL8Qvgpnv^N*d9&BOS{_#QVgr{_~HOe=*;aXFh3NN$$Bq5(%IRZw0j|( zg%6ij7evqpq82MKXN)#x!_Mrr#B`7eHLXl5``u!yDg+3Y4uL2_0Ej^SU&y~|&3}2} z$Z&i^XWUylRH)cdd7`joI`RndMhrb_^Ka{B@j}@z_baXC!F{tYb4X?MFvZDru!R%Wph%^uH6Z}uQpXfteW zSS?o@)=M@>fwMtk#g{tGZe22f-c1F|Lz=<2)@QKrt-w7|8^H*oUw7BV#M+a!hOESf zVEoz&;~YHF2VYB4qm(>@XKvq4fuS15h97cGXAVR=$>gQ21qAlEsWp}~J&;yoR1ZE= z8Bc3_wDOl$1G|i3FRGKtRLV&^{-PU8^OrOMca^nF#j$Kh%`dTqQEu5ykIdRo8ZDs0 z^o6Un9=jfrOGJFe<`NNxtEk>a(s?Zp@$7l^P`UI?k+$-bF+O)`Wq!+ZT=;T%wM5># z9qsj0>Dp_noSHnBQDuB+A-@7+tV?aNgj@{KdF-KhxY^CRNW9t2Rm8`g0cYpYf@H** z3nx1ziCs6gff0Lk^6(2NJ4@pkQFe;s84I2kA6L0z4a>e8TiQ7LdVdmbwYH)eyVVG; zTso^$@+hCvqAp>;A+p%ShpYK^0rwB78$bP99_Miy(-?Z4ae`IDtPR4FeQjJavww{; z!ZYPw{c4U$LTnD3rc!Q|gL~>;PFp6LR*V)T#e%ncY@AZ^a{Ipv$jq@huW}omdI6CQ z4!pF=i_0k4ekviq*mhog0jA?7*>~9$C`Eyd{ZlH5?NYY_g|M-5S;AiTbDp4>ig(6G zcJV^B{F+FyaA}}SZ8A??6cE?z+y?nuyL1DAKafW3v54B zZ9mj(Kh$kM%-MdJxBakS`=Md`p=tXes91lomOZc*KCqTPuogeCmOrp6Ah2p6u&N-i z>Y!@XK~?DBs^x=wb}z#Y-JQejrS|G*XM9!I8DG{Njb^UeySE)4?}j7T8Y@;uYSq-A z=H^p>YNS&&YpGPtX6jEtJxKknT1%&^&82gw&CR8-wK)bmUr(o7sHFeaSV;Y?UP%|W z4th7$RIjCFsWWA(GxF8v8SDa+M2&FQ=fV5U zbPYz&4W?|3`LxW9`LymE^Nn;K3rxODc^eB%9t%t!3tS#)-8UL({WThlERD488;p$_ zjIT8sj4TaCmL?-hGi}R8Gi}R8laaZZ)>X5T=GUyG`86wP-)L6Sc{D3&y)>D+)nt6K z32m_HYfZ-gn$Yg1(=la(wlGHq_N#>i4*WMSH& zW{r`h#>i6RWJ&v9v!3?9Cezk6>x@q8OgZXIIqHl~>r6T7OgZXIIqFO~=9qHKF@DeV zJx!*42`ZJeFhQl7mL{k$Dhw*nj&#X)udUrR+T_p4IBvm{s8|^3l!&Q*j&@H1XiDO25~EO;-Z5t*1^& zS)I2hCSmI|7*QAK!6~BQi8SAunNq(b&swy3WXmKL67)`N!mXg={xK-f%;nc?hvV(b zJH4&`;PQRp_H~ot=<>ZQE32KY(Pp@Px%z(`K3zUTvPT1{+;D|Hywl(8L5_!aHZC{* zC~xB3e(Yd4-s)^#e!MZ?p0CG=hC=6>U#QKUKDWfG{m#tH#|OWUqSqYW>&n+m3A{Kc z8F1fFu}fovDIO!wQi}IsbX6=ywfPRCXNZ%FQI^$cer}@MYM&?oc?{84tMDBJ0$h{YZWmiUJkSIFJr3!5(RkJFFcXyjq8t zN4e&KHYYN*(WfXXB&O*ifeWgzCvds5J!y@{!*OfnfK6Q3Qed2GjkZ%I?p21(by2UN zWfpe}UTS0IO(KKJ7F?;_*$DRxkHflES%Ft!ejpu6uSSli^?uZZyElo0{=& zOR!^9{t}hcHGERtj4L5km;;G~`sfG;8aziPVa(BQ3>7o>OCR$$het4gF$YpHbC1M! z&dgZK&Y4LpIgfYb7U#H5C8|W$t22HLh+I&u%RRkXWk_Tb)OKLdw={r9r;fm5r&!Tr znR3<~Yo12!X>`r&qG2R$ueJV{RI^o=fj7jG^_~;3AG3VrwT?lVd@bVwy#mf@1sg~MrS)KLywA2Bt;750~t0u{2B_FNar5Bf|62=Nv5dc*h2p81At;Og8dQ!*4H!&^~ zXUC1(>lZ?dLTG1oBX97y;ZuRBc;YR#H^4b!<_|RBS;98d; z{anf%C+S?Ov@1PZ74x6$Q8Sbj*wzBEElCo}mo=U$Xe^AOLZ>_F9}DUBGTC3JJdCz@ zI<7*KjjK3moOu;mioLi?A^QOznmlUdz#8Z$nrdt`29#$|h4Y(}?W;Qj82XR1hAci0 zxNtcoUw#P|`rA?EtW7$(|=(ztpQMZfCFzn9<@ z;4p5a2ePex^Hneh1F-|)4a(F}qt({;s#e>o%uxu3Iq7ceJDtN*RT%w7r~*4zW~kEQ z`yPC#Bw21`XOpA7q^e)TvSsgIiMv86jafc%flf&`JK|CkyqgJzy+UU5}LS&&RTbpn8K|D z71qMQ@6eiq3Dd|FahlO6Rke$-VWcrE>8c2dgWd65EO=qRYyAGB?u&^CY_Vu?X(dgv(L_7t1n3+i>gtuId z7l#ZeNAo=-ex3$nWlP!Ed0U)~?%H{3P`#C?*H&Z1E`b%@If8~!q3nur?IL-%RXRFW z>c+u2$sra?(qg zr}G%4x`gk+>bUU9iO~Z!v*4H-#sVRj*dgQ z8k0W)qoQ|O6B%ahXCY<<&VPx?9E}ZmKswSLo&BOR?Jn`@@Wi?&U^J%ukjchi8@B6 z7F{%hi?U|YhcsZ2sbew@I$dip=}%6;_~Od`aW$$)u*NZn*b_6{3Mb=!SFVzDAR0&$ z*OXdvR2R#=ayARtm1kkZ8$+ov5*?Moa|kL>JJ!U}FPKrJCKO^5t#oI)$d2v(sfMI9 zrA%*d;kweOnF01p#cFw9A6Fzp&AZM|MpJ2cxqIqtZe+KE_w{ssK|4+;-X-liAd~U_ znY&RWcDA`H=X#!nwak7wj`re0YW>*(UR%y#rJIFa0;M6Zi-gov+1@s#UK!vErCOy# z3v7a$+kJ@S!8Utpe(m{2m#fL7d2)78bl}6lyN)ZTRY= z6(!BBj|k?sY7pOPXDN-_^;F3$9Q-Pzi;G>396flPiLJG@o874?&-FPcAO8h9C#xJQ zbWUFGCAvtv!uKqW0IiSD8l8(xM*R|*H*oYvQLt418Q=KFS1j5x5RH;*`|^Yu)cuD% zXXV3bFLMbM?^b5Y<2}2LRcrHqhC5z?XfdiPQwm9KZk(w@D=`Od8PDmUp38wwKB`30 zN;u+H>skT4K)MP0Zq&Nd6oL-*E0Zj3)=B#fDcSSBM!xQt;N;rU6w1e4%vhj|92?%J zR5>G`qM0OvuR?-eG)?RbCb%&P8j)3au_HBsg857;bPctFokeM(vcwQE3YTdSaT3k& z06vHd!%e0LHWBzW8|5%w14h5TJMiMA>Q!9NRcO__1v9gB``NsW7yAtRdWnPi(O?JJGI`Xz%j>YC%~Q)s}S=VY(x#0HX)=GL8>%SE{!G(NLvw<`Er*NRqH6H-jKxtOKeo%`~A2D zDp*tRs%wV%@v>p~`k=EVw)|QT3Fqlu`g49$VjZy+{3Bc1jz{~HV6+UngW*HODB-d3K1*1^nLsCg81~QDL#86? zygN?j;i>25k z3d!5ru0++KdR;c|!ACU-nQf$-5gidJS|IBXrZB^-p{T`h?qXV}D1|wiODu&MX`4Ta z>Wp39bueQ$X=ZFZR61sX)7{;v@=8@gRgcWwwT0C$u3(AByYgVDLv>cEaFrdpjJzE5 zv(tI8N+*#VwFRvRn5FvsIIEgFLhSwTnzVB(7)pLE`W#TU{4d?#aOM6Hevbw z=y0*cu1*+I3Sb2dVyIhi$$eCBcaJy3m<9fv zI=F8hMPu6(X28a$BlF50E4LAZ$SpyGo&>DoPX$~f1Vlq^fxJ@o-9uco0Orl$R2c6BxLako;NMw2;J}!0; z^uq1#xG$H1%I77=^eMYRFpp~zx%Ft}v@w%3HmKo6o>zAIn`)nY7NQFG)kP1GNCaNG zJ>5938Q`7Y3s+#w5=7BQX$I13hTjNuj4t_Z)v z29u@3%ZGy&-ac0t^c&H*?U~A(h?x50Bfnq3AwY}2aDqSqFs8o{dj>>2# zI8Oo5Mz=HSbj3ERDacrd7iA&18U<~EZ>zipMI2nPl=0eV7*w8V6_~=!!}xHWFi{(x zzko|_hGSY*M^hOa59X=4=pMqAhEgVlaidb#l!}%W-$q$e(O)z8E7wqDYCZHT*B^}7 zaH1L|Dp9fmEepvu`-kC);kH)OR*r2Y?77g6*K78IVZw0@n(E$A!?ce^k03@PZLpna zzTI4^P!+9Q1YWP}X(2#%K#Pe3q)jG;o?K=p_@_m?h_rF{h z43-Y1`;gW_!DN0MMmfOrB8=|xURrCn>JxDdtBPf~qNL1Rf{$F%oFl=Id3TB#4%?sk zREb?&)mn@zVRqEF8t4+|4gK27!Nh+v5>pU39rO|pk=Z27jKpZHEF56NBix3BeXo{W z%{sjv=1`#@jYASx?Nei-C5bcfeuz@#6iyj@Nj(kW~cOH2pBsx?{H%x z!42`yM0A(&lwxgh0b(`yJPd;8{}>Uo_n0NaAW5ZJrd`T^S(`Q2;4VaXZcmRzTNrUx z7Yu+3?3SVB=>yNUN3lFb;w)Q(^b&wwXD-I zcz*FHj{j?XqBAmc*YAYm6H**gOR&F14lH8lNoq0(#0))pn-AWqGt=hNiRxrsy_ZTD zOO?@&s4m&>#YWZHYRog<$yUj0e(d8e+AqDMr>?=`iuv4kj%C`c7r<3(=cfo&FwMV| z{i_*rX7<=x-ZmC+$jeQ8Gq_>N7DrL=Y@1|>EFXepF-vz#EaWzv{gc`S5k_e>O{&>$**dfL%{q)3Qr zt-p;M{CZD48V***VQXsy+e{Lt@uFcaL4q0z6wRK}HdazOeGXJZwFh~5c%5QzVjY%^ zD}@29iW}6Hw&1NhtXh#QQy4Hi4$62>&*bh6eB(GShEjx&o|(*Sx{h;5jncNS+}YfG zYQG1o_~u%$sZ?>;h}{WQex?U{m9{4StCJI(un|709qc=I5f{x-8KN+_-{OirA`>^0joWR9JWfx@ZWrXdb zlkt$2+2e*VcFjaSmLf78U(A3rO%XocbuCjGW4zAS)+`QGO$rntv+b&iC0ac4onsD* zdNz@Kx#Cucv2>Pn>4>w|a6~|ipGFUFaPd;(tc13)jBX&x8;zFoa;WGR&zNjHNwyf& zxdYP8!4>p(a!9K`wqItzU*pUv%EapXPaRNIza90#sXiCpr920|u<8`wyo$>NDzzD- zv!c%D$;PEbKQ@JRX|m6&QXjn1Y*stASG2NsMbsvDe<(1*9r$T29)$HumMA%H>hJIi9wv9S^@%4tb+?POIi-=(25I zhJ`I`&nT~*^KnwP$P;jM+94M+mkshTE3AJ$lf1h3=c4rPQ_G45XH_P=Tzq?%*@H5H z)1qUo9ITuk;vMHI?jKARxxK@ahh{eaSg}W)%)!j5@f;D#;yPzD$*py7F0tNy0=RC4 zdvS4U+J{SV6(_mp)~y?!PpNAB$cz^9tej->VX7hD6lQYqi;AZ=v?+zCpqC?augz`g ze5!Qa1hc&@vtYsQ(P*;|_w3QN=w`^X)pGm34-=>BdoU^P`3dH^9p8yoW)5oCY{R90 zwAs0Ecj?E*sZ%dD#kFd%&#hMve5~09Zr*|?$osJM5d77)5ytJXIe0mB?9Z#XqPaYB zYulGeta56!VwD$mXn$5tg?qCqu5Tub-0Jq^5o=pqmmn@t)0^!fGh_l|k5AkOR#bV(P3kr- zE){xlDXd6?dtP;Vz?D)LqBqpxg+qRz>FgU_c$Xp__`)hweDf+V6NqY~-64U;t=Ce6 z>8pW?u!@v96;`oc)9lP4y|%Z6FL*u``}0sv+PJy{4`LiI?xju!E;n^Ci1nHC2x-hX zpBD8?+hZixU&T4_RXnS&B3rpGm-lpXCmTNpcd?0$QOLPt_OW8)kb_w};ypfTWpQ}3 z-ov=h?+E};9s9p2AQ!LFDk>~tNxgHDa~gD8Ae$3cNwOmCS_Mf%$>@Rhx|XFc)%e8j zWGFlPNfb{Pa4_+!WZ6tgnwppwGjA5!&}TqT)9s9pS)a!6RI48^Kka()Dyd{6k7By^ zU}CDgwt8JS=^hoYAc|91e6QoHb3bODO7~(`R_jJ41=a4s#nd~wde$q9zH0a4<*9Wa zUS*Y@%%h;r-AoLXH{gPDcnG|#lRMe?DcZ%Rq>f|u#nhXPH#8emQMJp%;izmI;>F8P z$6j)kRJ4&tF>QM=X~3%h(RGO0Nr~7UsIz_1+;|uG=lO zS;L!?vy%97iWQ!>s-$zsr);P&ek@Y`f}HYR*`L5oIjgWkW>9uc5a83SUMxNRJqOF! z2F0A7%_^TUl;=Bmr5iKWj3wGI3<&F{u(dqV%PMJ=nf{W4qo-~CIhHjoms3H@`m!?B zSCQ3i_qbbjYUshq(*SNxWfiaIP*CAK3$6yKWzgdF2J0TN!Rw^yYwpIW){sm}rA)+{wm^OIHgqGeFOvJa8c$#m8(eYyF0x+k~TQ0eefhN0A8!_+`N zv*luAG%Z0Rq5Nqqs^#G5X#{_cWevgQRL~gNtTINP9FVVDUIWlt!ocPF=D?4cr&+z2 zm9?mmNkLn z>TYALzZGtl4pchX_?f}Qrlj6u_Qe#PjW;wK)Je5hjfXp>w}EaZ*gSY(&miMl0f;| z)=E1I7q_O|3icicE{6v|SddcwuyrkqSZ-Zu)nqNP;ZokeFD$gCD znS7Xw-}4tsdnzL@nBvglUZ2r$V1Gagnn}31IUOoD24YS=c5UPl<P zPDOR%aYWryD;}KUb}6l6pXCVsIDNh*iWHU*l4D_*I+4Dxjy-OKak~t?S5#CA+*ezm zk0#~C2h)nmz}>-6l$RJ>i*vTNd5~XSc5o@_v5GtAYNp4hFAd3r8=k7to>OG&3sW>L)X-8>BE4{#f9 z#t9V<lr@#yeO;Ifo=(tDLD@DjdX!Dyr(9Gd?Yu-$76EqzsW7wT1tNvnc<+Yw z(6i6o7anXp?+WnXWbQL6swMk+dr^+5le&c&6aiw4y z5f8bzRSlbf1#@7pwYTNLDIw3ANv1vmkK6L?-LL32-M8(>GsK*0U`gir=7y$d99sEQ zG9%utpo7!ilEj9sT5GqrC*wA}VbX*DjJGH4!En+Z9$D&ci3Tg^9_@_VlX0g%*2O}m zxR7P!)Rr1;QkG#KuL;?>r!7P}h_UBW0o;mFepxv#E~)J$_vcp1SH(bl2+b&L5b-au z267d!jN?!o-Cr=~R?n-g=y0NP~gDtlUvVS9Bf@*o%o-r5!c!AZ#>OJ8Vp| z3vm|9DNfEtzv3k>%~w)BL}qp@M?#t9lup(%oYSeS=eon40ln*OuZSwWWpOQ|4JJ8V zEMNeZu_8rWT&1O;fL4?u_6)Drgwc5Aw4f&&N1-y5TWLGT7AeiyDrw5YaxhQd=W5Hv zuFNzK|JDHQl1E}TN?br{me2W+90t|;g{%Ie8bFt9X$yHVDAfa#lcp8{{7Y$N;VLiV z_i8x6V^uH|gGiN~LI3)lusxcLmv*-gq!?D?@x=j{(3#s&V16hjll5MBq_eX*Y4<`n z3m-16E{LEHL{nB^&KPZ#hMn1KiRmB{YFe3A_PfPYRR|C)9Rg8=01$!tzmR{`n*Z{` zk>U7;&bYU9s8F$^@D;xThZ!nE=5)I zz-psih4qC&=kR8@bOi2~Iu?#6eL<+W`O4}Zy~Q|B4m{UxZ-g|8bW{~yZRu94rZ<{3 zuF-^eTR(sr1Pv1-K#;6FJuY8ZqroP&=ik7xoOZW+)K&)mZDkfK(d_Z8^kxrog*L<1 zhShSlVZCI76gV3sR(z?`?A9d%=-pJXJfstbvO z#;>g~&cP#n@UL=JxFr7^-n>_#xMH=0LQQOkUbrKwyuXT4PDm18Frz_24s= z@wB!_D}QMDaCROoNJgBa zRbC@*>XamQ-Pi_sdH4mCou%=NC_9Vf84I2kA6L0z4a>e8TiQ7LdVdmbwYH4K5yJ?s zTso^$@+hCvqAp>;A+p%ShpYK^0rxej8$bP99_Miy(-?Z4ae`IDtPR4FeQjJavww{; z!ZYPw{c4U$LTnD3rc!k~2lv#yoVH9ftr*UmV!_)zHclydx&7Y-WaikMSGkQ&y@1FD z2VPp`#buOiKb4SQY&$Q$0Ml`k?7Qp=l%l}K{wbBjcBxx|LfBZjEMc$vIZseb#XI98 zyLh2meodrUxHM3vHkqd`3W)1oD^Wgnv zx(1`?22-}id|Kwld|LO7`9?aA1twpnyp07Wj|C==1ul=Y?i-D?{u&KNmPT6l4aP#A8v^J`Yp{F;@tZ!|0EJerlXUYbnZYBE0A zgf`gpwI<_#O=x%1>6o%XTboK(Wy)4%@~tvut1|gknS85UzG<5`nKrjsV`Ql@vM}vX zv&P6$V`QmuvZVd5Sx@_4lWFUkbw;OkrW|#q9Cb#gb*3D3rW|#q9CfA~b4)qr7{6!w zo+i`21eHo!n4nTkOA}NW6$TY($J*^@tgY7IakI`C51q7*hh4a~uyqXX1bcF4(Ax~h zGL^RQuTDMbsiMP^2D9i?%HE^mS*@OpS+%aG;y5m7;=y5+ey;{>r&Ny&5*>7~^r za~U!zo{gg}o{QtPwH&UI5Y_1#OL6JptD{#J;SbvrXpUeHA^bDCQFmt? z?uOK%N$=g+o(x4e{BWmx-DW3Z*6Vjx`jf8Uy9KAeBhX-HYb^{X;&0>Oa3bGcIn)vS zCrA6;>)>s2A=%O4X1K545e!Fy1^zo6kFSOVoeh!yMymZx{!w@KiR z{~7J`o&R&unVFgUJP!VJ5B&4P;s5Ure|yBt-Naw+Q-w5wzWdDGqd&mEXI>BA3Vg-C zuba8>?I&mNK64TLJNi(&_}Dr4)SLDCTc;L-nzsK!=`zIgyNcS@zZ9enUH@^NOcf0H%FTL;nzqz*eh7&h`|7l-7 z_}QQM)5=qR$P{h@Qd$y@#k;4{C~8r|M_p6yW6WC za=*#hcWnIHm$uLR%tJo@M}PCZKmEg*TVL^(Z@ls0ulSG44!rZr_xakdJ^5j;oW13e zS9gA||6^ae_tw*YtNxRBd*dtj|G}nE;;;O#f4}>Eu4rDmwD9U@zw6eMp9` z|M#Ek|Ni{?l`GdgZ}Z>wfAhIF-t^!%9$dWJhc3P7$M5m!@k4KX{-1vLt5;w3j>^N< zSKj%a*4G|!>u;X>?LS$$;4^>FY>w_d_ufl(?wr5#>>UR``ksTe`kDWE@7LFU_dmZm z_pQ7A%bq9w@Q2^_;}>7?wVe;W{_rK=|KJOMaQTBj^dtXr^byZ}_~`G?JmmrVzInkT zMqhi#```Mr_x$iD?|9I=KKbQ){rB3-pY-zHgJ1K?n?7;-@BHE2FTYRwsh|DRzx|Kx zzg~OkiTi!z#lLmKP4E29zrEv%FMr|AAH3BhIe z^n-7E-LJjt(#JmLrpxcB{B-j%A9?eh<~_goqL1D2kZa$6{Wt&k9`Ag~(t{s*;~Qso zfB)%!Gk)OTUHSEUbuKt|>!sg%-oO3RtM)zfnzw!NlW(}~3FjX6*B8F8dH2&Fe@E-f zzdJwLz4);=U-JH^ANbzQ-`x1f8~cCx=y$#UUQhnFGmrht+2M=7)HwLScUCHYe80D! zyY;HMM?LU@Pk-#9+upS6=YH(ggAe?JJHK_)!+-U;|N7yLpF8@Dr~mw)UHJT0TyV$V zKYcj7^JTC5oqzrKcfWY#U#`65c~`%sQ+ei#ZhgvAKYzt*pYVm>oxSEk%~!qtul{l2 zr+@!-!NYou6Ce8Hn<`KE-lH%3>`&hJAMX3rcYW*D%P)QLdoKBlKl;=~fA^5*edU7h z{^Ngq^T}VksCD)=w_SAGoB#Ua`+wpkZ~V#&e*W!W`gZdd-#PrX7e4rx9`*e3dtdtE z#-YD|-{qejo!Rx0C;r1*-XDJKK?mRU^536%+e_bZ=_N0G{3EWo{qd99?o&5i{KD7$ zeW&x;-@fmMf8vGLeS5Ha_35kbyx-gJcJ;~n6Z@Zd@cln}^4PEMecs=^BK-NCkACNI z&0qY|HP3H7@gv`R(7D>DKlb1E{mM%>p0xbzeNQ-i{3rhTCpO-F^}X+S(hFbprXz3t zqg&_y>i=uMuG*r|w*ZU-L&^|ChcJMf8fs{yTUtVChL9E*)KPi_5s==5NQZO?gTMx1 zR7#{vLPEMEL{cP=``n*TaQ=7eS(m?cv7Yw|*Py58w!gaG%Bilh4<)HkN)e!I;b%sa zG5^(zCDIFT%pyIsZK9JPQe$W+Z)+9gKKH-9@zZscRA2kT{#mRVI&$h0m#Z_a(nW$U zb=r4+jppQ?UkauimU0JF4=wu74VbQL3)L5g_m4+id0-h2evYo&Ya{bhYIJM z_6#{dk_MciH3%MA_Nrm$q4kOx)B`hai)#@zm=X47e20&my>DTa8%#)PAA~ zN$&i1=we)i!SfSg;MaT`A834uu7GdSb97uXnp|2~6GOA~@0rudYtY;|fA`$vg|gb< zkC+{F5eF%mJ?vQFo=>*LedOO6CJpJ1+k^Nn`?%^X1@+RG1jL-%BbW^LRHM-*pzL1zR{1nri+5V>?bfc5+YxK}pVLo{zxSRy=3-K< z8Hfv^SCC<^c@oe)OD-^_lxshcxm^0wug_Wa#deBP8)f?Y-Yv$=k%t1?bSKGW&o6SF z88s>?%18=6m9pu0&FWQ!(3a8}5t?{RGsDMLLbxelPoV8m!%`Wi{ zaUZp92%98)?!>GFhs_9P^-MBY-Xj*>*ge3$=G!fZdJx|bxa=vbPI)j~Md6)CCU@~V z`f>I<+Rc0|aW?`ErPM3+eb1KOzf_OR@1x*9#0a)*U;avAg1{Gjf=N6OkU>H@7s{`_ zLYYsU*Q0JV8Daxm=Pe`+Xq4KoZ;+`ryCK4Lys_lvNN z=)6{&W2kuTsK1n=Fot2kG7n$mw;1wyuZx=aRsAncf3xZn1+$H$mxXFfGM=ta>s;S- z9(~wn{Qxg9@ekyAD-itz*@Rp9rZx~=z`t|>H!$0k5#@5qrY|e;6yS-Dq&#P&Idl&r zZD^xu-j?#bi_+jKKpSuS{eHjTh#lfXBI^yC$c|23FH%}kSAC`tO-dxce(UKdo>nzh(7#K;r*@vEG659Gue!~H-keqPdMP?*m z7S!*opRz!14f|%a-{|>_pua1=Y9+hMq9^!@XmGv5w$E)%mPcv3%l?FFKX%#C+`>tw zP2@Exzw@?60yKj@KAKAK`IV@V?&%uIMr#TIOn!=&<+UW6Lg|uN^FPYW4cs&~p|+n) zW7M(;8SQY;^sAG2^+2karhL7RH|oc8q@CQVgNFHey-mjvK z8JnL=!uUjChKD#-92s$dLzJA}SGg-g?U)l)-9yVQTcrjm+;7ZV z9et*`ONF7T5-_0XyIUus}5~lwx=<)KGvxf z2~<|sE%T0RQ&zFFup84>(*DQ84MzLMm6}kwwqs1%N#2()OqCX=BCOM|$Z;UnVV-EM zs6@&j)-K(a5UQBUil~8gN#a&HZJGRW>78L{UI9W;F+D0J_; zRF4%IgN%sMK=V?9=H}Z`PTI@1J`}O)V~lZTquL`8AQ;lIt!$tgq6em?h+@K&a#db{x#gxo zVHC>%x-1KA35~n%7+yVLou|u2t}juNm*i*JIzq&>{654fzRfkLRjE$1nw{vnhXdg? z|HT6OhR8)#emz{W01bS1j_bg$^ES)4whN?=1>;*I5&};rwwp+lZi$R8`O=s>=d(CY z2EEha-j5CA9prN|=nC_|SBjL~&cQOsCnrxAr`d`~-rKS2{P~E)U+M7@CD(WMr&h_( zSu_*mh$ndU=h5dT2u793gexv>(X;pRXeeh>FiS>KR@6W>3{CF2b15~y_Jd)Zqy@g# zGuhky<9ie-#y0a3kr*KolmI&np1qOFXs|enVx30IYSqufyEyhgNPn<{nM$QVTr)RV zx%aec@o`($=>0t7l_B|4^>yYwXmjX$DioyFoJ8qs9il>E>ZV2Mv~P`l&)%8d?wpq< z;m_f04%(?oFWRvk9Wtkgj@1iX@5Zh6e78$?gNP_*oZ$hUeFq8g_C#A`jHHc|Dsp1g zWS}1;9!cLHD<-<7he$+c(I$iv`6dL_!&n-eT4n9>;BS%zQEk`E3sxLby96S)S7jyp?0a0(`Do}UO@UJM4JF*cKwhf00e*l5C8%|00;m9AOHk_01yBIKmZ5;0U!VbfB+Bx0zd!=00AHX z1b_e#00KY&2mk>f00e*l5C8%|00;m9AOHk_01yBIKmZ5;0U!VbfB+Bx0zd!=00AHX O1b_e#00RFH0{;O#%D`3t literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/SpurGear/SpurGear.manifest b/usr/autodesk/CPP/Samples/SpurGear/SpurGear.manifest new file mode 100644 index 0000000..57b577d --- /dev/null +++ b/usr/autodesk/CPP/Samples/SpurGear/SpurGear.manifest @@ -0,0 +1,11 @@ +{ + "autodeskProduct": "Fusion360", + "type": "script", + "author": "Brian Ekins", + "description": { + "": "Create a spur gear." + }, + "supportedOS": "windows|mac", + "sourcewindows": "SpurGear.vcxproj", + "sourcemac": "SpurGear.xcodeproj" +} \ No newline at end of file diff --git a/usr/autodesk/CPP/Samples/SpurGear/SpurGear.vcxproj b/usr/autodesk/CPP/Samples/SpurGear/SpurGear.vcxproj new file mode 100644 index 0000000..8219d58 --- /dev/null +++ b/usr/autodesk/CPP/Samples/SpurGear/SpurGear.vcxproj @@ -0,0 +1,107 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {D7CBB035-8CC0-4576-9C72-5076E079586B} + Win32Proj + SpurGear + + + + DynamicLibrary + true + v140 + Unicode + + + DynamicLibrary + false + v140 + true + Unicode + + + + + + + + + + + + + false + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + false + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;SIMPLE_EXPORTS;%(PreprocessorDefinitions) + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/include + + + Windows + true + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/lib + core.lib;fusion.lib;cam.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /R /Y "$(SolutionDir)$(Configuration)\$(ProjectName).dll" "$(SolutionDir)" + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;SIMPLE_EXPORTS;%(PreprocessorDefinitions) + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/include + + + Windows + true + true + true + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/lib + core.lib;fusion.lib;cam.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /R /Y "$(SolutionDir)$(Configuration)\$(ProjectName).dll" "$(SolutionDir)" + + + + + NotUsing + NotUsing + + + + + true + true + + + + + + \ No newline at end of file diff --git a/usr/autodesk/CPP/Samples/SpurGear/SpurGear.xcodeproj/project.pbxproj b/usr/autodesk/CPP/Samples/SpurGear/SpurGear.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c707caa --- /dev/null +++ b/usr/autodesk/CPP/Samples/SpurGear/SpurGear.xcodeproj/project.pbxproj @@ -0,0 +1,269 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 2BB196C61AD5940800164CD3 /* SpurGear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2BB196C51AD5940800164CD3 /* SpurGear.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 2BB196BE1AD586AA00164CD3 /* SpurGear.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = SpurGear.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; + 2BB196C51AD5940800164CD3 /* SpurGear.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpurGear.cpp; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2BB196BB1AD586AA00164CD3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2BB196B51AD586AA00164CD3 = { + isa = PBXGroup; + children = ( + 2BB196C51AD5940800164CD3 /* SpurGear.cpp */, + 2BB196BF1AD586AA00164CD3 /* Products */, + ); + sourceTree = ""; + }; + 2BB196BF1AD586AA00164CD3 /* Products */ = { + isa = PBXGroup; + children = ( + 2BB196BE1AD586AA00164CD3 /* SpurGear.dylib */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 2BB196BC1AD586AA00164CD3 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 2BB196BD1AD586AA00164CD3 /* SpurGear */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2BB196C21AD586AA00164CD3 /* Build configuration list for PBXNativeTarget "SpurGear" */; + buildPhases = ( + 2BB196BA1AD586AA00164CD3 /* Sources */, + 2BB196BB1AD586AA00164CD3 /* Frameworks */, + 2BB196BC1AD586AA00164CD3 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SpurGear; + productName = SpurGear; + productReference = 2BB196BE1AD586AA00164CD3 /* SpurGear.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 2BB196B61AD586AA00164CD3 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0500; + ORGANIZATIONNAME = Autodesk; + }; + buildConfigurationList = 2BB196B91AD586AA00164CD3 /* Build configuration list for PBXProject "SpurGear" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 2BB196B51AD586AA00164CD3; + productRefGroup = 2BB196BF1AD586AA00164CD3 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 2BB196BD1AD586AA00164CD3 /* SpurGear */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 2BB196BA1AD586AA00164CD3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2BB196C61AD5940800164CD3 /* SpurGear.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 2BB196C01AD586AA00164CD3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/include", + ); + LIBRARY_SEARCH_PATHS = "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib"; + MACOSX_DEPLOYMENT_TARGET = 11.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 2BB196C11AD586AA00164CD3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/include", + ); + LIBRARY_SEARCH_PATHS = "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib"; + MACOSX_DEPLOYMENT_TARGET = 11.0; + SDKROOT = macosx; + }; + name = Release; + }; + 2BB196C31AD586AA00164CD3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(EFFECTIVE_PLATFORM_NAME)"; + EXECUTABLE_EXTENSION = dylib; + EXECUTABLE_PREFIX = ""; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(PYTHONINC)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); + INSTALL_PATH = "$(SRCROOT)"; + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = ""; + OTHER_LDFLAGS = ( + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/core.dylib", + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/fusion.dylib", + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/cam.dylib", + ); + PRELINK_LIBS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SYMROOT = "$(SRCROOT)"; + }; + name = Debug; + }; + 2BB196C41AD586AA00164CD3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(EFFECTIVE_PLATFORM_NAME)"; + EXECUTABLE_EXTENSION = dylib; + EXECUTABLE_PREFIX = ""; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(PYTHONINC)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); + INSTALL_PATH = "$(SRCROOT)"; + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = ""; + OTHER_LDFLAGS = ( + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/core.dylib", + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/fusion.dylib", + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/cam.dylib", + ); + PRELINK_LIBS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SYMROOT = "$(SRCROOT)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2BB196B91AD586AA00164CD3 /* Build configuration list for PBXProject "SpurGear" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BB196C01AD586AA00164CD3 /* Debug */, + 2BB196C11AD586AA00164CD3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2BB196C21AD586AA00164CD3 /* Build configuration list for PBXNativeTarget "SpurGear" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BB196C31AD586AA00164CD3 /* Debug */, + 2BB196C41AD586AA00164CD3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 2BB196B61AD586AA00164CD3 /* Project object */; +} diff --git a/usr/autodesk/CPP/Samples/TestScript/TestScript.cpp b/usr/autodesk/CPP/Samples/TestScript/TestScript.cpp new file mode 100644 index 0000000..16eeba8 --- /dev/null +++ b/usr/autodesk/CPP/Samples/TestScript/TestScript.cpp @@ -0,0 +1,43 @@ +//Author-Autodesk Inc. +//Description-Simple script display a message. +#include +#include + + +using namespace adsk::core; + +Ptr ui; + +extern "C" XI_EXPORT bool run(const char* context) +{ + Ptr app = Application::get(); + if (!app) + return false; + + ui = app->userInterface(); + if (!ui) + return false; + + ui->messageBox("Hello script"); + + return true; +} + +#ifdef XI_WIN + +#include + +BOOL APIENTRY DllMain(HMODULE hmodule, DWORD reason, LPVOID reserved) +{ + switch (reason) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +#endif // XI_WIN diff --git a/usr/autodesk/CPP/Samples/TestScript/TestScript.dll b/usr/autodesk/CPP/Samples/TestScript/TestScript.dll new file mode 100644 index 0000000000000000000000000000000000000000..104c860b7f4c2edd7bfd9d7952738e149c41433f GIT binary patch literal 18288 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 L@cuHL literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/TestScript/TestScript.dylib b/usr/autodesk/CPP/Samples/TestScript/TestScript.dylib new file mode 100644 index 0000000000000000000000000000000000000000..c6489270a16a04ec2e7e4fde583bb8bbf36f458a GIT binary patch literal 11244 zcmeHNe`p-X6`r%~SaBTdOl{)gs67|U*mZiVvt-APNqe$&&5EeX*^*o1;tqRzE9vU{ z<=s8|WN2!z4G}`ENFfy5mO!D<{83z5S}08sO+aoaRB54@CfG?y%ehX#CD4Eixqjd7 zth9HMOp4?7pL;Mf?|bv+&D*zgH?uSIhdb|mxK@Zrn-Jmwq>V^X2rh{zI3YfXR9z*6 zlq0F*Bc7-+^VJq*3d4k0gT#^~rE67PpZ9U2z4Us&?jI4qBwoF!PH;X9rF7g%##sp!GWQtQ~d+Me@YBOlCmda9un_9a@IzKcFeJC zM>Dd8Tu~d$Wo*Nq(E7^de9ko7T&Wlvu9V9q+tvCiZYgUyrxuvl7b^}GdiHf|edz)1 za5}9G8-;S-aGeVs2CKD5a@4g*n5@kSoOo*LuvAoSw z@qSD6eIEF6loz{%7{_4aoRSUv*B^vS;s>lfbDYi~v{ z(@&;u>z8IbF1`S5eX3obn&c#?PtMg}*C$`mCr{S&sVC>LV9*cTaJ%$Nb@xGiYOOw% zY_HGjlbyd{&80WohxDm7eG2VvKs^18TJ3$$Ugry{{t110uZ?L6b@RXCR8Y&Jn~tx{ zcI--B(dSaL5TSqAIDZw~zf$uNcbz^}dFxht;*DE7^y$j$`t-4%CVrPn%m$rYsqLVv zuvqH^^Ro!p+qIX_{JCrTg;({jo`nCe=+mhh9;cRp{8kKtTU&kU6-wV>x6>&+%3ST5 z&)+7WB|mwi_Ggqc4aE4JytxVT(T-2|3qf4_F<|Wn$h_#L^~rzhQwJHW=wh(u5DFN* z@M^o~*j(+m^?Lok(SIKLGc#SjPoNv3{b=}L~^76lW`8&u5r#ruoqHnm~HH~s+oSxqNI}DCLM(#~=-z4`(a<7rQ zO73lPzae*r+|S8HVd3UW;LzXYdC@k68iB=+Ph`0K`jBt{iR;bx2+ksHM)GQ227`5v zXoE2^hja?bqx$8|Z4U>Fj-3!isKUOMm+MwOUy3>2+K_tGeiVuEW0Z(#hBzW3M_BNi zfZw;r0g^}u@$E+r^+9x@`@^>s$9lo zOVo-$D*~+uv?9=oKq~^R2(%*5ia;v@tq8Ot(277S0{^E7Y}~em+YaIrNh#%6wJLG^ z?Uaf}KIcxzGu`6I>FCU+Bu=`r-hsQ!;LI2YuhWDBQ=hHH6F@ApDv zRt=f4#&SgoU(9iKo!o?{Ip&|HAGMqcj=&++DV0=*fojf$%%h0JF3u{uQWVijPHb)y z^ILFWdM)PH0?n?9Zs^{lpty5={TlGxCtDrJP-17tBW^2^yv;u{6lBRLA|J-QF)@m5 zuSd`R@EBESD2^<+f3Xex_7LVC=tU|jy4-{}pu=$evrQQ4-agnKG9VU1$ikTY&+tGO z^a0wl{{T~eI}*0cJR)ZMFlPG~Rr>>o1ltFg`fML;OA)hu7_&Y1+ek-L`v3>+yZ!0~ z|HGK=xlc#>j%pv^kJ>)iH~W)nAK;)p&u2-*^gqCFLx0C=f6tKh?<>r`L(&@5v7UQ~ zq({KVJkHN(FUw5PR@8qga(*HHClwCjSy4EM&o31Yp7#Ub4X_vZzXqds17yK{mq!#1 z{M)5);NL;u4zv%(W0IJArRs(E1EU%ieH!uc!V{eHF{0qpToYdJonkNkUOIieU~hL* z{pXwTNRz&XZa5YaNc_?EBE^wOx__VC*Be$V3CX|9kN0Lru4v{fSxY;NnJRog zB+SRh|5u&H9t{4is?@33qW^YhoY=~*J_6%y-%mHcSM$jIa^#EAb4exMpx qV2y!WX)Q{vk8Krtug27nKGC@HY+OVt6kdTsw9LAF$%-9w(0>5SEchV+ literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/Samples/TestScript/TestScript.manifest b/usr/autodesk/CPP/Samples/TestScript/TestScript.manifest new file mode 100644 index 0000000..d7b734d --- /dev/null +++ b/usr/autodesk/CPP/Samples/TestScript/TestScript.manifest @@ -0,0 +1,11 @@ +{ + "autodeskProduct": "Fusion360", + "type": "script", + "author": "Autodesk Inc.", + "description": { + "": "Simple script display a message." + }, + "supportedOS": "windows|mac", + "sourcewindows": "TestScript.vcxproj", + "sourcemac": "TestScript.xcodeproj" +} \ No newline at end of file diff --git a/usr/autodesk/CPP/Samples/TestScript/TestScript.vcxproj b/usr/autodesk/CPP/Samples/TestScript/TestScript.vcxproj new file mode 100644 index 0000000..0cb4705 --- /dev/null +++ b/usr/autodesk/CPP/Samples/TestScript/TestScript.vcxproj @@ -0,0 +1,107 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {D7CBB035-8CC0-4576-9C72-5076E079586B} + Win32Proj + TestScript + + + + DynamicLibrary + true + v110 + Unicode + + + DynamicLibrary + false + v110 + true + Unicode + + + + + + + + + + + + + false + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + false + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;SIMPLE_EXPORTS;%(PreprocessorDefinitions) + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/include + + + Windows + true + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/lib + core.lib;fusion.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /R /Y "$(SolutionDir)$(Configuration)\$(ProjectName).dll" "$(SolutionDir)" + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;SIMPLE_EXPORTS;%(PreprocessorDefinitions) + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/include + + + Windows + true + true + true + $(APPDATA)/Autodesk/Autodesk Fusion 360/API/CPP/lib + core.lib;fusion.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + xcopy /R /Y "$(SolutionDir)$(Configuration)\$(ProjectName).dll" "$(SolutionDir)" + + + + + NotUsing + NotUsing + + + + + true + true + + + + + + diff --git a/usr/autodesk/CPP/Samples/TestScript/TestScript.xcodeproj/project.pbxproj b/usr/autodesk/CPP/Samples/TestScript/TestScript.xcodeproj/project.pbxproj new file mode 100644 index 0000000..15461b9 --- /dev/null +++ b/usr/autodesk/CPP/Samples/TestScript/TestScript.xcodeproj/project.pbxproj @@ -0,0 +1,267 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 2BB196C61AD5940800164CD3 /* TestScript.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2BB196C51AD5940800164CD3 /* TestScript.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 2BB196BE1AD586AA00164CD3 /* TestScript.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = TestScript.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; + 2BB196C51AD5940800164CD3 /* TestScript.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TestScript.cpp; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2BB196BB1AD586AA00164CD3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2BB196B51AD586AA00164CD3 = { + isa = PBXGroup; + children = ( + 2BB196C51AD5940800164CD3 /* TestScript.cpp */, + 2BB196BF1AD586AA00164CD3 /* Products */, + ); + sourceTree = ""; + }; + 2BB196BF1AD586AA00164CD3 /* Products */ = { + isa = PBXGroup; + children = ( + 2BB196BE1AD586AA00164CD3 /* TestScript.dylib */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 2BB196BC1AD586AA00164CD3 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 2BB196BD1AD586AA00164CD3 /* TestScript */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2BB196C21AD586AA00164CD3 /* Build configuration list for PBXNativeTarget "TestScript" */; + buildPhases = ( + 2BB196BA1AD586AA00164CD3 /* Sources */, + 2BB196BB1AD586AA00164CD3 /* Frameworks */, + 2BB196BC1AD586AA00164CD3 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TestScript; + productName = TestScript; + productReference = 2BB196BE1AD586AA00164CD3 /* TestScript.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 2BB196B61AD586AA00164CD3 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0500; + ORGANIZATIONNAME = Autodesk; + }; + buildConfigurationList = 2BB196B91AD586AA00164CD3 /* Build configuration list for PBXProject "TestScript" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 2BB196B51AD586AA00164CD3; + productRefGroup = 2BB196BF1AD586AA00164CD3 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 2BB196BD1AD586AA00164CD3 /* TestScript */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 2BB196BA1AD586AA00164CD3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2BB196C61AD5940800164CD3 /* TestScript.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 2BB196C01AD586AA00164CD3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/include", + ); + LIBRARY_SEARCH_PATHS = "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib"; + MACOSX_DEPLOYMENT_TARGET = 11.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 2BB196C11AD586AA00164CD3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/include", + ); + LIBRARY_SEARCH_PATHS = "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib"; + MACOSX_DEPLOYMENT_TARGET = 11.0; + SDKROOT = macosx; + }; + name = Release; + }; + 2BB196C31AD586AA00164CD3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(EFFECTIVE_PLATFORM_NAME)"; + EXECUTABLE_EXTENSION = dylib; + EXECUTABLE_PREFIX = ""; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(PYTHONINC)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); + INSTALL_PATH = "$(SRCROOT)"; + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = ""; + OTHER_LDFLAGS = ( + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/core.dylib", + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/fusion.dylib", + ); + PRELINK_LIBS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SYMROOT = "$(SRCROOT)"; + }; + name = Debug; + }; + 2BB196C41AD586AA00164CD3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(EFFECTIVE_PLATFORM_NAME)"; + EXECUTABLE_EXTENSION = dylib; + EXECUTABLE_PREFIX = ""; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(PYTHONINC)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ); + INSTALL_PATH = "$(SRCROOT)"; + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = ""; + OTHER_LDFLAGS = ( + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/core.dylib", + "$(USER_LIBRARY_DIR)/Application\\ Support/Autodesk/Autodesk\\ Fusion\\ 360/API/CPP/lib/fusion.dylib", + ); + PRELINK_LIBS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SYMROOT = "$(SRCROOT)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2BB196B91AD586AA00164CD3 /* Build configuration list for PBXProject "TestScript" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BB196C01AD586AA00164CD3 /* Debug */, + 2BB196C11AD586AA00164CD3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2BB196C21AD586AA00164CD3 /* Build configuration list for PBXNativeTarget "TestScript" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BB196C31AD586AA00164CD3 /* Debug */, + 2BB196C41AD586AA00164CD3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 2BB196B61AD586AA00164CD3 /* Project object */; +} diff --git a/usr/autodesk/CPP/include/CAM/CAM/CAM.h b/usr/autodesk/CPP/include/CAM/CAM/CAM.h new file mode 100644 index 0000000..6cb0df3 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/CAM/CAM.h @@ -0,0 +1,410 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../CAMTypeDefs.h" +#include "../../Core/Application/Product.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_CAM_CPP__ +# define ADSK_CAM_CAM_API XI_EXPORT +# else +# define ADSK_CAM_CAM_API +# endif +#else +# define ADSK_CAM_CAM_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class GenerateToolpathFuture; + class MachiningTime; + class PostProcessInput; + class SetupChangeEvent; + class SetupEvent; + class Setups; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} +namespace adsk { namespace fusion { + class CustomGraphicsGroups; + class Occurrence; + class OccurrenceList; +}} + +namespace adsk { namespace cam { + +/// Object that represents the CAM environment of a Fusion document. +class CAM : public core::Product { +public: + + /// Returns the Setups collection that provides access to existing setups + core::Ptr setups() const; + + /// Exports the default additive setup's models into a 3mf file. The 3mf also contains machine and support information. + /// True on success, false on errors or wrong setup type + bool export3MFForDefaultAdditiveSetup(const std::string& filepath, bool addSimulationInfo = false, bool simPostProcess = false, bool simSplitSurrogates = false, bool simKeepThickeningStructure = false); + + /// Generates/Regenerates all of the toolpaths (including those nested in sub-folders or patterns) + /// for the specified objects. + /// operations : An Operation, Setup, Folder or Pattern object for which to generate the toolpath/s for. You can also + /// specify a collection of any combination of these object types. + /// Return GenerateToolpathFuture that includes the status of toolpath generation. + core::Ptr generateToolpath(const core::Ptr& operations); + + /// Generates/Regenerates all toolpaths (includes those nested in sub-folders or patterns) in the document. + /// skipValid : Option to skip valid toolpaths and only regenerate invalid toolpaths. + /// Return GenerateToolpathFuture that includes the status of toolpath generation. + core::Ptr generateAllToolpaths(bool skipValid); + + /// Clears all of the toolpaths (including those nested in sub-folders or patterns) for the specified objects. + /// operations : An Operation, Setup, Folder or Pattern object for which to clear the toolpath/s for. You can also + /// specify a collection of any combination of these object types. + /// Return true if successful. + bool clearToolpath(const core::Ptr& operations); + + /// Clears all the toolpaths (includes those nested in sub-folders or patterns) in the document + /// Return true if successful. + bool clearAllToolpaths(); + + /// Checks if toolpath operations (including those nested in sub-folders or patterns) are valid for the specified objects. + /// operations : An Operation, Setup, Folder or Pattern object for which to check the toolpath/s of. You can also + /// specify a collection of any combination of these object types. + /// Returns true if the toolpath operations are valid + bool checkToolpath(const core::Ptr& operations); + + /// Checks if all the toolpath operations (includes those nested in sub-folders or patterns) in the document are valid + /// Returns true if the all toolpath operations are valid + bool checkAllToolpaths(); + + /// Post all of the toolpaths (including those nested in sub-folders or patterns) for the specified objects. + /// If post processing fails, an error message can be retrieved from the error log explaining the reason for the failure. + /// operations : An Operation, Setup, Folder or Pattern object for which to post the toolpath/s of. You can also + /// specify a collection of any combination of these object types. + /// input : The PostProcessInput object that defines the post options and parameters. + /// Returns true if successful + bool postProcess(const core::Ptr& operations, const core::Ptr& input); + + /// Post all of the toolpaths (includes those nested in sub-folders or patterns) in the document. + /// If post processing fails, an error message can be retrieved from the error log explaining the reason for the failure. + /// input : The PostProcessInput object that defines the post options and parameters. + /// Returns true if successful. + bool postProcessAll(const core::Ptr& input); + + /// Generate the setup sheets for the specified objects + /// operations : An Operation, Setup, Folder or Pattern object for which to generate the setup sheet/s for. You can also + /// specify a collection of any combination of these object types. + /// format : The document format for the setup sheet. Valid options are HTMLFormat and ExcelFormat. + /// Limitation: "ExcelFormat" can be used in windows OS only. + /// folder : The destination folder to locate the setup sheet documents in. + /// openDocument : An option to allow to open the document instantly after the generation. By default, the document is opened. + /// Returns true if successful + bool generateSetupSheet(const core::Ptr& operations, SetupSheetFormats format, const std::string& folder, bool openDocument = true); + + /// Generates all of the setup sheets for all of the operations in the document + /// format : The document format for the setup sheet. Valid options are HTMLFormat and ExcelFormat. + /// Limitation: "ExcelFormat" can be used in windows OS only. + /// folder : The destination folder to locate the setup sheet documents in. + /// openDocument : An option to allow to open the document instantly after the generation. By default, the document is opened. + /// Returns true if successful + bool generateAllSetupSheets(SetupSheetFormats format, const std::string& folder, bool openDocument = true); + + /// Gets a collection containing all of the operations in the document. + /// This includes all operations nested in folders and patterns. + core::Ptr allOperations() const; + + /// Gets the installed post folder. + std::string genericPostFolder() const; + + /// Gets the personal post folder. + std::string personalPostFolder() const; + + /// Gets the folder for temporary files. + std::string temporaryFolder() const; + + /// Get the machining time for the specified objects. + /// operations : An Operation, Setup, Folder or Pattern object for which to get the machining time for. You can also + /// specify a collection of any combination of these object types. + /// feedScale : The feed scale value (%) to use. + /// rapidFeed : The rapid feed rate in centimeters per second. + /// toolChangeTime : The tool change time in seconds. + /// Returns a MachiningTime object that has properties holding the calculation results. + core::Ptr getMachiningTime(const core::Ptr& operations, double feedScale, double rapidFeed, double toolChangeTime); + + /// Returns the customGraphicsGroups object associated with the CAM product. + core::Ptr customGraphicsGroups() const; + + /// Returns the occurrence that references the design root component in CAM product. + core::Ptr designRootOccurrence() const; + + /// Returns a read only list of flat pattern occurrences in CAM product. + core::Ptr flatPatternOccurrences() const; + + /// Gets a collection containing all of the machines in the document. + core::Ptr allMachines() const; + + /// The SetupCreated event fires when a new setup was created. + core::Ptr setupCreated() const; + + /// The setupDestroying event fires before a setup will be destroyed. + core::Ptr setupDestroying() const; + + /// The SetupChanged event fires when a setup was modified. + core::Ptr setupChanged() const; + + /// The SetupActivating event fires before a setup will be activated. + core::Ptr setupActivating() const; + + /// The SetupActivated event fires when a setup was activated. + core::Ptr setupActivated() const; + + /// The SetupDeactivating event fires before a setup will be deactivated. + core::Ptr setupDeactivating() const; + + /// The SetupDeactivated event fires when a setup was deactivated. + core::Ptr setupDeactivated() const; + + ADSK_CAM_CAM_API static const char* classType(); + ADSK_CAM_CAM_API const char* objectType() const override; + ADSK_CAM_CAM_API void* queryInterface(const char* id) const override; + ADSK_CAM_CAM_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Setups* setups_raw() const = 0; + virtual bool export3MFForDefaultAdditiveSetup_raw(const char * filepath, bool addSimulationInfo, bool simPostProcess, bool simSplitSurrogates, bool simKeepThickeningStructure) = 0; + virtual GenerateToolpathFuture* generateToolpath_raw(core::Base* operations) = 0; + virtual GenerateToolpathFuture* generateAllToolpaths_raw(bool skipValid) = 0; + virtual bool clearToolpath_raw(core::Base* operations) = 0; + virtual bool clearAllToolpaths_raw() = 0; + virtual bool checkToolpath_raw(core::Base* operations) = 0; + virtual bool checkAllToolpaths_raw() = 0; + virtual bool postProcess_raw(core::Base* operations, PostProcessInput* input) = 0; + virtual bool postProcessAll_raw(PostProcessInput* input) = 0; + virtual bool generateSetupSheet_raw(core::Base* operations, SetupSheetFormats format, const char * folder, bool openDocument) = 0; + virtual bool generateAllSetupSheets_raw(SetupSheetFormats format, const char * folder, bool openDocument) = 0; + virtual core::ObjectCollection* allOperations_raw() const = 0; + virtual char* genericPostFolder_raw() const = 0; + virtual char* personalPostFolder_raw() const = 0; + virtual char* temporaryFolder_raw() const = 0; + virtual MachiningTime* getMachiningTime_raw(core::Base* operations, double feedScale, double rapidFeed, double toolChangeTime) = 0; + virtual fusion::CustomGraphicsGroups* customGraphicsGroups_raw() const = 0; + virtual fusion::Occurrence* designRootOccurrence_raw() const = 0; + virtual fusion::OccurrenceList* flatPatternOccurrences_raw() const = 0; + virtual core::ObjectCollection* allMachines_raw() const = 0; + virtual SetupEvent* setupCreated_raw() const = 0; + virtual SetupEvent* setupDestroying_raw() const = 0; + virtual SetupChangeEvent* setupChanged_raw() const = 0; + virtual SetupEvent* setupActivating_raw() const = 0; + virtual SetupEvent* setupActivated_raw() const = 0; + virtual SetupEvent* setupDeactivating_raw() const = 0; + virtual SetupEvent* setupDeactivated_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr CAM::setups() const +{ + core::Ptr res = setups_raw(); + return res; +} + +inline bool CAM::export3MFForDefaultAdditiveSetup(const std::string& filepath, bool addSimulationInfo, bool simPostProcess, bool simSplitSurrogates, bool simKeepThickeningStructure) +{ + bool res = export3MFForDefaultAdditiveSetup_raw(filepath.c_str(), addSimulationInfo, simPostProcess, simSplitSurrogates, simKeepThickeningStructure); + return res; +} + +inline core::Ptr CAM::generateToolpath(const core::Ptr& operations) +{ + core::Ptr res = generateToolpath_raw(operations.get()); + return res; +} + +inline core::Ptr CAM::generateAllToolpaths(bool skipValid) +{ + core::Ptr res = generateAllToolpaths_raw(skipValid); + return res; +} + +inline bool CAM::clearToolpath(const core::Ptr& operations) +{ + bool res = clearToolpath_raw(operations.get()); + return res; +} + +inline bool CAM::clearAllToolpaths() +{ + bool res = clearAllToolpaths_raw(); + return res; +} + +inline bool CAM::checkToolpath(const core::Ptr& operations) +{ + bool res = checkToolpath_raw(operations.get()); + return res; +} + +inline bool CAM::checkAllToolpaths() +{ + bool res = checkAllToolpaths_raw(); + return res; +} + +inline bool CAM::postProcess(const core::Ptr& operations, const core::Ptr& input) +{ + bool res = postProcess_raw(operations.get(), input.get()); + return res; +} + +inline bool CAM::postProcessAll(const core::Ptr& input) +{ + bool res = postProcessAll_raw(input.get()); + return res; +} + +inline bool CAM::generateSetupSheet(const core::Ptr& operations, SetupSheetFormats format, const std::string& folder, bool openDocument) +{ + bool res = generateSetupSheet_raw(operations.get(), format, folder.c_str(), openDocument); + return res; +} + +inline bool CAM::generateAllSetupSheets(SetupSheetFormats format, const std::string& folder, bool openDocument) +{ + bool res = generateAllSetupSheets_raw(format, folder.c_str(), openDocument); + return res; +} + +inline core::Ptr CAM::allOperations() const +{ + core::Ptr res = allOperations_raw(); + return res; +} + +inline std::string CAM::genericPostFolder() const +{ + std::string res; + + char* p= genericPostFolder_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string CAM::personalPostFolder() const +{ + std::string res; + + char* p= personalPostFolder_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string CAM::temporaryFolder() const +{ + std::string res; + + char* p= temporaryFolder_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline core::Ptr CAM::getMachiningTime(const core::Ptr& operations, double feedScale, double rapidFeed, double toolChangeTime) +{ + core::Ptr res = getMachiningTime_raw(operations.get(), feedScale, rapidFeed, toolChangeTime); + return res; +} + +inline core::Ptr CAM::customGraphicsGroups() const +{ + core::Ptr res = customGraphicsGroups_raw(); + return res; +} + +inline core::Ptr CAM::designRootOccurrence() const +{ + core::Ptr res = designRootOccurrence_raw(); + return res; +} + +inline core::Ptr CAM::flatPatternOccurrences() const +{ + core::Ptr res = flatPatternOccurrences_raw(); + return res; +} + +inline core::Ptr CAM::allMachines() const +{ + core::Ptr res = allMachines_raw(); + return res; +} + +inline core::Ptr CAM::setupCreated() const +{ + core::Ptr res = setupCreated_raw(); + return res; +} + +inline core::Ptr CAM::setupDestroying() const +{ + core::Ptr res = setupDestroying_raw(); + return res; +} + +inline core::Ptr CAM::setupChanged() const +{ + core::Ptr res = setupChanged_raw(); + return res; +} + +inline core::Ptr CAM::setupActivating() const +{ + core::Ptr res = setupActivating_raw(); + return res; +} + +inline core::Ptr CAM::setupActivated() const +{ + core::Ptr res = setupActivated_raw(); + return res; +} + +inline core::Ptr CAM::setupDeactivating() const +{ + core::Ptr res = setupDeactivating_raw(); + return res; +} + +inline core::Ptr CAM::setupDeactivated() const +{ + core::Ptr res = setupDeactivated_raw(); + return res; +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_CAM_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/CAM/CAMFolder.h b/usr/autodesk/CPP/include/CAM/CAM/CAMFolder.h new file mode 100644 index 0000000..4f2deaf --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/CAM/CAMFolder.h @@ -0,0 +1,170 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../Operations/OperationBase.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_CAMFOLDER_CPP__ +# define ADSK_CAM_CAMFOLDER_API XI_EXPORT +# else +# define ADSK_CAM_CAMFOLDER_API +# endif +#else +# define ADSK_CAM_CAMFOLDER_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class CAMFolders; + class CAMPatterns; + class ChildOperationList; + class Operations; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace cam { + +/// Object that represents a folder in an existing Setup, Folder or Pattern. +class CAMFolder : public OperationBase { +public: + + /// Gets if this folder is active. + bool isActive() const; + + /// Returns the Operations collection that provides access to existing individual operations + /// in this folder. + core::Ptr operations() const; + + /// Returns the Folders collection that provides access to existing folders + /// in this folder. + core::Ptr folders() const; + + /// Returns the Patterns collection that provides access to existing patterns + /// in this folder. + core::Ptr patterns() const; + + /// Returns a collection containing all of the immediate (top level) child operations, folders and patterns in this folder + /// in the order they appear in the browser. + core::Ptr children() const; + + /// Returns the parent Setup, Folder or Pattern for this Folder. + core::Ptr parent() const; + + /// Gets a collection containing all of the operations in this folder. + /// This includes all operations nested in folders and patterns. + core::Ptr allOperations() const; + + /// Create and add operations, folders or patterns from the specified template file to the end of this folder. + /// templateFilePath : The full path to the template file. + /// Returns the collection containing all of the operations, folders and patterns created from the template file. + core::Ptr createFromTemplate(const std::string& templateFilePath); + + ADSK_CAM_CAMFOLDER_API static const char* classType(); + ADSK_CAM_CAMFOLDER_API const char* objectType() const override; + ADSK_CAM_CAMFOLDER_API void* queryInterface(const char* id) const override; + ADSK_CAM_CAMFOLDER_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool isActive_raw() const = 0; + virtual Operations* operations_raw() const = 0; + virtual CAMFolders* folders_raw() const = 0; + virtual CAMPatterns* patterns_raw() const = 0; + virtual ChildOperationList* children_raw() const = 0; + virtual core::Base* parent_raw() const = 0; + virtual core::ObjectCollection* allOperations_raw() const = 0; + virtual core::ObjectCollection* createFromTemplate_raw(const char * templateFilePath) = 0; + virtual void placeholderCAMFolder0() {} + virtual void placeholderCAMFolder1() {} + virtual void placeholderCAMFolder2() {} + virtual void placeholderCAMFolder3() {} + virtual void placeholderCAMFolder4() {} + virtual void placeholderCAMFolder5() {} + virtual void placeholderCAMFolder6() {} + virtual void placeholderCAMFolder7() {} + virtual void placeholderCAMFolder8() {} + virtual void placeholderCAMFolder9() {} + virtual void placeholderCAMFolder10() {} + virtual void placeholderCAMFolder11() {} + virtual void placeholderCAMFolder12() {} + virtual void placeholderCAMFolder13() {} + virtual void placeholderCAMFolder14() {} + virtual void placeholderCAMFolder15() {} + virtual void placeholderCAMFolder16() {} + virtual void placeholderCAMFolder17() {} + virtual void placeholderCAMFolder18() {} + virtual void placeholderCAMFolder19() {} + virtual void placeholderCAMFolder20() {} + virtual void placeholderCAMFolder21() {} + virtual void placeholderCAMFolder22() {} + virtual void placeholderCAMFolder23() {} +}; + +// Inline wrappers + +inline bool CAMFolder::isActive() const +{ + bool res = isActive_raw(); + return res; +} + +inline core::Ptr CAMFolder::operations() const +{ + core::Ptr res = operations_raw(); + return res; +} + +inline core::Ptr CAMFolder::folders() const +{ + core::Ptr res = folders_raw(); + return res; +} + +inline core::Ptr CAMFolder::patterns() const +{ + core::Ptr res = patterns_raw(); + return res; +} + +inline core::Ptr CAMFolder::children() const +{ + core::Ptr res = children_raw(); + return res; +} + +inline core::Ptr CAMFolder::parent() const +{ + core::Ptr res = parent_raw(); + return res; +} + +inline core::Ptr CAMFolder::allOperations() const +{ + core::Ptr res = allOperations_raw(); + return res; +} + +inline core::Ptr CAMFolder::createFromTemplate(const std::string& templateFilePath) +{ + core::Ptr res = createFromTemplate_raw(templateFilePath.c_str()); + return res; +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_CAMFOLDER_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/CAM/CAMFolders.h b/usr/autodesk/CPP/include/CAM/CAM/CAMFolders.h new file mode 100644 index 0000000..cac98fc --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/CAM/CAMFolders.h @@ -0,0 +1,112 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_CAMFOLDERS_CPP__ +# define ADSK_CAM_CAMFOLDERS_API XI_EXPORT +# else +# define ADSK_CAM_CAMFOLDERS_API +# endif +#else +# define ADSK_CAM_CAMFOLDERS_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class CAMFolder; +}} + +namespace adsk { namespace cam { + +/// Collection that provides access to the folders within an existing setup, folder or pattern. +class CAMFolders : public core::Base { +public: + + /// Function that returns the specified folder using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the folder with the specified name (as appears in the browser). + /// name : The name (as it appears in the browser) of the folder. + /// Returns the specified folder or null in the case where there is no folder with the specified name. + core::Ptr itemByName(const std::string& name) const; + + /// The number of items in the collection. + size_t count() const; + + /// Returns the folder with the specified operation id. + /// id : The id of the folder. + /// Returns the specified folder or null in the case where there is no folder with the specified operation id. + core::Ptr itemByOperationId(int id) const; + + typedef CAMFolder iterable_type; + template void copyTo(OutputIterator result); + + ADSK_CAM_CAMFOLDERS_API static const char* classType(); + ADSK_CAM_CAMFOLDERS_API const char* objectType() const override; + ADSK_CAM_CAMFOLDERS_API void* queryInterface(const char* id) const override; + ADSK_CAM_CAMFOLDERS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CAMFolder* item_raw(size_t index) const = 0; + virtual CAMFolder* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual CAMFolder* itemByOperationId_raw(int id) const = 0; +}; + +// Inline wrappers + +inline core::Ptr CAMFolders::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr CAMFolders::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t CAMFolders::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr CAMFolders::itemByOperationId(int id) const +{ + core::Ptr res = itemByOperationId_raw(id); + return res; +} + +template inline void CAMFolders::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_CAMFOLDERS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/CAM/CAMPattern.h b/usr/autodesk/CPP/include/CAM/CAM/CAMPattern.h new file mode 100644 index 0000000..80fed2e --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/CAM/CAMPattern.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "CAMFolder.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_CAMPATTERN_CPP__ +# define ADSK_CAM_CAMPATTERN_API XI_EXPORT +# else +# define ADSK_CAM_CAMPATTERN_API +# endif +#else +# define ADSK_CAM_CAMPATTERN_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + +/// Object that represents a pattern in an existing Setup, Folder or Pattern. +class CAMPattern : public CAMFolder { +public: + + ADSK_CAM_CAMPATTERN_API static const char* classType(); + ADSK_CAM_CAMPATTERN_API const char* objectType() const override; + ADSK_CAM_CAMPATTERN_API void* queryInterface(const char* id) const override; + ADSK_CAM_CAMPATTERN_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_CAMPATTERN_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/CAM/CAMPatterns.h b/usr/autodesk/CPP/include/CAM/CAM/CAMPatterns.h new file mode 100644 index 0000000..ab77a42 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/CAM/CAMPatterns.h @@ -0,0 +1,112 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_CAMPATTERNS_CPP__ +# define ADSK_CAM_CAMPATTERNS_API XI_EXPORT +# else +# define ADSK_CAM_CAMPATTERNS_API +# endif +#else +# define ADSK_CAM_CAMPATTERNS_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class CAMPattern; +}} + +namespace adsk { namespace cam { + +/// Collection that provides access to the patterns within an existing setup, folder or pattern. +class CAMPatterns : public core::Base { +public: + + /// Function that returns the specified pattern using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the pattern with the specified name (as appears in the browser). + /// name : The name (as it appears in the browser) of the pattern. + /// Returns the specified pattern or null in the case where there is no pattern with the specified name. + core::Ptr itemByName(const std::string& name) const; + + /// The number of items in the collection. + size_t count() const; + + /// Returns the pattern with the specified operation id. + /// id : The id of the pattern. + /// Returns the specified pattern or null in the case where there is no pattern with the specified operation id. + core::Ptr itemByOperationId(int id) const; + + typedef CAMPattern iterable_type; + template void copyTo(OutputIterator result); + + ADSK_CAM_CAMPATTERNS_API static const char* classType(); + ADSK_CAM_CAMPATTERNS_API const char* objectType() const override; + ADSK_CAM_CAMPATTERNS_API void* queryInterface(const char* id) const override; + ADSK_CAM_CAMPATTERNS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CAMPattern* item_raw(size_t index) const = 0; + virtual CAMPattern* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual CAMPattern* itemByOperationId_raw(int id) const = 0; +}; + +// Inline wrappers + +inline core::Ptr CAMPatterns::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr CAMPatterns::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t CAMPatterns::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr CAMPatterns::itemByOperationId(int id) const +{ + core::Ptr res = itemByOperationId_raw(id); + return res; +} + +template inline void CAMPatterns::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_CAMPATTERNS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/CAM/ChildOperationList.h b/usr/autodesk/CPP/include/CAM/CAM/ChildOperationList.h new file mode 100644 index 0000000..3c54dbe --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/CAM/ChildOperationList.h @@ -0,0 +1,108 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_CHILDOPERATIONLIST_CPP__ +# define ADSK_CAM_CHILDOPERATIONLIST_API XI_EXPORT +# else +# define ADSK_CAM_CHILDOPERATIONLIST_API +# endif +#else +# define ADSK_CAM_CHILDOPERATIONLIST_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + +/// Provides access to the collection of child operations, folders and patterns of an existing setup. +class ChildOperationList : public core::Base { +public: + + /// Returns the specified item using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the operation, folder or pattern with the specified name (the name seen in the browser). + /// name : The name of the operation, folder or pattern as seen in the browser. + /// Returns the specified item or null in the case where there is no item with the specified name. + core::Ptr itemByName(const std::string& name) const; + + /// Gets the number of objects in the collection. + size_t count() const; + + /// Returns the operation, folder or pattern with the specified operation id. + /// id : The id of the operation, folder or pattern. + /// Returns the specified item or null in the case where there is no item with the specified operation id. + core::Ptr itemByOperationId(int id) const; + + typedef Base iterable_type; + template void copyTo(OutputIterator result); + + ADSK_CAM_CHILDOPERATIONLIST_API static const char* classType(); + ADSK_CAM_CHILDOPERATIONLIST_API const char* objectType() const override; + ADSK_CAM_CHILDOPERATIONLIST_API void* queryInterface(const char* id) const override; + ADSK_CAM_CHILDOPERATIONLIST_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* item_raw(size_t index) const = 0; + virtual core::Base* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual core::Base* itemByOperationId_raw(int id) const = 0; +}; + +// Inline wrappers + +inline core::Ptr ChildOperationList::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr ChildOperationList::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t ChildOperationList::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr ChildOperationList::itemByOperationId(int id) const +{ + core::Ptr res = itemByOperationId_raw(id); + return res; +} + +template inline void ChildOperationList::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_CHILDOPERATIONLIST_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/CAM/GenerateToolpathFuture.h b/usr/autodesk/CPP/include/CAM/CAM/GenerateToolpathFuture.h new file mode 100644 index 0000000..0ec5a27 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/CAM/GenerateToolpathFuture.h @@ -0,0 +1,93 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_GENERATETOOLPATHFUTURE_CPP__ +# define ADSK_CAM_GENERATETOOLPATHFUTURE_API XI_EXPORT +# else +# define ADSK_CAM_GENERATETOOLPATHFUTURE_API +# endif +#else +# define ADSK_CAM_GENERATETOOLPATHFUTURE_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class Operations; +}} + +namespace adsk { namespace cam { + +/// Used to check the state and get back the results of toolpath generation. +class GenerateToolpathFuture : public core::Base { +public: + + /// Returns a number of operations need to be generated. + int numberOfOperations() const; + + /// Returns a number of operations whose toolpath generation are completed. + int numberOfCompleted() const; + + /// Returns all operations that need to be generated. + core::Ptr operations() const; + + /// Returns true if all operations are generated. + bool isGenerationCompleted() const; + + ADSK_CAM_GENERATETOOLPATHFUTURE_API static const char* classType(); + ADSK_CAM_GENERATETOOLPATHFUTURE_API const char* objectType() const override; + ADSK_CAM_GENERATETOOLPATHFUTURE_API void* queryInterface(const char* id) const override; + ADSK_CAM_GENERATETOOLPATHFUTURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual int numberOfOperations_raw() const = 0; + virtual int numberOfCompleted_raw() const = 0; + virtual Operations* operations_raw() const = 0; + virtual bool isGenerationCompleted_raw() const = 0; +}; + +// Inline wrappers + +inline int GenerateToolpathFuture::numberOfOperations() const +{ + int res = numberOfOperations_raw(); + return res; +} + +inline int GenerateToolpathFuture::numberOfCompleted() const +{ + int res = numberOfCompleted_raw(); + return res; +} + +inline core::Ptr GenerateToolpathFuture::operations() const +{ + core::Ptr res = operations_raw(); + return res; +} + +inline bool GenerateToolpathFuture::isGenerationCompleted() const +{ + bool res = isGenerationCompleted_raw(); + return res; +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_GENERATETOOLPATHFUTURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/CAM/MachiningTime.h b/usr/autodesk/CPP/include/CAM/CAM/MachiningTime.h new file mode 100644 index 0000000..a3e194a --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/CAM/MachiningTime.h @@ -0,0 +1,120 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_MACHININGTIME_CPP__ +# define ADSK_CAM_MACHININGTIME_API XI_EXPORT +# else +# define ADSK_CAM_MACHININGTIME_API +# endif +#else +# define ADSK_CAM_MACHININGTIME_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + +/// Object returned when using the getMachiningTime method from the CAM class. +/// Use the properties on this object to get the machining time results. +class MachiningTime : public core::Base { +public: + + /// Gets the feed distance in centimeters. + double feedDistance() const; + + /// Get the total feed time in seconds. + double totalFeedTime() const; + + /// Gets the calculated rapid distance in centimeters. + double rapidDistance() const; + + /// Gets the total rapid feed time in seconds. + double totalRapidTime() const; + + /// Gets the number of tool changes. + int toolChangeCount() const; + + /// Gets the total tool change time in seconds. + double totalToolChangeTime() const; + + /// Gets the machining time in seconds. + double machiningTime() const; + + ADSK_CAM_MACHININGTIME_API static const char* classType(); + ADSK_CAM_MACHININGTIME_API const char* objectType() const override; + ADSK_CAM_MACHININGTIME_API void* queryInterface(const char* id) const override; + ADSK_CAM_MACHININGTIME_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual double feedDistance_raw() const = 0; + virtual double totalFeedTime_raw() const = 0; + virtual double rapidDistance_raw() const = 0; + virtual double totalRapidTime_raw() const = 0; + virtual int toolChangeCount_raw() const = 0; + virtual double totalToolChangeTime_raw() const = 0; + virtual double machiningTime_raw() const = 0; +}; + +// Inline wrappers + +inline double MachiningTime::feedDistance() const +{ + double res = feedDistance_raw(); + return res; +} + +inline double MachiningTime::totalFeedTime() const +{ + double res = totalFeedTime_raw(); + return res; +} + +inline double MachiningTime::rapidDistance() const +{ + double res = rapidDistance_raw(); + return res; +} + +inline double MachiningTime::totalRapidTime() const +{ + double res = totalRapidTime_raw(); + return res; +} + +inline int MachiningTime::toolChangeCount() const +{ + int res = toolChangeCount_raw(); + return res; +} + +inline double MachiningTime::totalToolChangeTime() const +{ + double res = totalToolChangeTime_raw(); + return res; +} + +inline double MachiningTime::machiningTime() const +{ + double res = machiningTime_raw(); + return res; +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_MACHININGTIME_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/CAM/PostProcessInput.h b/usr/autodesk/CPP/include/CAM/CAM/PostProcessInput.h new file mode 100644 index 0000000..3a47b36 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/CAM/PostProcessInput.h @@ -0,0 +1,272 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_POSTPROCESSINPUT_CPP__ +# define ADSK_CAM_POSTPROCESSINPUT_API XI_EXPORT +# else +# define ADSK_CAM_POSTPROCESSINPUT_API +# endif +#else +# define ADSK_CAM_POSTPROCESSINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class Machine; +}} +namespace adsk { namespace core { + class NamedValues; +}} + +namespace adsk { namespace cam { + +/// This class defines the properties that pertain to the settings and options required for posting a +/// toolpath to generate a CNC file. A PostProcessInput object is a required parameter for the +/// postProcessAll() and postProcess() methods on the CAM class. +class PostProcessInput : public core::Base { +public: + + /// Creates a new PostProcessInput object to be used as an input argument by the postProcess() and postProcessAll() + /// methods on the CAM class for posting toolpaths and generating CNC files. + /// programName : The program name or number. + /// If the post configuration specifies the parameter programNameIsInteger = true, then the program name must be a number. + /// postConfiguration : The full filename (including the path) to the post configuration file (.cps) + /// The post config file can be stored in any path but for convenience you can use the genericPostFolder or the personalPostFolder property on the CAM class to specify + /// the path if your .cps file is stored in either of those locations. You must add a forward slash (this works for Mac or Windows) to the path defined by these folder + /// properties before the filename (e.g. postConfiguration = cam.genericPostFolder + '/' + 'fanuc.cps') + /// outputFolder : The path for the existing output folder where the .cnc files will be located. This method will create the specified output folder if it does not already exist. + /// It is not necessary to add a slash to the end of the outputFolder path. You should use forward slashes in your path definition if you want your script to run on both Mac and Windows. + /// outputUnits : The units option for the cnc output. + /// Valid options are DocumentUnitsOutput, InchesOutput or MillimetersOutput + /// Returns the newly created PostProcessInput object or null if the creation failed. + static core::Ptr create(const std::string& programName, const std::string& postConfiguration, const std::string& outputFolder, PostOutputUnitOptions outputUnits); + + /// Gets and sets the program name or number. + /// If the post configuration specifies the parameter programNameIsInteger = true, then the program name must be a number. + std::string programName() const; + bool programName(const std::string& value); + + /// Gets and sets the program comment. The default value for this property is an empty string (""). + std::string programComment() const; + bool programComment(const std::string& value); + + /// Gets and sets the full filename (including the path) for the post configuration file (.cps) + std::string postConfiguration() const; + bool postConfiguration(const std::string& value); + + /// Gets and sets the path for the output folder where the .cnc files will be located. + std::string outputFolder() const; + bool outputFolder(const std::string& value); + + /// Gets and sets the units option for the cnc output. + /// Valid options are DocumentUnitsOutput, InchesOutput or MillimetersOutput + PostOutputUnitOptions outputUnits() const; + bool outputUnits(PostOutputUnitOptions value); + + /// Gets and sets the option if opening the cnc file with the editor after it is created. + /// The default value for this property is true. + bool isOpenInEditor() const; + bool isOpenInEditor(bool value); + + /// Gets and sets that operations may be reordered between setups to minimize the number of tool changes. + /// Operations within each setup will still be executed in the programmed order. + /// This is commonly used for tombstone machining where you have multiple setups. + /// The default value for this property is false. + bool areToolChangesMinimized() const; + bool areToolChangesMinimized(bool value); + + /// Gets and sets the list of post properties. + /// Each property has a string name and a ValueInput object. + /// The default value for this is an empty NamedValues. + core::Ptr postProperties() const; + bool postProperties(const core::Ptr& value); + + /// Gets and sets the machine used for post processing. + /// It will override the machines associated with the operations or setup when posting. + /// The default value for this property is null. + core::Ptr machine() const; + bool machine(const core::Ptr& value); + + ADSK_CAM_POSTPROCESSINPUT_API static const char* classType(); + ADSK_CAM_POSTPROCESSINPUT_API const char* objectType() const override; + ADSK_CAM_POSTPROCESSINPUT_API void* queryInterface(const char* id) const override; + ADSK_CAM_POSTPROCESSINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_CAM_POSTPROCESSINPUT_API static PostProcessInput* create_raw(const char * programName, const char * postConfiguration, const char * outputFolder, PostOutputUnitOptions outputUnits); + virtual char* programName_raw() const = 0; + virtual bool programName_raw(const char * value) = 0; + virtual char* programComment_raw() const = 0; + virtual bool programComment_raw(const char * value) = 0; + virtual char* postConfiguration_raw() const = 0; + virtual bool postConfiguration_raw(const char * value) = 0; + virtual char* outputFolder_raw() const = 0; + virtual bool outputFolder_raw(const char * value) = 0; + virtual PostOutputUnitOptions outputUnits_raw() const = 0; + virtual bool outputUnits_raw(PostOutputUnitOptions value) = 0; + virtual bool isOpenInEditor_raw() const = 0; + virtual bool isOpenInEditor_raw(bool value) = 0; + virtual bool areToolChangesMinimized_raw() const = 0; + virtual bool areToolChangesMinimized_raw(bool value) = 0; + virtual core::NamedValues* postProperties_raw() const = 0; + virtual bool postProperties_raw(core::NamedValues* value) = 0; + virtual Machine* machine_raw() const = 0; + virtual bool machine_raw(Machine* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr PostProcessInput::create(const std::string& programName, const std::string& postConfiguration, const std::string& outputFolder, PostOutputUnitOptions outputUnits) +{ + core::Ptr res = create_raw(programName.c_str(), postConfiguration.c_str(), outputFolder.c_str(), outputUnits); + return res; +} + +inline std::string PostProcessInput::programName() const +{ + std::string res; + + char* p= programName_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool PostProcessInput::programName(const std::string& value) +{ + return programName_raw(value.c_str()); +} + +inline std::string PostProcessInput::programComment() const +{ + std::string res; + + char* p= programComment_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool PostProcessInput::programComment(const std::string& value) +{ + return programComment_raw(value.c_str()); +} + +inline std::string PostProcessInput::postConfiguration() const +{ + std::string res; + + char* p= postConfiguration_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool PostProcessInput::postConfiguration(const std::string& value) +{ + return postConfiguration_raw(value.c_str()); +} + +inline std::string PostProcessInput::outputFolder() const +{ + std::string res; + + char* p= outputFolder_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool PostProcessInput::outputFolder(const std::string& value) +{ + return outputFolder_raw(value.c_str()); +} + +inline PostOutputUnitOptions PostProcessInput::outputUnits() const +{ + PostOutputUnitOptions res = outputUnits_raw(); + return res; +} + +inline bool PostProcessInput::outputUnits(PostOutputUnitOptions value) +{ + return outputUnits_raw(value); +} + +inline bool PostProcessInput::isOpenInEditor() const +{ + bool res = isOpenInEditor_raw(); + return res; +} + +inline bool PostProcessInput::isOpenInEditor(bool value) +{ + return isOpenInEditor_raw(value); +} + +inline bool PostProcessInput::areToolChangesMinimized() const +{ + bool res = areToolChangesMinimized_raw(); + return res; +} + +inline bool PostProcessInput::areToolChangesMinimized(bool value) +{ + return areToolChangesMinimized_raw(value); +} + +inline core::Ptr PostProcessInput::postProperties() const +{ + core::Ptr res = postProperties_raw(); + return res; +} + +inline bool PostProcessInput::postProperties(const core::Ptr& value) +{ + return postProperties_raw(value.get()); +} + +inline core::Ptr PostProcessInput::machine() const +{ + core::Ptr res = machine_raw(); + return res; +} + +inline bool PostProcessInput::machine(const core::Ptr& value) +{ + return machine_raw(value.get()); +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_POSTPROCESSINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/CAM/Setup.h b/usr/autodesk/CPP/include/CAM/CAM/Setup.h new file mode 100644 index 0000000..7e28944 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/CAM/Setup.h @@ -0,0 +1,197 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../CAMTypeDefs.h" +#include "../Operations/OperationBase.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_SETUP_CPP__ +# define ADSK_CAM_SETUP_API XI_EXPORT +# else +# define ADSK_CAM_SETUP_API +# endif +#else +# define ADSK_CAM_SETUP_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class CAMFolders; + class CAMPatterns; + class ChildOperationList; + class Machine; + class Operations; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace cam { + +/// Object that represents an existing Setup. +class Setup : public OperationBase { +public: + + /// Gets the Operation Type. + /// It can be MillingOperation, TurningOperation, JetOperation or AdditiveOperation. + OperationTypes operationType() const; + + /// Gets if this setup is active. + bool isActive() const; + + /// Returns the Operations collection that provides access to existing operations + /// in this setup. + core::Ptr operations() const; + + /// Returns the Folders collection that provides access to existing folders + /// in this setup. + core::Ptr folders() const; + + /// Returns the Patterns collection that provides access to existing patterns + /// in this setup. + core::Ptr patterns() const; + + /// Returns a collection containing all of the immediate (top level) child operations, folders and patterns in this setup + /// in the order they appear in the browser. + core::Ptr children() const; + + /// Gets a collection containing all of the operations in this setup. + /// This includes all operations nested in folders and patterns. + core::Ptr allOperations() const; + + /// Gets and sets the bodies associated with the setup. Passing in an empty ObjectCollection + /// will remove all current bodies. Valid input is MeshBody and/or BRepBody objects. + core::Ptr models() const; + bool models(const core::Ptr& value); + + /// Gets the fixtures associated with the setup. + core::Ptr fixtures() const; + + /// Gets the stock solids associated with the setup. + core::Ptr stockSolids() const; + + /// Gets the Machine associated with the setup. + core::Ptr machine() const; + + /// Create and add operations, folders or patterns from the specified template file to the end of this setup. + /// templateFilePath : The full path to the template file. + /// Returns the collection containing all of the operations, folders and patterns created from the template file. + core::Ptr createFromTemplate(const std::string& templateFilePath); + + ADSK_CAM_SETUP_API static const char* classType(); + ADSK_CAM_SETUP_API const char* objectType() const override; + ADSK_CAM_SETUP_API void* queryInterface(const char* id) const override; + ADSK_CAM_SETUP_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual OperationTypes operationType_raw() const = 0; + virtual bool isActive_raw() const = 0; + virtual Operations* operations_raw() const = 0; + virtual CAMFolders* folders_raw() const = 0; + virtual CAMPatterns* patterns_raw() const = 0; + virtual ChildOperationList* children_raw() const = 0; + virtual core::ObjectCollection* allOperations_raw() const = 0; + virtual core::ObjectCollection* models_raw() const = 0; + virtual bool models_raw(core::ObjectCollection* value) = 0; + virtual core::ObjectCollection* fixtures_raw() const = 0; + virtual core::ObjectCollection* stockSolids_raw() const = 0; + virtual Machine* machine_raw() const = 0; + virtual core::ObjectCollection* createFromTemplate_raw(const char * templateFilePath) = 0; +}; + +// Inline wrappers + +inline OperationTypes Setup::operationType() const +{ + OperationTypes res = operationType_raw(); + return res; +} + +inline bool Setup::isActive() const +{ + bool res = isActive_raw(); + return res; +} + +inline core::Ptr Setup::operations() const +{ + core::Ptr res = operations_raw(); + return res; +} + +inline core::Ptr Setup::folders() const +{ + core::Ptr res = folders_raw(); + return res; +} + +inline core::Ptr Setup::patterns() const +{ + core::Ptr res = patterns_raw(); + return res; +} + +inline core::Ptr Setup::children() const +{ + core::Ptr res = children_raw(); + return res; +} + +inline core::Ptr Setup::allOperations() const +{ + core::Ptr res = allOperations_raw(); + return res; +} + +inline core::Ptr Setup::models() const +{ + core::Ptr res = models_raw(); + return res; +} + +inline bool Setup::models(const core::Ptr& value) +{ + return models_raw(value.get()); +} + +inline core::Ptr Setup::fixtures() const +{ + core::Ptr res = fixtures_raw(); + return res; +} + +inline core::Ptr Setup::stockSolids() const +{ + core::Ptr res = stockSolids_raw(); + return res; +} + +inline core::Ptr Setup::machine() const +{ + core::Ptr res = machine_raw(); + return res; +} + +inline core::Ptr Setup::createFromTemplate(const std::string& templateFilePath) +{ + core::Ptr res = createFromTemplate_raw(templateFilePath.c_str()); + return res; +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_SETUP_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/CAM/SetupEvents.h b/usr/autodesk/CPP/include/CAM/CAM/SetupEvents.h new file mode 100644 index 0000000..7c43427 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/CAM/SetupEvents.h @@ -0,0 +1,226 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Application/Events.h" +#include "../../Core/Application/EventHandler.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_SETUPEVENTS_CPP__ +# define SETUPEVENTS_API XI_EXPORT +# else +# define SETUPEVENTS_API +# endif +#else +# define SETUPEVENTS_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class Setup; + class SetupChangeEvent; + class SetupChangeEventArgs; + class SetupChangeEventHandler; + class SetupEventArgs; + class SetupEventHandler; +}} + +namespace adsk { namespace cam { + +/// A SetupEvent represents a setup related event. For example, SetupCreated or SetupDestroying. +class SetupEvent : public core::Event { +public: + + /// Add a handler to be notified when the file event occurs. + /// handler : The handler object to be called when this event is fired. + /// Returns true if the addition of the handler was successful. + bool add(SetupEventHandler* handler); + + /// Removes a handler from the event. + /// handler : The handler object to be removed from the event. + /// Returns true if removal of the handler was successful. + bool remove(SetupEventHandler* handler); + + SETUPEVENTS_API static const char* classType(); + SETUPEVENTS_API const char* objectType() const override; + SETUPEVENTS_API void* queryInterface(const char* id) const override; + SETUPEVENTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool add_raw(SetupEventHandler* handler) = 0; + virtual bool remove_raw(SetupEventHandler* handler) = 0; +}; + +// Inline wrappers + +inline bool SetupEvent::add(SetupEventHandler* handler) +{ + bool res = add_raw(handler); + return res; +} + +inline bool SetupEvent::remove(SetupEventHandler* handler) +{ + bool res = remove_raw(handler); + return res; +} + +/// A SetupChangeEvent represents a setup related change event. It is used for SetupChanged notifications. +class SetupChangeEvent : public core::Event { +public: + + /// Add a handler to be notified when the file event occurs. + /// handler : The handler object to be called when this event is fired. + /// Returns true if the addition of the handler was successful. + bool add(SetupChangeEventHandler* handler); + + /// Removes a handler from the event. + /// handler : The handler object to be removed from the event. + /// Returns true if removal of the handler was successful. + bool remove(SetupChangeEventHandler* handler); + + SETUPEVENTS_API static const char* classType(); + SETUPEVENTS_API const char* objectType() const override; + SETUPEVENTS_API void* queryInterface(const char* id) const override; + SETUPEVENTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool add_raw(SetupChangeEventHandler* handler) = 0; + virtual bool remove_raw(SetupChangeEventHandler* handler) = 0; +}; + +// Inline wrappers + +inline bool SetupChangeEvent::add(SetupChangeEventHandler* handler) +{ + bool res = add_raw(handler); + return res; +} + +inline bool SetupChangeEvent::remove(SetupChangeEventHandler* handler) +{ + bool res = remove_raw(handler); + return res; +} + +/// The SetupEventHandler is a client implemented class that can be added as a handler to a +/// SetupEvent. +class SetupEventHandler : public core::EventHandler { +public: + + /// The function called by CAM when the associated event is fired. + /// eventArgs : Returns an object that provides access to additional information associated with the event. + SETUPEVENTS_API virtual void notify(const core::Ptr& eventArgs) = 0; +}; + +/// The SetupChangeEventHandler is a client implemented class that can be added as a handler to a +/// SetupChangeEvent. +class SetupChangeEventHandler : public core::EventHandler { +public: + + /// The function called by CAM when the associated event is fired. + /// eventArgs : Returns an object that provides access to additional information associated with the event. + SETUPEVENTS_API virtual void notify(const core::Ptr& eventArgs) = 0; +}; + +/// The SetupEventArgs provides information associated with a setup event. +class SetupEventArgs : public core::EventArgs { +public: + + /// Provides access to the setup. Can be null in the case + /// where the event is fired before the setup has been created or after it has been deleted. + core::Ptr setup() const; + + SETUPEVENTS_API static const char* classType(); + SETUPEVENTS_API const char* objectType() const override; + SETUPEVENTS_API void* queryInterface(const char* id) const override; + SETUPEVENTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Setup* setup_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SetupEventArgs::setup() const +{ + core::Ptr res = setup_raw(); + return res; +} + +/// The SetupChangeEventArgs provides information associated with a change event of a setup. +class SetupChangeEventArgs : public core::EventArgs { +public: + + /// Provides access to the setup. Can be null in the case + /// where the event is fired before the setup has been created or after it has been deleted. + core::Ptr setup() const; + + /// Provides access to an information string. + /// The optional string may contain additional information about the change. + std::string info() const; + + /// The type specifies the actual change. + SetupChangeEventType type() const; + + SETUPEVENTS_API static const char* classType(); + SETUPEVENTS_API const char* objectType() const override; + SETUPEVENTS_API void* queryInterface(const char* id) const override; + SETUPEVENTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Setup* setup_raw() const = 0; + virtual char* info_raw() const = 0; + virtual SetupChangeEventType type_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SetupChangeEventArgs::setup() const +{ + core::Ptr res = setup_raw(); + return res; +} + +inline std::string SetupChangeEventArgs::info() const +{ + std::string res; + + char* p= info_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline SetupChangeEventType SetupChangeEventArgs::type() const +{ + SetupChangeEventType res = type_raw(); + return res; +} +}// namespace cam +}// namespace adsk + +#undef SETUPEVENTS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/CAM/Setups.h b/usr/autodesk/CPP/include/CAM/CAM/Setups.h new file mode 100644 index 0000000..b721d26 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/CAM/Setups.h @@ -0,0 +1,112 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_SETUPS_CPP__ +# define ADSK_CAM_SETUPS_API XI_EXPORT +# else +# define ADSK_CAM_SETUPS_API +# endif +#else +# define ADSK_CAM_SETUPS_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class Setup; +}} + +namespace adsk { namespace cam { + +/// Collection that provides access to all of the existing setups in a document. +class Setups : public core::Base { +public: + + /// Function that returns the specified setup using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the setup with the specified name. + /// name : The name (as it appears in the browser) of the operation. + /// Returns the specified setup or null in the case where there is no setup with the specified name. + core::Ptr itemByName(const std::string& name) const; + + /// The number of setups in the collection. + size_t count() const; + + /// Returns the setup with the specified operation id. + /// id : The id of the operation. + /// Returns the specified setup or null in the case where there is no setup with the specified operation id. + core::Ptr itemByOperationId(int id) const; + + typedef Setup iterable_type; + template void copyTo(OutputIterator result); + + ADSK_CAM_SETUPS_API static const char* classType(); + ADSK_CAM_SETUPS_API const char* objectType() const override; + ADSK_CAM_SETUPS_API void* queryInterface(const char* id) const override; + ADSK_CAM_SETUPS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Setup* item_raw(size_t index) const = 0; + virtual Setup* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual Setup* itemByOperationId_raw(int id) const = 0; +}; + +// Inline wrappers + +inline core::Ptr Setups::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr Setups::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t Setups::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr Setups::itemByOperationId(int id) const +{ + core::Ptr res = itemByOperationId_raw(id); + return res; +} + +template inline void Setups::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_SETUPS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/CAMAll.h b/usr/autodesk/CPP/include/CAM/CAMAll.h new file mode 100644 index 0000000..ce729bc --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/CAMAll.h @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/usr/autodesk/CPP/include/CAM/CAMTypeDefs.h b/usr/autodesk/CPP/include/CAM/CAMTypeDefs.h new file mode 100644 index 0000000..def8f18 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/CAMTypeDefs.h @@ -0,0 +1,138 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once + +namespace adsk { namespace cam { + +/// List of the formats to choose from when generating setup sheets +enum SetupSheetFormats +{ + HTMLFormat, + ExcelFormat +}; + +/// The valid options for the Operation Type of a Setup. +enum OperationTypes +{ + MillingOperation, + TurningOperation, + JetOperation, + AdditiveOperation +}; + +/// List of locations representing folders in the library dialogs. +enum LibraryLocation +{ + Local, + Cloud, + Network, + OnlineSamples, + External +}; + +/// List of the valid options for the outputUnit property on a PostProcessInput object . +enum PostOutputUnitOptions +{ + DocumentUnitsOutput, + InchesOutput, + MillimetersOutput +}; + +/// List of setup change event types. +enum SetupChangeEventType +{ + Arbitrary, + PrintSettingSelection +}; + +/// List of the machine templates to create a machine from. +enum MachineTemplate +{ + GenericLathe, + Generic3Axis, + Generic4Axis, + Generic5AxisHeadHead, + Generic5AxisHeadTable, + Generic5AxisTableTable +}; + +/// List of part types for MachinePart +enum MachinePartTypes +{ + BasicMachinePartType, + AxisMachinePartType, + ToolAttachmentMachinePartType, + FixtureAttachmentMachinePartType +}; + +/// List of machine axis types for MachineAxis +enum MachineAxisTypes +{ + LinearMachineAxisType, + RotaryMachineAxisType +}; + +/// The valid options for the Strategy Type of an operation. +enum OperationStrategyTypes +{ + AdaptiveClearing2D, + Pocket2D, + Face, + Contour2D, + Slot, + Trace, + Thread, + Bore, + Circular, + Engrave, + AdaptiveClearing, + PocketClearing, + Parallel, + Contour, + Ramp, + Horizontal, + Pencil, + Scallop, + Spiral, + Radial, + MorphedSpiral, + Projection, + Drilling, + Jet2D, + TurningChamfer, + TurningFace, + TurningGroove, + TurningPart, + TurningProfile, + TurningProfileGroove, + TurningStockTransfer, + TurningThread, + SteepAndShallow, + Flow, + RotaryFinishing, + Chamfer2D, + Morph, + MultiAxisContour, + MultiAxisMorph, + RestFinishing, + Swarf +}; + +/// The possible states of an operation +enum OperationStates +{ + IsValidOperationState, + IsInvalidOperationState, + SuppressedOperationState, + NoToolpathOperationState +}; +}// namespace cam +}// namespace adsk diff --git a/usr/autodesk/CPP/include/CAM/Global/CAMLibraryManager.h b/usr/autodesk/CPP/include/CAM/Global/CAMLibraryManager.h new file mode 100644 index 0000000..42801e1 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Global/CAMLibraryManager.h @@ -0,0 +1,141 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_CAMLIBRARYMANAGER_CPP__ +# define ADSK_CAM_CAMLIBRARYMANAGER_API XI_EXPORT +# else +# define ADSK_CAM_CAMLIBRARYMANAGER_API +# endif +#else +# define ADSK_CAM_CAMLIBRARYMANAGER_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + +/// CAMLibraryManager provides access to properties related to various libraries in the +/// Fusion 360 Manufacture workspace, such as the post library and machine library. +class CAMLibraryManager : public core::Base { +public: + + /// Gets the absolute path to the folder containing Fusion 360 posts. Fusion 360 posts + /// appear in the post library under the Fusion 360 tab. + std::string fusion360PostFolder() const; + + /// Gets the absolute path to the folder containing local posts. Local posts appear + /// in post library under the local tab. + std::string localPostFolder() const; + + /// Gets the absolute path to the folder containing Fusion 360 machines. Fusion 360 + /// machines appear in the machine library under the Fusion 360 tab. + std::string fusion360MachineFolder() const; + + /// Gets the absolute path to the folder containing local machines. Local Machines appear + /// in machine library under the local tab. + std::string localMachineFolder() const; + + /// Gets the absolute path to the folder containing network machines. Network machines + /// appear in the machine library under the network tab. + std::string networkMachineFolder() const; + + ADSK_CAM_CAMLIBRARYMANAGER_API static const char* classType(); + ADSK_CAM_CAMLIBRARYMANAGER_API const char* objectType() const override; + ADSK_CAM_CAMLIBRARYMANAGER_API void* queryInterface(const char* id) const override; + ADSK_CAM_CAMLIBRARYMANAGER_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* fusion360PostFolder_raw() const = 0; + virtual char* localPostFolder_raw() const = 0; + virtual char* fusion360MachineFolder_raw() const = 0; + virtual char* localMachineFolder_raw() const = 0; + virtual char* networkMachineFolder_raw() const = 0; +}; + +// Inline wrappers + +inline std::string CAMLibraryManager::fusion360PostFolder() const +{ + std::string res; + + char* p= fusion360PostFolder_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string CAMLibraryManager::localPostFolder() const +{ + std::string res; + + char* p= localPostFolder_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string CAMLibraryManager::fusion360MachineFolder() const +{ + std::string res; + + char* p= fusion360MachineFolder_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string CAMLibraryManager::localMachineFolder() const +{ + std::string res; + + char* p= localMachineFolder_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string CAMLibraryManager::networkMachineFolder() const +{ + std::string res; + + char* p= networkMachineFolder_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_CAMLIBRARYMANAGER_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Global/CAMManager.h b/usr/autodesk/CPP/include/CAM/Global/CAMManager.h new file mode 100644 index 0000000..8a34093 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Global/CAMManager.h @@ -0,0 +1,109 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_CAMMANAGER_CPP__ +# define ADSK_CAM_CAMMANAGER_API XI_EXPORT +# else +# define ADSK_CAM_CAMMANAGER_API +# endif +#else +# define ADSK_CAM_CAMMANAGER_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class CAMLibraryManager; + class NetworkMachineIntegrationManager; +}} + +namespace adsk { namespace cam { + +/// This singleton object provides access to application-level events and properties +/// that relate to the CAM (Manufacture) workspace in Fusion 360. +class CAMManager : public core::Base { +public: + + /// Access to the root CAMManager object. + /// Return the root CAMManager object or null if it failed. + static core::Ptr get(); + + /// CAMLibraryManager provides access to properties related to various libraries in the + /// Fusion 360 Manufacture workspace, such as the post library and machine library. + /// Return a CAMLibraryManager object or null if it failed. + core::Ptr libraryManager() const; + + /// Gets the absolute path to the post engine (post.exe) installed with Fusion 360. + std::string postEnginePath() const; + + /// NetworkMachineIntegrationManager provides access to properties and events needed to + /// integrate addins into the 'Find network machines' dialog, which enables users to add + /// machine configurations representing machines on the network to their machine library. + /// Return a NetworkMachineIntegrationManager object or null if it failed. + core::Ptr networkMachineIntegrationManager() const; + + ADSK_CAM_CAMMANAGER_API static const char* classType(); + ADSK_CAM_CAMMANAGER_API const char* objectType() const override; + ADSK_CAM_CAMMANAGER_API void* queryInterface(const char* id) const override; + ADSK_CAM_CAMMANAGER_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_CAM_CAMMANAGER_API static CAMManager* get_raw(); + virtual CAMLibraryManager* libraryManager_raw() const = 0; + virtual char* postEnginePath_raw() const = 0; + virtual NetworkMachineIntegrationManager* networkMachineIntegrationManager_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr CAMManager::get() +{ + core::Ptr res = get_raw(); + return res; +} + +inline core::Ptr CAMManager::libraryManager() const +{ + core::Ptr res = libraryManager_raw(); + return res; +} + +inline std::string CAMManager::postEnginePath() const +{ + std::string res; + + char* p= postEnginePath_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline core::Ptr CAMManager::networkMachineIntegrationManager() const +{ + core::Ptr res = networkMachineIntegrationManager_raw(); + return res; +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_CAMMANAGER_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Global/MachineDescription.h b/usr/autodesk/CPP/include/CAM/Global/MachineDescription.h new file mode 100644 index 0000000..0d8fb10 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Global/MachineDescription.h @@ -0,0 +1,225 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_MACHINEDESCRIPTION_CPP__ +# define ADSK_CAM_MACHINEDESCRIPTION_API XI_EXPORT +# else +# define ADSK_CAM_MACHINEDESCRIPTION_API +# endif +#else +# define ADSK_CAM_MACHINEDESCRIPTION_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + +/// A description of a machine used to preview machines in the 'Find network machines' dialog +class MachineDescription : public core::Base { +public: + + /// Creates a new MachineDescription. + /// vendor : The machine vendor. + /// model : The machine model. + /// ipAddress : The machine's ipv4 ip address. + /// Returns the newly created MachineDescription object, and allocates a unique id for the + /// object, or null if the creation failed. + static core::Ptr create(const std::string& vendor, const std::string& model, const std::string& ipAddress); + + /// Gets this MachineDescription's unique id. This id can be used to match + /// MachineDescription objects provided during the SearchNetworkMachinesEvent with those + /// requested to create machine configurations for during the CreateMachineConfigurations + /// event. + size_t id() const; + + /// Gets and sets the vendor name of the machine. + std::string vendor() const; + bool vendor(const std::string& value); + + /// Gets and sets the model name of the machine. + std::string model() const; + bool model(const std::string& value); + + /// Gets and sets the ip address of the machine. + std::string ipAddress() const; + bool ipAddress(const std::string& value); + + /// Gets and sets the controller name of the machine. Controller info is not displayed if + /// not set. + std::string control() const; + bool control(const std::string& value); + + /// Gets and sets the absolute path to the 128x128 png image of the machine. A default + /// image is used if not set. + std::string iconPath() const; + bool iconPath(const std::string& value); + + /// Gets and sets the serial number of the machine. A serial number is not displayed if not + /// set. + std::string serial() const; + bool serial(const std::string& value); + + ADSK_CAM_MACHINEDESCRIPTION_API static const char* classType(); + ADSK_CAM_MACHINEDESCRIPTION_API const char* objectType() const override; + ADSK_CAM_MACHINEDESCRIPTION_API void* queryInterface(const char* id) const override; + ADSK_CAM_MACHINEDESCRIPTION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_CAM_MACHINEDESCRIPTION_API static MachineDescription* create_raw(const char * vendor, const char * model, const char * ipAddress); + virtual size_t id_raw() const = 0; + virtual char* vendor_raw() const = 0; + virtual bool vendor_raw(const char * value) = 0; + virtual char* model_raw() const = 0; + virtual bool model_raw(const char * value) = 0; + virtual char* ipAddress_raw() const = 0; + virtual bool ipAddress_raw(const char * value) = 0; + virtual char* control_raw() const = 0; + virtual bool control_raw(const char * value) = 0; + virtual char* iconPath_raw() const = 0; + virtual bool iconPath_raw(const char * value) = 0; + virtual char* serial_raw() const = 0; + virtual bool serial_raw(const char * value) = 0; +}; + +// Inline wrappers + +inline core::Ptr MachineDescription::create(const std::string& vendor, const std::string& model, const std::string& ipAddress) +{ + core::Ptr res = create_raw(vendor.c_str(), model.c_str(), ipAddress.c_str()); + return res; +} + +inline size_t MachineDescription::id() const +{ + size_t res = id_raw(); + return res; +} + +inline std::string MachineDescription::vendor() const +{ + std::string res; + + char* p= vendor_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool MachineDescription::vendor(const std::string& value) +{ + return vendor_raw(value.c_str()); +} + +inline std::string MachineDescription::model() const +{ + std::string res; + + char* p= model_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool MachineDescription::model(const std::string& value) +{ + return model_raw(value.c_str()); +} + +inline std::string MachineDescription::ipAddress() const +{ + std::string res; + + char* p= ipAddress_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool MachineDescription::ipAddress(const std::string& value) +{ + return ipAddress_raw(value.c_str()); +} + +inline std::string MachineDescription::control() const +{ + std::string res; + + char* p= control_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool MachineDescription::control(const std::string& value) +{ + return control_raw(value.c_str()); +} + +inline std::string MachineDescription::iconPath() const +{ + std::string res; + + char* p= iconPath_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool MachineDescription::iconPath(const std::string& value) +{ + return iconPath_raw(value.c_str()); +} + +inline std::string MachineDescription::serial() const +{ + std::string res; + + char* p= serial_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool MachineDescription::serial(const std::string& value) +{ + return serial_raw(value.c_str()); +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_MACHINEDESCRIPTION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Global/NetworkMachineEvents.h b/usr/autodesk/CPP/include/CAM/Global/NetworkMachineEvents.h new file mode 100644 index 0000000..873a03c --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Global/NetworkMachineEvents.h @@ -0,0 +1,278 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Application/Events.h" +#include "../../Core/Application/EventHandler.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_NETWORKMACHINEEVENTS_CPP__ +# define NETWORKMACHINEEVENTS_API XI_EXPORT +# else +# define NETWORKMACHINEEVENTS_API +# endif +#else +# define NETWORKMACHINEEVENTS_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class CreateMachineConfigurationsEvent; + class CreateMachineConfigurationsEventArgs; + class CreateMachineConfigurationsEventHandler; + class Machine; + class MachineDescription; + class SearchNetworkMachinesEventArgs; + class SearchNetworkMachinesEventHandler; +}} + +namespace adsk { namespace cam { + +/// This event is fired from the 'Find network machines' dialog when the corresponding +/// addin is selected from the vendor dropdown, or when 'search all vendors' is +/// selected. This event will allow the addin to initiate an enumeration of machines on +/// the network. MachineDescription objects should be created for each machine found, and +/// an list of those MachineDescription objects should be set on the 'machineDescriptions' +/// property of the SearchNetworkMachinesEventArgs. Nothing should be set to signify no +/// machines found. See SearchNetworkMachinesEventArgs and MachineDescription for details. +/// Note that this event is raised on a background thread. +class SearchNetworkMachinesEvent : public core::Event { +public: + + /// Add a handler to be notified when the SearchNetworkMachinesEvent occurs. + /// handler : The handler object to be called when this event is fired. + /// Returns true if the addition of the handler was successful. + bool add(SearchNetworkMachinesEventHandler* handler); + + /// Removes a handler from the SearchNetworkMachinesEvent. + /// handler : The handler object to be removed from the event. + /// Returns true if removal of the handler was successful. + bool remove(SearchNetworkMachinesEventHandler* handler); + + NETWORKMACHINEEVENTS_API static const char* classType(); + NETWORKMACHINEEVENTS_API const char* objectType() const override; + NETWORKMACHINEEVENTS_API void* queryInterface(const char* id) const override; + NETWORKMACHINEEVENTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool add_raw(SearchNetworkMachinesEventHandler* handler) = 0; + virtual bool remove_raw(SearchNetworkMachinesEventHandler* handler) = 0; +}; + +// Inline wrappers + +inline bool SearchNetworkMachinesEvent::add(SearchNetworkMachinesEventHandler* handler) +{ + bool res = add_raw(handler); + return res; +} + +inline bool SearchNetworkMachinesEvent::remove(SearchNetworkMachinesEventHandler* handler) +{ + bool res = remove_raw(handler); + return res; +} + +/// This event is fired from the 'Find network machines' dialog when MachineDescription(s) +/// previously provided during the handling of the SearchNetworkMachines event are selected +/// to add to the user's Machine Library. This event will allow the addins to create +/// machine configurations corresponding to the selected MachineDescription objects. +/// Handlers of this event should create machine configurations corresponding to each +/// MachineDescription present in the 'machineDescriptions' property in the +/// CreateMachineConfigurationsEventArgs and set them on the 'machines' property of the +/// event args. See CreateMachineConfigurationsEventArgs for details. Note that this event is +/// raised on a background thread. +class CreateMachineConfigurationsEvent : public core::Event { +public: + + /// Add a handler to be notified when the CreateMachineConfigurationsEvent occurs. + /// handler : The handler object to be called when this event is fired. + /// Returns true if the addition of the handler was successful. + bool add(CreateMachineConfigurationsEventHandler* handler); + + /// Removes a handler from the CreateMachineConfigurationsEvent. + /// handler : The handler object to be removed from the event. + /// Returns true if removal of the handler was successful. + bool remove(CreateMachineConfigurationsEventHandler* handler); + + NETWORKMACHINEEVENTS_API static const char* classType(); + NETWORKMACHINEEVENTS_API const char* objectType() const override; + NETWORKMACHINEEVENTS_API void* queryInterface(const char* id) const override; + NETWORKMACHINEEVENTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool add_raw(CreateMachineConfigurationsEventHandler* handler) = 0; + virtual bool remove_raw(CreateMachineConfigurationsEventHandler* handler) = 0; +}; + +// Inline wrappers + +inline bool CreateMachineConfigurationsEvent::add(CreateMachineConfigurationsEventHandler* handler) +{ + bool res = add_raw(handler); + return res; +} + +inline bool CreateMachineConfigurationsEvent::remove(CreateMachineConfigurationsEventHandler* handler) +{ + bool res = remove_raw(handler); + return res; +} + +/// Event handler for the SearchNetworkMachinesEvent event. +class SearchNetworkMachinesEventHandler : public core::EventHandler { +public: + + /// The function called by Fusion 360 when the associated event is fired. + /// eventArgs : An object that provides access to additional information associated with the event. + NETWORKMACHINEEVENTS_API virtual void notify(const core::Ptr& eventArgs) = 0; +}; + +/// This EventArgs object will be sent with the SearchNetworkMachinesEvent. +class SearchNetworkMachinesEventArgs : public core::EventArgs { +public: + + /// Gets and sets a list of MachineDescription objects representing machines found on the + /// network. Do not set anything to signify no machine found. + std::vector> machineDescriptions() const; + bool machineDescriptions(const std::vector>& value); + + NETWORKMACHINEEVENTS_API static const char* classType(); + NETWORKMACHINEEVENTS_API const char* objectType() const override; + NETWORKMACHINEEVENTS_API void* queryInterface(const char* id) const override; + NETWORKMACHINEEVENTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual MachineDescription** machineDescriptions_raw(size_t& return_size) const = 0; + virtual bool machineDescriptions_raw(MachineDescription** value, size_t value_size) = 0; +}; + +// Inline wrappers + +inline std::vector> SearchNetworkMachinesEventArgs::machineDescriptions() const +{ + std::vector> res; + size_t s; + + MachineDescription** p= machineDescriptions_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool SearchNetworkMachinesEventArgs::machineDescriptions(const std::vector>& value) +{ + MachineDescription** value_ = new MachineDescription*[value.size()]; + for(size_t i=0; i& eventArgs) = 0; +}; + +/// This EventArgs object will be sent with the CreateMachineConfigurationsEvent. +class CreateMachineConfigurationsEventArgs : public core::EventArgs { +public: + + /// Gets the collection of MachineDescription objects for which machine configurations + /// must be created. These MachineDescription(s) will be a subset of those previously + /// provided by the addin's SearchNetworkMachinesEventHandler. + /// Returns a list of MachineDescription objects which is a subset of the list that was + /// previously set by this addin on the 'machineDescriptions' property of the + /// SearchNetworkMachinesEventArgs. + std::vector> machineDescriptions() const; + + /// Gets and sets the list of Machine objects. Machines should be created corresponding to + /// each of the MachineDescription objects provided in the machineDescriptions property. + /// Machines can be created using adsk.cam.Machine.createFromTemplate or + /// adsk.cam.Machine.createFromFile. + std::vector> machines() const; + bool machines(const std::vector>& value); + + NETWORKMACHINEEVENTS_API static const char* classType(); + NETWORKMACHINEEVENTS_API const char* objectType() const override; + NETWORKMACHINEEVENTS_API void* queryInterface(const char* id) const override; + NETWORKMACHINEEVENTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual MachineDescription** machineDescriptions_raw(size_t& return_size) const = 0; + virtual Machine** machines_raw(size_t& return_size) const = 0; + virtual bool machines_raw(Machine** value, size_t value_size) = 0; +}; + +// Inline wrappers + +inline std::vector> CreateMachineConfigurationsEventArgs::machineDescriptions() const +{ + std::vector> res; + size_t s; + + MachineDescription** p= machineDescriptions_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> CreateMachineConfigurationsEventArgs::machines() const +{ + std::vector> res; + size_t s; + + Machine** p= machines_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool CreateMachineConfigurationsEventArgs::machines(const std::vector>& value) +{ + Machine** value_ = new Machine*[value.size()]; + for(size_t i=0; i + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_NETWORKMACHINEINTEGRATIONINPUT_CPP__ +# define ADSK_CAM_NETWORKMACHINEINTEGRATIONINPUT_API XI_EXPORT +# else +# define ADSK_CAM_NETWORKMACHINEINTEGRATIONINPUT_API +# endif +#else +# define ADSK_CAM_NETWORKMACHINEINTEGRATIONINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + +/// An input object required to register an addin for use in the 'Find network machines' +/// dialog. This input object defines properties of an addin and allows an addin to +/// customize its appearence in the 'Find network machines' dialog. +class NetworkMachineIntegrationInput : public core::Base { +public: + + /// displayName : The name that will be presented to the user in the 'Find network machines' dialog. + /// description : A description of the addin which appears as a tooltip alongside the display name. + /// Returns true if the addin was successfully registered. + static core::Ptr create(const std::string& displayName, const std::string& description); + + /// Gets and sets the display name of the addin that appears in the 'vendor' dropdown in + /// the 'Find network machines' dialog. + std::string displayName() const; + bool displayName(const std::string& value); + + /// Gets and sets the description of the addin + std::string description() const; + bool description(const std::string& value); + + ADSK_CAM_NETWORKMACHINEINTEGRATIONINPUT_API static const char* classType(); + ADSK_CAM_NETWORKMACHINEINTEGRATIONINPUT_API const char* objectType() const override; + ADSK_CAM_NETWORKMACHINEINTEGRATIONINPUT_API void* queryInterface(const char* id) const override; + ADSK_CAM_NETWORKMACHINEINTEGRATIONINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_CAM_NETWORKMACHINEINTEGRATIONINPUT_API static NetworkMachineIntegrationInput* create_raw(const char * displayName, const char * description); + virtual char* displayName_raw() const = 0; + virtual bool displayName_raw(const char * value) = 0; + virtual char* description_raw() const = 0; + virtual bool description_raw(const char * value) = 0; +}; + +// Inline wrappers + +inline core::Ptr NetworkMachineIntegrationInput::create(const std::string& displayName, const std::string& description) +{ + core::Ptr res = create_raw(displayName.c_str(), description.c_str()); + return res; +} + +inline std::string NetworkMachineIntegrationInput::displayName() const +{ + std::string res; + + char* p= displayName_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool NetworkMachineIntegrationInput::displayName(const std::string& value) +{ + return displayName_raw(value.c_str()); +} + +inline std::string NetworkMachineIntegrationInput::description() const +{ + std::string res; + + char* p= description_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool NetworkMachineIntegrationInput::description(const std::string& value) +{ + return description_raw(value.c_str()); +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_NETWORKMACHINEINTEGRATIONINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Global/NetworkMachineIntegrationManager.h b/usr/autodesk/CPP/include/CAM/Global/NetworkMachineIntegrationManager.h new file mode 100644 index 0000000..cda6a0e --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Global/NetworkMachineIntegrationManager.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_NETWORKMACHINEINTEGRATIONMANAGER_CPP__ +# define ADSK_CAM_NETWORKMACHINEINTEGRATIONMANAGER_API XI_EXPORT +# else +# define ADSK_CAM_NETWORKMACHINEINTEGRATIONMANAGER_API +# endif +#else +# define ADSK_CAM_NETWORKMACHINEINTEGRATIONMANAGER_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class CreateMachineConfigurationsEvent; + class NetworkMachineIntegrationInput; + class SearchNetworkMachinesEvent; +}} + +namespace adsk { namespace cam { + +/// NetworkMachineManager provides access to properties and events needed to integrate +/// addins into the 'Find network machines' dialog, which enables users to add machine +/// configurations representing machines on the network to their machine library. +class NetworkMachineIntegrationManager : public core::Base { +public: + + /// Registers an addin for use in the 'Find network machines' dialog. This dialog will fire + /// the SearchNetworkMachinesEvent and CreateMachineConfigurationsEvent, which the addin + /// must handle. See SearchNetworkMachinesEvent and CreateMachineConfigurationsEvent for + /// details. + /// networkMachineIntegrationInput : An object defining properties of an addin, also allowing an addin to customize its + /// appearence in the 'Find network machines' dialog. + bool registerNetworkMachineIntegration(const core::Ptr& networkMachineIntegrationInput); + + /// This event is fired from the 'Find network machines' dialog when the corresponding + /// addin is selected from the vendor dropdown, or when 'search all vendors' is + /// selected. This event will allow the addin to initiate an enumeration of machines on + /// the network, and populate the 'Find network machines' dialog with descriptions of each + /// machine found. See SearchNetworkMachinesEvent for details. + core::Ptr searchNetworkMachinesEvent() const; + + /// This event is fired from the 'Find network machines' dialog when MachineDescription(s) + /// previously provided during the handling of the SearchNetworkMachines event are selected + /// to add to the user's Machine Library. This event will allow the addins to create + /// machine configurations corresponding to the selected MachineDescription objects. + /// See CreateMachineConfigurationsEvent for details. + core::Ptr createMachineConfigurationsEvent() const; + + ADSK_CAM_NETWORKMACHINEINTEGRATIONMANAGER_API static const char* classType(); + ADSK_CAM_NETWORKMACHINEINTEGRATIONMANAGER_API const char* objectType() const override; + ADSK_CAM_NETWORKMACHINEINTEGRATIONMANAGER_API void* queryInterface(const char* id) const override; + ADSK_CAM_NETWORKMACHINEINTEGRATIONMANAGER_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool registerNetworkMachineIntegration_raw(NetworkMachineIntegrationInput* networkMachineIntegrationInput) = 0; + virtual SearchNetworkMachinesEvent* searchNetworkMachinesEvent_raw() const = 0; + virtual CreateMachineConfigurationsEvent* createMachineConfigurationsEvent_raw() const = 0; +}; + +// Inline wrappers + +inline bool NetworkMachineIntegrationManager::registerNetworkMachineIntegration(const core::Ptr& networkMachineIntegrationInput) +{ + bool res = registerNetworkMachineIntegration_raw(networkMachineIntegrationInput.get()); + return res; +} + +inline core::Ptr NetworkMachineIntegrationManager::searchNetworkMachinesEvent() const +{ + core::Ptr res = searchNetworkMachinesEvent_raw(); + return res; +} + +inline core::Ptr NetworkMachineIntegrationManager::createMachineConfigurationsEvent() const +{ + core::Ptr res = createMachineConfigurationsEvent_raw(); + return res; +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_NETWORKMACHINEINTEGRATIONMANAGER_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Machine/LinearMachineAxis.h b/usr/autodesk/CPP/include/CAM/Machine/LinearMachineAxis.h new file mode 100644 index 0000000..eb10a34 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Machine/LinearMachineAxis.h @@ -0,0 +1,69 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "MachineAxis.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_LINEARMACHINEAXIS_CPP__ +# define ADSK_CAM_LINEARMACHINEAXIS_API XI_EXPORT +# else +# define ADSK_CAM_LINEARMACHINEAXIS_API +# endif +#else +# define ADSK_CAM_LINEARMACHINEAXIS_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Vector3D; +}} + +namespace adsk { namespace cam { + +/// Object that represents an axis with linear motion (e.g. X, Y, and Z). +class LinearMachineAxis : public MachineAxis { +public: + + /// The unit vector that represents the direction along which the axis will move. + core::Ptr direction() const; + bool direction(const core::Ptr& value); + + ADSK_CAM_LINEARMACHINEAXIS_API static const char* classType(); + ADSK_CAM_LINEARMACHINEAXIS_API const char* objectType() const override; + ADSK_CAM_LINEARMACHINEAXIS_API void* queryInterface(const char* id) const override; + ADSK_CAM_LINEARMACHINEAXIS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Vector3D* direction_raw() const = 0; + virtual bool direction_raw(core::Vector3D* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr LinearMachineAxis::direction() const +{ + core::Ptr res = direction_raw(); + return res; +} + +inline bool LinearMachineAxis::direction(const core::Ptr& value) +{ + return direction_raw(value.get()); +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_LINEARMACHINEAXIS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Machine/LinearMachineAxisInput.h b/usr/autodesk/CPP/include/CAM/Machine/LinearMachineAxisInput.h new file mode 100644 index 0000000..c4499b6 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Machine/LinearMachineAxisInput.h @@ -0,0 +1,70 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "MachineAxisInput.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_LINEARMACHINEAXISINPUT_CPP__ +# define ADSK_CAM_LINEARMACHINEAXISINPUT_API XI_EXPORT +# else +# define ADSK_CAM_LINEARMACHINEAXISINPUT_API +# endif +#else +# define ADSK_CAM_LINEARMACHINEAXISINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Vector3D; +}} + +namespace adsk { namespace cam { + +/// Object that defines the properties required to create a new linear machine axis object. +class LinearMachineAxisInput : public MachineAxisInput { +public: + + /// The unit vector that represents the direction along which the linear axis will move. + /// This vector is in the machine's coordinate system (e.g. the X axis is always (1,0,0)). + core::Ptr direction() const; + bool direction(const core::Ptr& value); + + ADSK_CAM_LINEARMACHINEAXISINPUT_API static const char* classType(); + ADSK_CAM_LINEARMACHINEAXISINPUT_API const char* objectType() const override; + ADSK_CAM_LINEARMACHINEAXISINPUT_API void* queryInterface(const char* id) const override; + ADSK_CAM_LINEARMACHINEAXISINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Vector3D* direction_raw() const = 0; + virtual bool direction_raw(core::Vector3D* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr LinearMachineAxisInput::direction() const +{ + core::Ptr res = direction_raw(); + return res; +} + +inline bool LinearMachineAxisInput::direction(const core::Ptr& value) +{ + return direction_raw(value.get()); +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_LINEARMACHINEAXISINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Machine/Machine.h b/usr/autodesk/CPP/include/CAM/Machine/Machine.h new file mode 100644 index 0000000..eefeaed --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Machine/Machine.h @@ -0,0 +1,209 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_MACHINE_CPP__ +# define ADSK_CAM_MACHINE_API XI_EXPORT +# else +# define ADSK_CAM_MACHINE_API +# endif +#else +# define ADSK_CAM_MACHINE_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class MachineCapabilities; + class MachineKinematics; +}} + +namespace adsk { namespace cam { + +/// Object that represents a machine. +class Machine : public core::Base { +public: + + /// Gets and sets the vendor name of the machine. + std::string vendor() const; + bool vendor(const std::string& value); + + /// Gets and sets the model name of the machine. + std::string model() const; + bool model(const std::string& value); + + /// Gets and sets the description of the machine. + std::string description() const; + bool description(const std::string& value); + + /// Gets the unique identifier of the machine. + /// Can be used for comparing machines within the document. + std::string id() const; + + /// Gets the capabilities of the machine. + core::Ptr capabilities() const; + + /// Gets the kinematics tree of the machine. + core::Ptr kinematics() const; + + /// Creates a Machine from a template. + /// machineTemplate : The template to act as a base for creating a machine from. + /// Returns the newly created machine with a valid kinematics tree. + static core::Ptr createFromTemplate(MachineTemplate machineTemplate); + + /// Creates a Machine from a file. + /// location : The location in the machine library. + /// filePath : The path to a file to act as a base for creating a machine from. + /// The path is relative to the library location given, unless library location is External, + /// then the filePath is expected to be an absolute path. + /// Returns the newly created machine with a valid kinematics tree. + static core::Ptr createFromFile(LibraryLocation location, const std::string& filePath); + + /// Save the Machine to a file. + /// Any subsequent edits will need to be saved again. + /// location : The location in the machine library to save the machine to. + /// filePath : The path of the file to save the machine as. + /// The path is relative to the library location given, unless library location is External, + /// then the filePath is expected to be an absolute path. + /// .machine will be appended if no extension is given. + /// Returns true if the machine was saved successfully, false otherwise. + bool save(LibraryLocation location, const std::string& filePath) const; + + ADSK_CAM_MACHINE_API static const char* classType(); + ADSK_CAM_MACHINE_API const char* objectType() const override; + ADSK_CAM_MACHINE_API void* queryInterface(const char* id) const override; + ADSK_CAM_MACHINE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* vendor_raw() const = 0; + virtual bool vendor_raw(const char * value) = 0; + virtual char* model_raw() const = 0; + virtual bool model_raw(const char * value) = 0; + virtual char* description_raw() const = 0; + virtual bool description_raw(const char * value) = 0; + virtual char* id_raw() const = 0; + virtual MachineCapabilities* capabilities_raw() const = 0; + virtual MachineKinematics* kinematics_raw() const = 0; + ADSK_CAM_MACHINE_API static Machine* createFromTemplate_raw(MachineTemplate machineTemplate); + ADSK_CAM_MACHINE_API static Machine* createFromFile_raw(LibraryLocation location, const char * filePath); + virtual bool save_raw(LibraryLocation location, const char * filePath) const = 0; +}; + +// Inline wrappers + +inline std::string Machine::vendor() const +{ + std::string res; + + char* p= vendor_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool Machine::vendor(const std::string& value) +{ + return vendor_raw(value.c_str()); +} + +inline std::string Machine::model() const +{ + std::string res; + + char* p= model_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool Machine::model(const std::string& value) +{ + return model_raw(value.c_str()); +} + +inline std::string Machine::description() const +{ + std::string res; + + char* p= description_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool Machine::description(const std::string& value) +{ + return description_raw(value.c_str()); +} + +inline std::string Machine::id() const +{ + std::string res; + + char* p= id_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline core::Ptr Machine::capabilities() const +{ + core::Ptr res = capabilities_raw(); + return res; +} + +inline core::Ptr Machine::kinematics() const +{ + core::Ptr res = kinematics_raw(); + return res; +} + +inline core::Ptr Machine::createFromTemplate(MachineTemplate machineTemplate) +{ + core::Ptr res = createFromTemplate_raw(machineTemplate); + return res; +} + +inline core::Ptr Machine::createFromFile(LibraryLocation location, const std::string& filePath) +{ + core::Ptr res = createFromFile_raw(location, filePath.c_str()); + return res; +} + +inline bool Machine::save(LibraryLocation location, const std::string& filePath) const +{ + bool res = save_raw(location, filePath.c_str()); + return res; +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_MACHINE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Machine/MachineAxis.h b/usr/autodesk/CPP/include/CAM/Machine/MachineAxis.h new file mode 100644 index 0000000..d76c23e --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Machine/MachineAxis.h @@ -0,0 +1,173 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_MACHINEAXIS_CPP__ +# define ADSK_CAM_MACHINEAXIS_API XI_EXPORT +# else +# define ADSK_CAM_MACHINEAXIS_API +# endif +#else +# define ADSK_CAM_MACHINEAXIS_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + +/// Abstract base class representing a single machine axis. +class MachineAxis : public core::Base { +public: + + /// The name of this axis. + std::string name() const; + bool name(const std::string& value); + + /// The type of axis. + MachineAxisTypes axisType() const; + + /// Does this axis have a limited range of motion. + bool hasLimits() const; + + /// The minimum possible value for this axis (in mm/deg). + /// Must be less than physicalMax. + /// Set the value of this and physicalMax to 0 to remove + /// axis limits. + double physicalMin() const; + bool physicalMin(double value); + + /// The maximum possible value for this axis (in mm/deg). + /// Must be less than physicalMin. + /// Set the value of this and physicalMin to 0 to remove + /// axis limits. + double physicalMax() const; + bool physicalMax(double value); + + /// Specifies the value (in mm/deg) that this axis returns to when the machine is homed. + double homePosition() const; + bool homePosition(double value); + + ADSK_CAM_MACHINEAXIS_API static const char* classType(); + ADSK_CAM_MACHINEAXIS_API const char* objectType() const override; + ADSK_CAM_MACHINEAXIS_API void* queryInterface(const char* id) const override; + ADSK_CAM_MACHINEAXIS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual MachineAxisTypes axisType_raw() const = 0; + virtual bool hasLimits_raw() const = 0; + virtual double physicalMin_raw() const = 0; + virtual bool physicalMin_raw(double value) = 0; + virtual double physicalMax_raw() const = 0; + virtual bool physicalMax_raw(double value) = 0; + virtual double homePosition_raw() const = 0; + virtual bool homePosition_raw(double value) = 0; + virtual void placeholderMachineAxis0() {} + virtual void placeholderMachineAxis1() {} + virtual void placeholderMachineAxis2() {} + virtual void placeholderMachineAxis3() {} + virtual void placeholderMachineAxis4() {} + virtual void placeholderMachineAxis5() {} + virtual void placeholderMachineAxis6() {} + virtual void placeholderMachineAxis7() {} + virtual void placeholderMachineAxis8() {} + virtual void placeholderMachineAxis9() {} + virtual void placeholderMachineAxis10() {} + virtual void placeholderMachineAxis11() {} + virtual void placeholderMachineAxis12() {} + virtual void placeholderMachineAxis13() {} + virtual void placeholderMachineAxis14() {} + virtual void placeholderMachineAxis15() {} + virtual void placeholderMachineAxis16() {} + virtual void placeholderMachineAxis17() {} + virtual void placeholderMachineAxis18() {} + virtual void placeholderMachineAxis19() {} + virtual void placeholderMachineAxis20() {} + virtual void placeholderMachineAxis21() {} +}; + +// Inline wrappers + +inline std::string MachineAxis::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool MachineAxis::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline MachineAxisTypes MachineAxis::axisType() const +{ + MachineAxisTypes res = axisType_raw(); + return res; +} + +inline bool MachineAxis::hasLimits() const +{ + bool res = hasLimits_raw(); + return res; +} + +inline double MachineAxis::physicalMin() const +{ + double res = physicalMin_raw(); + return res; +} + +inline bool MachineAxis::physicalMin(double value) +{ + return physicalMin_raw(value); +} + +inline double MachineAxis::physicalMax() const +{ + double res = physicalMax_raw(); + return res; +} + +inline bool MachineAxis::physicalMax(double value) +{ + return physicalMax_raw(value); +} + +inline double MachineAxis::homePosition() const +{ + double res = homePosition_raw(); + return res; +} + +inline bool MachineAxis::homePosition(double value) +{ + return homePosition_raw(value); +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_MACHINEAXIS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Machine/MachineAxisInput.h b/usr/autodesk/CPP/include/CAM/Machine/MachineAxisInput.h new file mode 100644 index 0000000..a82acbd --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Machine/MachineAxisInput.h @@ -0,0 +1,164 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_MACHINEAXISINPUT_CPP__ +# define ADSK_CAM_MACHINEAXISINPUT_API XI_EXPORT +# else +# define ADSK_CAM_MACHINEAXISINPUT_API +# endif +#else +# define ADSK_CAM_MACHINEAXISINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + +/// Object that defines the properties required to create a machine axis object. +class MachineAxisInput : public core::Base { +public: + + /// The type of axis. + /// This axis type determines which parameters of this object are valid to be accessed + /// or modified. + MachineAxisTypes axisType() const; + + /// The user facing name of this axis. + std::string name() const; + bool name(const std::string& value); + + /// Specifies the value (in mm/deg) that this axis returns to when the machine is homed. + double homePosition() const; + bool homePosition(double value); + + /// The minimum possible value for this axis (in mm/deg). + /// Set the value of this and physicalMax to 0 to create an + /// unlimited axis. + double physicalMin() const; + bool physicalMin(double value); + + /// The maximum possible value for this axis (in mm/deg). + /// Set the value of this and physicalMin to 0 to create an + /// unlimited axis. + double physicalMax() const; + bool physicalMax(double value); + + ADSK_CAM_MACHINEAXISINPUT_API static const char* classType(); + ADSK_CAM_MACHINEAXISINPUT_API const char* objectType() const override; + ADSK_CAM_MACHINEAXISINPUT_API void* queryInterface(const char* id) const override; + ADSK_CAM_MACHINEAXISINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual MachineAxisTypes axisType_raw() const = 0; + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual double homePosition_raw() const = 0; + virtual bool homePosition_raw(double value) = 0; + virtual double physicalMin_raw() const = 0; + virtual bool physicalMin_raw(double value) = 0; + virtual double physicalMax_raw() const = 0; + virtual bool physicalMax_raw(double value) = 0; + virtual void placeholderMachineAxisInput0() {} + virtual void placeholderMachineAxisInput1() {} + virtual void placeholderMachineAxisInput2() {} + virtual void placeholderMachineAxisInput3() {} + virtual void placeholderMachineAxisInput4() {} + virtual void placeholderMachineAxisInput5() {} + virtual void placeholderMachineAxisInput6() {} + virtual void placeholderMachineAxisInput7() {} + virtual void placeholderMachineAxisInput8() {} + virtual void placeholderMachineAxisInput9() {} + virtual void placeholderMachineAxisInput10() {} + virtual void placeholderMachineAxisInput11() {} + virtual void placeholderMachineAxisInput12() {} + virtual void placeholderMachineAxisInput13() {} + virtual void placeholderMachineAxisInput14() {} + virtual void placeholderMachineAxisInput15() {} + virtual void placeholderMachineAxisInput16() {} + virtual void placeholderMachineAxisInput17() {} + virtual void placeholderMachineAxisInput18() {} + virtual void placeholderMachineAxisInput19() {} + virtual void placeholderMachineAxisInput20() {} + virtual void placeholderMachineAxisInput21() {} + virtual void placeholderMachineAxisInput22() {} +}; + +// Inline wrappers + +inline MachineAxisTypes MachineAxisInput::axisType() const +{ + MachineAxisTypes res = axisType_raw(); + return res; +} + +inline std::string MachineAxisInput::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool MachineAxisInput::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline double MachineAxisInput::homePosition() const +{ + double res = homePosition_raw(); + return res; +} + +inline bool MachineAxisInput::homePosition(double value) +{ + return homePosition_raw(value); +} + +inline double MachineAxisInput::physicalMin() const +{ + double res = physicalMin_raw(); + return res; +} + +inline bool MachineAxisInput::physicalMin(double value) +{ + return physicalMin_raw(value); +} + +inline double MachineAxisInput::physicalMax() const +{ + double res = physicalMax_raw(); + return res; +} + +inline bool MachineAxisInput::physicalMax(double value) +{ + return physicalMax_raw(value); +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_MACHINEAXISINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Machine/MachineCapabilities.h b/usr/autodesk/CPP/include/CAM/Machine/MachineCapabilities.h new file mode 100644 index 0000000..2e1ed3a --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Machine/MachineCapabilities.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_MACHINECAPABILITIES_CPP__ +# define ADSK_CAM_MACHINECAPABILITIES_API XI_EXPORT +# else +# define ADSK_CAM_MACHINECAPABILITIES_API +# endif +#else +# define ADSK_CAM_MACHINECAPABILITIES_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + +/// Object that represents the capabilities of the machine. +class MachineCapabilities : public core::Base { +public: + + /// Gets and sets if the machine is capable of subtractive milling. + bool isMillingSupported() const; + bool isMillingSupported(bool value); + + /// Gets and sets if the machine is capable of subtractive turning. + bool isTurningSupported() const; + bool isTurningSupported(bool value); + + /// Gets and sets if the machine is capable of subtractive cutting. + bool isCuttingSupported() const; + bool isCuttingSupported(bool value); + + ADSK_CAM_MACHINECAPABILITIES_API static const char* classType(); + ADSK_CAM_MACHINECAPABILITIES_API const char* objectType() const override; + ADSK_CAM_MACHINECAPABILITIES_API void* queryInterface(const char* id) const override; + ADSK_CAM_MACHINECAPABILITIES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool isMillingSupported_raw() const = 0; + virtual bool isMillingSupported_raw(bool value) = 0; + virtual bool isTurningSupported_raw() const = 0; + virtual bool isTurningSupported_raw(bool value) = 0; + virtual bool isCuttingSupported_raw() const = 0; + virtual bool isCuttingSupported_raw(bool value) = 0; +}; + +// Inline wrappers + +inline bool MachineCapabilities::isMillingSupported() const +{ + bool res = isMillingSupported_raw(); + return res; +} + +inline bool MachineCapabilities::isMillingSupported(bool value) +{ + return isMillingSupported_raw(value); +} + +inline bool MachineCapabilities::isTurningSupported() const +{ + bool res = isTurningSupported_raw(); + return res; +} + +inline bool MachineCapabilities::isTurningSupported(bool value) +{ + return isTurningSupported_raw(value); +} + +inline bool MachineCapabilities::isCuttingSupported() const +{ + bool res = isCuttingSupported_raw(); + return res; +} + +inline bool MachineCapabilities::isCuttingSupported(bool value) +{ + return isCuttingSupported_raw(value); +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_MACHINECAPABILITIES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Machine/MachineKinematics.h b/usr/autodesk/CPP/include/CAM/Machine/MachineKinematics.h new file mode 100644 index 0000000..e76da40 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Machine/MachineKinematics.h @@ -0,0 +1,63 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_MACHINEKINEMATICS_CPP__ +# define ADSK_CAM_MACHINEKINEMATICS_API XI_EXPORT +# else +# define ADSK_CAM_MACHINEKINEMATICS_API +# endif +#else +# define ADSK_CAM_MACHINEKINEMATICS_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class MachineParts; +}} + +namespace adsk { namespace cam { + +/// Object that represents the kinematics tree in the machine. +class MachineKinematics : public core::Base { +public: + + /// Get the root parts collection. + core::Ptr parts() const; + + ADSK_CAM_MACHINEKINEMATICS_API static const char* classType(); + ADSK_CAM_MACHINEKINEMATICS_API const char* objectType() const override; + ADSK_CAM_MACHINEKINEMATICS_API void* queryInterface(const char* id) const override; + ADSK_CAM_MACHINEKINEMATICS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual MachineParts* parts_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr MachineKinematics::parts() const +{ + core::Ptr res = parts_raw(); + return res; +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_MACHINEKINEMATICS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Machine/MachinePart.h b/usr/autodesk/CPP/include/CAM/Machine/MachinePart.h new file mode 100644 index 0000000..78a6bed --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Machine/MachinePart.h @@ -0,0 +1,135 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_MACHINEPART_CPP__ +# define ADSK_CAM_MACHINEPART_API XI_EXPORT +# else +# define ADSK_CAM_MACHINEPART_API +# endif +#else +# define ADSK_CAM_MACHINEPART_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class MachineAxis; + class MachineParts; +}} + +namespace adsk { namespace cam { + +/// Object representing some part of a machine, such as the static base of the machine, an +/// axis, or the attachment points for tools and fixtures. +class MachinePart : public core::Base { +public: + + /// Delete this part and its children from the kinematics tree. + void deleteMe(); + + /// Get the collection of child parts. + core::Ptr children() const; + + /// Get or set the parent of this part. + /// Setting the parent will add this part to the end of the parent's children + /// collection. Setting the parent will throw an error if the new parent is this + /// part or a child this part. + core::Ptr parent() const; + bool parent(const core::Ptr& value); + + /// Get the type of this part. + MachinePartTypes partType() const; + + /// Get the internal ID of the part. + /// This is unique with respect to other MachineParts in the Machine. + std::string id() const; + + /// Get the axis object for this part used to reference this part for other + /// operations. + /// Only valid when partType is Axis, otherwise returns null + core::Ptr axis() const; + + ADSK_CAM_MACHINEPART_API static const char* classType(); + ADSK_CAM_MACHINEPART_API const char* objectType() const override; + ADSK_CAM_MACHINEPART_API void* queryInterface(const char* id) const override; + ADSK_CAM_MACHINEPART_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual void deleteMe_raw() = 0; + virtual MachineParts* children_raw() const = 0; + virtual MachinePart* parent_raw() const = 0; + virtual bool parent_raw(MachinePart* value) = 0; + virtual MachinePartTypes partType_raw() const = 0; + virtual char* id_raw() const = 0; + virtual MachineAxis* axis_raw() const = 0; +}; + +// Inline wrappers + +inline void MachinePart::deleteMe() +{ + deleteMe_raw(); +} + +inline core::Ptr MachinePart::children() const +{ + core::Ptr res = children_raw(); + return res; +} + +inline core::Ptr MachinePart::parent() const +{ + core::Ptr res = parent_raw(); + return res; +} + +inline bool MachinePart::parent(const core::Ptr& value) +{ + return parent_raw(value.get()); +} + +inline MachinePartTypes MachinePart::partType() const +{ + MachinePartTypes res = partType_raw(); + return res; +} + +inline std::string MachinePart::id() const +{ + std::string res; + + char* p= id_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline core::Ptr MachinePart::axis() const +{ + core::Ptr res = axis_raw(); + return res; +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_MACHINEPART_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Machine/MachinePartInput.h b/usr/autodesk/CPP/include/CAM/Machine/MachinePartInput.h new file mode 100644 index 0000000..3008aa4 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Machine/MachinePartInput.h @@ -0,0 +1,124 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_MACHINEPARTINPUT_CPP__ +# define ADSK_CAM_MACHINEPARTINPUT_API XI_EXPORT +# else +# define ADSK_CAM_MACHINEPARTINPUT_API +# endif +#else +# define ADSK_CAM_MACHINEPARTINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class MachineAxisInput; +}} + +namespace adsk { namespace cam { + +/// Object representing the set of inputs required to create a new MachinePart. +/// Set an MachineAxisInput object on this object's axisInput parameter to create +/// a new MachineAxis with this part. +class MachinePartInput : public core::Base { +public: + + /// Get or set the internal ID of the part, used to reference this part for other + /// operations. This ID can be any string. + /// This must be unique with respect to other MachineParts in the Machine. + std::string id() const; + bool id(const std::string& value); + + /// Get the type of part this input will create. + MachinePartTypes partType() const; + + /// Create a new MachineAxisInput object to be used to create a new MachineAxis. + /// Set this object on to an axis type MachinePartInput to create a new MachineAxis + /// with that part. + /// axisType : The type of MachineAxisInput to create. + /// Returns a LinearMachineAxisInput or RotaryMachineAxisInput, or null if the creation failed. + core::Ptr createAxisInput(MachineAxisTypes axisType); + + /// Get or Set an axis input object to create a new MachineAxis with this part. + /// Only valid when partType is Axis. + core::Ptr axisInput() const; + bool axisInput(const core::Ptr& value); + + ADSK_CAM_MACHINEPARTINPUT_API static const char* classType(); + ADSK_CAM_MACHINEPARTINPUT_API const char* objectType() const override; + ADSK_CAM_MACHINEPARTINPUT_API void* queryInterface(const char* id) const override; + ADSK_CAM_MACHINEPARTINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* id_raw() const = 0; + virtual bool id_raw(const char * value) = 0; + virtual MachinePartTypes partType_raw() const = 0; + virtual MachineAxisInput* createAxisInput_raw(MachineAxisTypes axisType) = 0; + virtual MachineAxisInput* axisInput_raw() const = 0; + virtual bool axisInput_raw(MachineAxisInput* value) = 0; +}; + +// Inline wrappers + +inline std::string MachinePartInput::id() const +{ + std::string res; + + char* p= id_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool MachinePartInput::id(const std::string& value) +{ + return id_raw(value.c_str()); +} + +inline MachinePartTypes MachinePartInput::partType() const +{ + MachinePartTypes res = partType_raw(); + return res; +} + +inline core::Ptr MachinePartInput::createAxisInput(MachineAxisTypes axisType) +{ + core::Ptr res = createAxisInput_raw(axisType); + return res; +} + +inline core::Ptr MachinePartInput::axisInput() const +{ + core::Ptr res = axisInput_raw(); + return res; +} + +inline bool MachinePartInput::axisInput(const core::Ptr& value) +{ + return axisInput_raw(value.get()); +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_MACHINEPARTINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Machine/MachineParts.h b/usr/autodesk/CPP/include/CAM/Machine/MachineParts.h new file mode 100644 index 0000000..31ed50b --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Machine/MachineParts.h @@ -0,0 +1,130 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_MACHINEPARTS_CPP__ +# define ADSK_CAM_MACHINEPARTS_API XI_EXPORT +# else +# define ADSK_CAM_MACHINEPARTS_API +# endif +#else +# define ADSK_CAM_MACHINEPARTS_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class MachinePart; + class MachinePartInput; +}} + +namespace adsk { namespace cam { + +/// Object that represents a collection of machine parts. +/// These parts are the children of another part or the collection of base parts from MachineKinematics +class MachineParts : public core::Base { +public: + + /// Add a new part to this collection. The part's parent will be set to the the owner of + /// this collection, or null if this is the root parts collection. + /// If the passed MachinePartInput has a MachineAxisInput a new MachineAxis will be created. + /// partInput : Part input object used to create the new MachinePart. + /// Returns the newly creted MachinePart or null if creation failed. + core::Ptr add(const core::Ptr& partInput); + + /// Create a new MachinePartInput. + /// partType : The type of part to create. + /// When this parameter is Axis, you must set a value for axisInput. + /// Returns the new MachinePartInput or null if creation failed. + core::Ptr createPartInput(MachinePartTypes partType); + + /// Get the part at index in this collection. + /// index : The index of the part. + /// The MachinePart at index. + core::Ptr item(int index) const; + + /// Get the part with the given ID. + /// id : The ID for the part to get. + /// Returns the MachinePart with the given ID, or null if the given ID does not + /// match any part in the collection. + core::Ptr itemById(const std::string& id) const; + + /// Get the number of parts in this collection. + size_t count() const; + + typedef MachinePart iterable_type; + template void copyTo(OutputIterator result); + + ADSK_CAM_MACHINEPARTS_API static const char* classType(); + ADSK_CAM_MACHINEPARTS_API const char* objectType() const override; + ADSK_CAM_MACHINEPARTS_API void* queryInterface(const char* id) const override; + ADSK_CAM_MACHINEPARTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual MachinePart* add_raw(MachinePartInput* partInput) = 0; + virtual MachinePartInput* createPartInput_raw(MachinePartTypes partType) = 0; + virtual MachinePart* item_raw(int index) const = 0; + virtual MachinePart* itemById_raw(const char * id) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr MachineParts::add(const core::Ptr& partInput) +{ + core::Ptr res = add_raw(partInput.get()); + return res; +} + +inline core::Ptr MachineParts::createPartInput(MachinePartTypes partType) +{ + core::Ptr res = createPartInput_raw(partType); + return res; +} + +inline core::Ptr MachineParts::item(int index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr MachineParts::itemById(const std::string& id) const +{ + core::Ptr res = itemById_raw(id.c_str()); + return res; +} + +inline size_t MachineParts::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void MachineParts::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_MACHINEPARTS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Machine/RotaryMachineAxis.h b/usr/autodesk/CPP/include/CAM/Machine/RotaryMachineAxis.h new file mode 100644 index 0000000..fa72aa3 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Machine/RotaryMachineAxis.h @@ -0,0 +1,69 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "MachineAxis.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_ROTARYMACHINEAXIS_CPP__ +# define ADSK_CAM_ROTARYMACHINEAXIS_API XI_EXPORT +# else +# define ADSK_CAM_ROTARYMACHINEAXIS_API +# endif +#else +# define ADSK_CAM_ROTARYMACHINEAXIS_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class InfiniteLine3D; +}} + +namespace adsk { namespace cam { + +/// Object that represents an axis with rotary motion (e.g. A, B, and C). +class RotaryMachineAxis : public MachineAxis { +public: + + /// The infinite line that defines the direction and location of the axis of rotation. + core::Ptr rotationAxis() const; + bool rotationAxis(const core::Ptr& value); + + ADSK_CAM_ROTARYMACHINEAXIS_API static const char* classType(); + ADSK_CAM_ROTARYMACHINEAXIS_API const char* objectType() const override; + ADSK_CAM_ROTARYMACHINEAXIS_API void* queryInterface(const char* id) const override; + ADSK_CAM_ROTARYMACHINEAXIS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::InfiniteLine3D* rotationAxis_raw() const = 0; + virtual bool rotationAxis_raw(core::InfiniteLine3D* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr RotaryMachineAxis::rotationAxis() const +{ + core::Ptr res = rotationAxis_raw(); + return res; +} + +inline bool RotaryMachineAxis::rotationAxis(const core::Ptr& value) +{ + return rotationAxis_raw(value.get()); +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_ROTARYMACHINEAXIS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Machine/RotaryMachineAxisInput.h b/usr/autodesk/CPP/include/CAM/Machine/RotaryMachineAxisInput.h new file mode 100644 index 0000000..eba5e0c --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Machine/RotaryMachineAxisInput.h @@ -0,0 +1,71 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "MachineAxisInput.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_ROTARYMACHINEAXISINPUT_CPP__ +# define ADSK_CAM_ROTARYMACHINEAXISINPUT_API XI_EXPORT +# else +# define ADSK_CAM_ROTARYMACHINEAXISINPUT_API +# endif +#else +# define ADSK_CAM_ROTARYMACHINEAXISINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class InfiniteLine3D; +}} + +namespace adsk { namespace cam { + +/// Object that defines the properties required to create a new rotary machine axis object. +class RotaryMachineAxisInput : public MachineAxisInput { +public: + + /// The infinite line that defines the direction and location of the axis of rotation. + /// This direction is in the machine's coordinate system (e.g. an A axis would + /// typically use (1,0,0) for the direction), and follows the right-hand rule. + core::Ptr rotationAxis() const; + bool rotationAxis(const core::Ptr& value); + + ADSK_CAM_ROTARYMACHINEAXISINPUT_API static const char* classType(); + ADSK_CAM_ROTARYMACHINEAXISINPUT_API const char* objectType() const override; + ADSK_CAM_ROTARYMACHINEAXISINPUT_API void* queryInterface(const char* id) const override; + ADSK_CAM_ROTARYMACHINEAXISINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::InfiniteLine3D* rotationAxis_raw() const = 0; + virtual bool rotationAxis_raw(core::InfiniteLine3D* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr RotaryMachineAxisInput::rotationAxis() const +{ + core::Ptr res = rotationAxis_raw(); + return res; +} + +inline bool RotaryMachineAxisInput::rotationAxis(const core::Ptr& value) +{ + return rotationAxis_raw(value.get()); +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_ROTARYMACHINEAXISINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Operations/CAMParameter.h b/usr/autodesk/CPP/include/CAM/Operations/CAMParameter.h new file mode 100644 index 0000000..b12c60d --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Operations/CAMParameter.h @@ -0,0 +1,154 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_CAMPARAMETER_CPP__ +# define ADSK_CAM_CAMPARAMETER_API XI_EXPORT +# else +# define ADSK_CAM_CAMPARAMETER_API +# endif +#else +# define ADSK_CAM_CAMPARAMETER_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + +/// Base class for representing parameter of an operation. +class CAMParameter : public core::Base { +public: + + /// Gets the name (internal name) of the parameter. + std::string name() const; + + /// Returns the title of this parameter as seen in the user interface. + /// This title is localized and can change based on the current language + std::string title() const; + + /// Gets and sets the value expression of the parameter. + std::string expression() const; + bool expression(const std::string& value); + + /// Gets if this parameter is enabled. Some parameters are enabled/disabled depending on the values + /// set for other parameters. + bool isEnabled() const; + + /// Returns a message corresponding to any active error associated with the value of this parameter. + std::string error() const; + + /// Returns a message corresponding to any active warning associated with the value of this parameter. + std::string warning() const; + + ADSK_CAM_CAMPARAMETER_API static const char* classType(); + ADSK_CAM_CAMPARAMETER_API const char* objectType() const override; + ADSK_CAM_CAMPARAMETER_API void* queryInterface(const char* id) const override; + ADSK_CAM_CAMPARAMETER_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* name_raw() const = 0; + virtual char* title_raw() const = 0; + virtual char* expression_raw() const = 0; + virtual bool expression_raw(const char * value) = 0; + virtual bool isEnabled_raw() const = 0; + virtual char* error_raw() const = 0; + virtual char* warning_raw() const = 0; +}; + +// Inline wrappers + +inline std::string CAMParameter::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string CAMParameter::title() const +{ + std::string res; + + char* p= title_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string CAMParameter::expression() const +{ + std::string res; + + char* p= expression_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool CAMParameter::expression(const std::string& value) +{ + return expression_raw(value.c_str()); +} + +inline bool CAMParameter::isEnabled() const +{ + bool res = isEnabled_raw(); + return res; +} + +inline std::string CAMParameter::error() const +{ + std::string res; + + char* p= error_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string CAMParameter::warning() const +{ + std::string res; + + char* p= warning_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_CAMPARAMETER_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Operations/CAMParameters.h b/usr/autodesk/CPP/include/CAM/Operations/CAMParameters.h new file mode 100644 index 0000000..3fe06a8 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Operations/CAMParameters.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_CAMPARAMETERS_CPP__ +# define ADSK_CAM_CAMPARAMETERS_API XI_EXPORT +# else +# define ADSK_CAM_CAMPARAMETERS_API +# endif +#else +# define ADSK_CAM_CAMPARAMETERS_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class CAMParameter; +}} + +namespace adsk { namespace cam { + +/// Collection that provides access to the parameters of an existing operation. +class CAMParameters : public core::Base { +public: + + /// Function that returns the specified parameter using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the parameter of the specified id (internal name). + /// internalName : The id (internal name) of the parameter. + /// Returns the specified parameter or null in the case where there is no parameter with the specified id. + core::Ptr itemByName(const std::string& internalName) const; + + /// The number of items in the collection. + size_t count() const; + + typedef CAMParameter iterable_type; + template void copyTo(OutputIterator result); + + ADSK_CAM_CAMPARAMETERS_API static const char* classType(); + ADSK_CAM_CAMPARAMETERS_API const char* objectType() const override; + ADSK_CAM_CAMPARAMETERS_API void* queryInterface(const char* id) const override; + ADSK_CAM_CAMPARAMETERS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CAMParameter* item_raw(size_t index) const = 0; + virtual CAMParameter* itemByName_raw(const char * internalName) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr CAMParameters::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr CAMParameters::itemByName(const std::string& internalName) const +{ + core::Ptr res = itemByName_raw(internalName.c_str()); + return res; +} + +inline size_t CAMParameters::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void CAMParameters::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_CAMPARAMETERS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Operations/Operation.h b/usr/autodesk/CPP/include/CAM/Operations/Operation.h new file mode 100644 index 0000000..c06cd06 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Operations/Operation.h @@ -0,0 +1,185 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../CAMTypeDefs.h" +#include "OperationBase.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_OPERATION_CPP__ +# define ADSK_CAM_OPERATION_API XI_EXPORT +# else +# define ADSK_CAM_OPERATION_API +# endif +#else +# define ADSK_CAM_OPERATION_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + +/// Object that represents an operation in an existing Setup, Folder or Pattern. +class Operation : public OperationBase { +public: + + /// Gets the strategy type for this operation. + OperationStrategyTypes strategyType() const; + + /// Gets if the toolpath for this operation is currently valid. (has not become invalidated by model changes). + bool isToolpathValid() const; + + /// Gets if the toolpath is in the process of generating. + bool isGenerating() const; + + /// Gets if problems were encountered when generating the toolpath for this operation. + bool hasWarning() const; + + /// Returns the parent Setup, Folder or Pattern for this operation. + core::Ptr parent() const; + + /// Gets if a toolpath currently exists (has been generated) for this operation. + bool hasToolpath() const; + + /// Gets the current state of this operation. + OperationStates operationState() const; + + /// Gets the toolpath generation progress value for this operation. + std::string generatingProgress() const; + + /// Get or set the tool in JSON format for this operation. Adds tool to the document. + std::string toolJson() const; + bool toolJson(const std::string& value); + + /// Get or set the id of the tool preset to be used. Must be valid for the applied tool. + std::string toolPresetId() const; + bool toolPresetId(const std::string& value); + + ADSK_CAM_OPERATION_API static const char* classType(); + ADSK_CAM_OPERATION_API const char* objectType() const override; + ADSK_CAM_OPERATION_API void* queryInterface(const char* id) const override; + ADSK_CAM_OPERATION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual OperationStrategyTypes strategyType_raw() const = 0; + virtual bool isToolpathValid_raw() const = 0; + virtual bool isGenerating_raw() const = 0; + virtual bool hasWarning_raw() const = 0; + virtual core::Base* parent_raw() const = 0; + virtual bool hasToolpath_raw() const = 0; + virtual OperationStates operationState_raw() const = 0; + virtual char* generatingProgress_raw() const = 0; + virtual char* toolJson_raw() const = 0; + virtual bool toolJson_raw(const char * value) = 0; + virtual char* toolPresetId_raw() const = 0; + virtual bool toolPresetId_raw(const char * value) = 0; +}; + +// Inline wrappers + +inline OperationStrategyTypes Operation::strategyType() const +{ + OperationStrategyTypes res = strategyType_raw(); + return res; +} + +inline bool Operation::isToolpathValid() const +{ + bool res = isToolpathValid_raw(); + return res; +} + +inline bool Operation::isGenerating() const +{ + bool res = isGenerating_raw(); + return res; +} + +inline bool Operation::hasWarning() const +{ + bool res = hasWarning_raw(); + return res; +} + +inline core::Ptr Operation::parent() const +{ + core::Ptr res = parent_raw(); + return res; +} + +inline bool Operation::hasToolpath() const +{ + bool res = hasToolpath_raw(); + return res; +} + +inline OperationStates Operation::operationState() const +{ + OperationStates res = operationState_raw(); + return res; +} + +inline std::string Operation::generatingProgress() const +{ + std::string res; + + char* p= generatingProgress_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string Operation::toolJson() const +{ + std::string res; + + char* p= toolJson_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool Operation::toolJson(const std::string& value) +{ + return toolJson_raw(value.c_str()); +} + +inline std::string Operation::toolPresetId() const +{ + std::string res; + + char* p= toolPresetId_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool Operation::toolPresetId(const std::string& value) +{ + return toolPresetId_raw(value.c_str()); +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_OPERATION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Operations/OperationBase.h b/usr/autodesk/CPP/include/CAM/Operations/OperationBase.h new file mode 100644 index 0000000..6cb2e98 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Operations/OperationBase.h @@ -0,0 +1,263 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_OPERATIONBASE_CPP__ +# define ADSK_CAM_OPERATIONBASE_API XI_EXPORT +# else +# define ADSK_CAM_OPERATIONBASE_API +# endif +#else +# define ADSK_CAM_OPERATIONBASE_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class CAMParameters; + class Setup; +}} +namespace adsk { namespace core { + class Attributes; +}} + +namespace adsk { namespace cam { + +/// Base class object representing all operations, folders, patterns and setups. +class OperationBase : public core::Base { +public: + + /// Gets and sets the name of the operation as seen in the browser. This name is unique as compared + /// to the names of all other operations in the document. + std::string name() const; + bool name(const std::string& value); + + /// Gets and sets the "protected" property value of the operation. + /// Gets/sets true if the operation is protected. + bool isProtected() const; + bool isProtected(bool value); + + /// Gets and sets the "Optional" property value of the operation. + /// Gets/sets true if the operation is optional. + bool isOptional() const; + bool isOptional(bool value); + + /// Gets and sets the "Suppressed" property value of the operation. + /// Gets/sets true if the operation is suppressed. + bool isSuppressed() const; + bool isSuppressed(bool value); + + /// Gets the Setup this operation belongs to. + core::Ptr parentSetup() const; + + /// Gets if this operation is selected in the 'Setups' browser. + bool isSelected() const; + + /// Gets and sets the notes of the operation. + std::string notes() const; + bool notes(const std::string& value); + + /// Returns the id of the operation. This id is unique as compared + /// to the ids of all other operations in the document. + /// This id will not change when changing the order or parent of the operation. + /// This id will remain valid when the document is saved and reloaded. + int operationId() const; + + /// Gets the CAMParameters collection for this operation. + core::Ptr parameters() const; + + /// Returns the collection of attributes associated with this object. + core::Ptr attributes() const; + + ADSK_CAM_OPERATIONBASE_API static const char* classType(); + ADSK_CAM_OPERATIONBASE_API const char* objectType() const override; + ADSK_CAM_OPERATIONBASE_API void* queryInterface(const char* id) const override; + ADSK_CAM_OPERATIONBASE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual bool isProtected_raw() const = 0; + virtual bool isProtected_raw(bool value) = 0; + virtual bool isOptional_raw() const = 0; + virtual bool isOptional_raw(bool value) = 0; + virtual bool isSuppressed_raw() const = 0; + virtual bool isSuppressed_raw(bool value) = 0; + virtual Setup* parentSetup_raw() const = 0; + virtual bool isSelected_raw() const = 0; + virtual char* notes_raw() const = 0; + virtual bool notes_raw(const char * value) = 0; + virtual int operationId_raw() const = 0; + virtual CAMParameters* parameters_raw() const = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual void placeholderOperationBase0() {} + virtual void placeholderOperationBase1() {} + virtual void placeholderOperationBase2() {} + virtual void placeholderOperationBase3() {} + virtual void placeholderOperationBase4() {} + virtual void placeholderOperationBase5() {} + virtual void placeholderOperationBase6() {} + virtual void placeholderOperationBase7() {} + virtual void placeholderOperationBase8() {} + virtual void placeholderOperationBase9() {} + virtual void placeholderOperationBase10() {} + virtual void placeholderOperationBase11() {} + virtual void placeholderOperationBase12() {} + virtual void placeholderOperationBase13() {} + virtual void placeholderOperationBase14() {} + virtual void placeholderOperationBase15() {} + virtual void placeholderOperationBase16() {} + virtual void placeholderOperationBase17() {} + virtual void placeholderOperationBase18() {} + virtual void placeholderOperationBase19() {} + virtual void placeholderOperationBase20() {} + virtual void placeholderOperationBase21() {} + virtual void placeholderOperationBase22() {} + virtual void placeholderOperationBase23() {} + virtual void placeholderOperationBase24() {} + virtual void placeholderOperationBase25() {} + virtual void placeholderOperationBase26() {} + virtual void placeholderOperationBase27() {} + virtual void placeholderOperationBase28() {} + virtual void placeholderOperationBase29() {} + virtual void placeholderOperationBase30() {} + virtual void placeholderOperationBase31() {} + virtual void placeholderOperationBase32() {} + virtual void placeholderOperationBase33() {} + virtual void placeholderOperationBase34() {} + virtual void placeholderOperationBase35() {} + virtual void placeholderOperationBase36() {} + virtual void placeholderOperationBase37() {} + virtual void placeholderOperationBase38() {} + virtual void placeholderOperationBase39() {} + virtual void placeholderOperationBase40() {} + virtual void placeholderOperationBase41() {} + virtual void placeholderOperationBase42() {} + virtual void placeholderOperationBase43() {} + virtual void placeholderOperationBase44() {} + virtual void placeholderOperationBase45() {} + virtual void placeholderOperationBase46() {} + virtual void placeholderOperationBase47() {} + virtual void placeholderOperationBase48() {} +}; + +// Inline wrappers + +inline std::string OperationBase::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool OperationBase::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline bool OperationBase::isProtected() const +{ + bool res = isProtected_raw(); + return res; +} + +inline bool OperationBase::isProtected(bool value) +{ + return isProtected_raw(value); +} + +inline bool OperationBase::isOptional() const +{ + bool res = isOptional_raw(); + return res; +} + +inline bool OperationBase::isOptional(bool value) +{ + return isOptional_raw(value); +} + +inline bool OperationBase::isSuppressed() const +{ + bool res = isSuppressed_raw(); + return res; +} + +inline bool OperationBase::isSuppressed(bool value) +{ + return isSuppressed_raw(value); +} + +inline core::Ptr OperationBase::parentSetup() const +{ + core::Ptr res = parentSetup_raw(); + return res; +} + +inline bool OperationBase::isSelected() const +{ + bool res = isSelected_raw(); + return res; +} + +inline std::string OperationBase::notes() const +{ + std::string res; + + char* p= notes_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool OperationBase::notes(const std::string& value) +{ + return notes_raw(value.c_str()); +} + +inline int OperationBase::operationId() const +{ + int res = operationId_raw(); + return res; +} + +inline core::Ptr OperationBase::parameters() const +{ + core::Ptr res = parameters_raw(); + return res; +} + +inline core::Ptr OperationBase::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_OPERATIONBASE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/Operations/Operations.h b/usr/autodesk/CPP/include/CAM/Operations/Operations.h new file mode 100644 index 0000000..81d74c2 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/Operations/Operations.h @@ -0,0 +1,112 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_CAM_OPERATIONS_CPP__ +# define ADSK_CAM_OPERATIONS_API XI_EXPORT +# else +# define ADSK_CAM_OPERATIONS_API +# endif +#else +# define ADSK_CAM_OPERATIONS_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class Operation; +}} + +namespace adsk { namespace cam { + +/// Collection that provides access to the individual operations within an existing setup, folder or pattern. +class Operations : public core::Base { +public: + + /// Function that returns the specified operation using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the operation with the specified name (as appears in the browser). + /// name : The name (as it appears in the browser) of the operation. + /// Returns the specified operation or null in the case where there is no operation with the specified name. + core::Ptr itemByName(const std::string& name) const; + + /// The number of items in the collection. + size_t count() const; + + /// Returns the operation with the specified operation id. + /// id : The id of the operation. + /// Returns the specified operation or null in the case where there is no operation with the specified operation id. + core::Ptr itemByOperationId(int id) const; + + typedef Operation iterable_type; + template void copyTo(OutputIterator result); + + ADSK_CAM_OPERATIONS_API static const char* classType(); + ADSK_CAM_OPERATIONS_API const char* objectType() const override; + ADSK_CAM_OPERATIONS_API void* queryInterface(const char* id) const override; + ADSK_CAM_OPERATIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Operation* item_raw(size_t index) const = 0; + virtual Operation* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual Operation* itemByOperationId_raw(int id) const = 0; +}; + +// Inline wrappers + +inline core::Ptr Operations::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr Operations::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t Operations::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr Operations::itemByOperationId(int id) const +{ + core::Ptr res = itemByOperationId_raw(id); + return res; +} + +template inline void Operations::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace cam +}// namespace adsk + +#undef ADSK_CAM_OPERATIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/SandvikIntegration/SandvikIntegration.h b/usr/autodesk/CPP/include/CAM/SandvikIntegration/SandvikIntegration.h new file mode 100644 index 0000000..a320d41 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/SandvikIntegration/SandvikIntegration.h @@ -0,0 +1,180 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../CAMTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_SANDVIKINTEGRATION_CPP__ +# define SANDVIKINTEGRATION_API XI_EXPORT +# else +# define SANDVIKINTEGRATION_API +# endif +#else +# define SANDVIKINTEGRATION_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class SandvikIntegrationEvent; + class SandvikPreIntegrationEvent; + class Setup; +}} + +namespace adsk { namespace cam { + +/// This singleton object provides access to application-level events and properties +/// that relate to the CAM (Manufacture) workspace in Fusion 360. +class SandvikIntegration : public core::Base { +public: + + /// Access to the root CAMGlobal object. + /// Return the root SandvikIntegration object or null if it failed. + static core::Ptr get(); + + /// This event will be fired just before an operation/setup dialog (create/edit) is + /// presented. This will allow the addin to indicate which, if any, of the integration + /// actions should be shown, as well as details of the presentation. See + /// SandvikPreIntegrationEventArgs for details. + core::Ptr preIntegrationEvent() const; + + /// An integration event will be fired when any of the buttons related to the + /// integration is pressed. The event arguments will provide information about which + /// button was pressed, and will provide contextual information, such as the object + /// active at the time. + core::Ptr integrationEvent() const; + + /// Provides a mechanism to store and retrieve user-specific information as a hidden system preference. + std::string settings() const; + bool settings(const std::string& value); + + /// Get the stock material id specified for the Setup. + /// setup : The Setup object to get the stock material id for. + /// The ID of the stock material set for the Setup. + std::string getStockMaterialId(const core::Ptr& setup); + + /// Set the stock material id for the Setup. + /// setup : The Setup object to set the stock material id for. + /// Returns true if successful. + bool setStockMaterialId(const core::Ptr& setup, const std::string& id); + + /// Get the stock material id specified for the Setup. + /// setup : The Setup object to get the stock material id for. + /// The ID of the stock material set for the Setup. + std::string getStockMaterialText(const core::Ptr& setup); + + /// Set the stock material text for the Setup. This will be displayed in the user interface. + /// setup : The Setup object to set the stock material text for. + /// Returns true if successful. + bool setStockMaterialText(const core::Ptr& setup, const std::string& text); + + SANDVIKINTEGRATION_API static const char* classType(); + SANDVIKINTEGRATION_API const char* objectType() const override; + SANDVIKINTEGRATION_API void* queryInterface(const char* id) const override; + SANDVIKINTEGRATION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + SANDVIKINTEGRATION_API static SandvikIntegration* get_raw(); + virtual SandvikPreIntegrationEvent* preIntegrationEvent_raw() const = 0; + virtual SandvikIntegrationEvent* integrationEvent_raw() const = 0; + virtual char* settings_raw() const = 0; + virtual bool settings_raw(const char * value) = 0; + virtual char* getStockMaterialId_raw(Setup* setup) = 0; + virtual bool setStockMaterialId_raw(Setup* setup, const char * id) = 0; + virtual char* getStockMaterialText_raw(Setup* setup) = 0; + virtual bool setStockMaterialText_raw(Setup* setup, const char * text) = 0; +}; + +// Inline wrappers + +inline core::Ptr SandvikIntegration::get() +{ + core::Ptr res = get_raw(); + return res; +} + +inline core::Ptr SandvikIntegration::preIntegrationEvent() const +{ + core::Ptr res = preIntegrationEvent_raw(); + return res; +} + +inline core::Ptr SandvikIntegration::integrationEvent() const +{ + core::Ptr res = integrationEvent_raw(); + return res; +} + +inline std::string SandvikIntegration::settings() const +{ + std::string res; + + char* p= settings_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool SandvikIntegration::settings(const std::string& value) +{ + return settings_raw(value.c_str()); +} + +inline std::string SandvikIntegration::getStockMaterialId(const core::Ptr& setup) +{ + std::string res; + + char* p= getStockMaterialId_raw(setup.get()); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool SandvikIntegration::setStockMaterialId(const core::Ptr& setup, const std::string& id) +{ + bool res = setStockMaterialId_raw(setup.get(), id.c_str()); + return res; +} + +inline std::string SandvikIntegration::getStockMaterialText(const core::Ptr& setup) +{ + std::string res; + + char* p= getStockMaterialText_raw(setup.get()); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool SandvikIntegration::setStockMaterialText(const core::Ptr& setup, const std::string& text) +{ + bool res = setStockMaterialText_raw(setup.get(), text.c_str()); + return res; +} +}// namespace cam +}// namespace adsk + +#undef SANDVIKINTEGRATION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/CAM/SandvikIntegration/SandvikIntegrationEvents.h b/usr/autodesk/CPP/include/CAM/SandvikIntegration/SandvikIntegrationEvents.h new file mode 100644 index 0000000..354c879 --- /dev/null +++ b/usr/autodesk/CPP/include/CAM/SandvikIntegration/SandvikIntegrationEvents.h @@ -0,0 +1,287 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Application/Events.h" +#include "../../Core/Application/EventHandler.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef CAMXINTERFACE_EXPORTS +# ifdef __COMPILING_SANDVIKINTEGRATIONEVENTS_CPP__ +# define SANDVIKINTEGRATIONEVENTS_API XI_EXPORT +# else +# define SANDVIKINTEGRATIONEVENTS_API +# endif +#else +# define SANDVIKINTEGRATIONEVENTS_API XI_IMPORT +#endif + +namespace adsk { namespace cam { + class OperationBase; + class SandvikIntegrationEvent; + class SandvikIntegrationEventArgs; + class SandvikIntegrationEventHandler; + class SandvikPreIntegrationEventArgs; + class SandvikPreIntegrationEventHandler; +}} + +namespace adsk { namespace cam { + +/// +class SandvikPreIntegrationEvent : public core::Event { +public: + + /// Add a handler to be notified when the SandvikPreIntegrationEvent occurs. + /// handler : The handler object to be called when this event is fired. + /// Returns true if the addition of the handler was successful. + bool add(SandvikPreIntegrationEventHandler* handler); + + /// Removes a handler from the SandvikPreIntegrationEvent. + /// handler : The handler object to be removed from the event. + /// Returns true if removal of the handler was successful. + bool remove(SandvikPreIntegrationEventHandler* handler); + + SANDVIKINTEGRATIONEVENTS_API static const char* classType(); + SANDVIKINTEGRATIONEVENTS_API const char* objectType() const override; + SANDVIKINTEGRATIONEVENTS_API void* queryInterface(const char* id) const override; + SANDVIKINTEGRATIONEVENTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool add_raw(SandvikPreIntegrationEventHandler* handler) = 0; + virtual bool remove_raw(SandvikPreIntegrationEventHandler* handler) = 0; +}; + +// Inline wrappers + +inline bool SandvikPreIntegrationEvent::add(SandvikPreIntegrationEventHandler* handler) +{ + bool res = add_raw(handler); + return res; +} + +inline bool SandvikPreIntegrationEvent::remove(SandvikPreIntegrationEventHandler* handler) +{ + bool res = remove_raw(handler); + return res; +} + +/// +class SandvikIntegrationEvent : public core::Event { +public: + + /// Add a handler to be notified when the SandvikIntegrationEvent occurs. + /// handler : The handler object to be called when this event is fired. + /// Returns true if the addition of the handler was successful. + bool add(SandvikIntegrationEventHandler* handler); + + /// Removes a handler from the SandvikIntegrationEvent. + /// handler : The handler object to be removed from the event. + /// Returns true if removal of the handler was successful. + bool remove(SandvikIntegrationEventHandler* handler); + + SANDVIKINTEGRATIONEVENTS_API static const char* classType(); + SANDVIKINTEGRATIONEVENTS_API const char* objectType() const override; + SANDVIKINTEGRATIONEVENTS_API void* queryInterface(const char* id) const override; + SANDVIKINTEGRATIONEVENTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool add_raw(SandvikIntegrationEventHandler* handler) = 0; + virtual bool remove_raw(SandvikIntegrationEventHandler* handler) = 0; +}; + +// Inline wrappers + +inline bool SandvikIntegrationEvent::add(SandvikIntegrationEventHandler* handler) +{ + bool res = add_raw(handler); + return res; +} + +inline bool SandvikIntegrationEvent::remove(SandvikIntegrationEventHandler* handler) +{ + bool res = remove_raw(handler); + return res; +} + +/// Event handler for the SandvikPreIntegrationEvent event. +class SandvikPreIntegrationEventHandler : public core::EventHandler { +public: + + /// The function called by CAM when the associated event is fired. + /// eventArgs : Returns an object that provides access to additional information associated with the event. + SANDVIKINTEGRATIONEVENTS_API virtual void notify(const core::Ptr& eventArgs) = 0; +}; + +/// This EventArgs object will be sent with the SandvikPreIntegrationEvent. +class SandvikPreIntegrationEventArgs : public core::EventArgs { +public: + + /// Provides access to the object that is being edited or created. + core::Ptr contextObject() const; + + /// Initially false, this should be set to true to enable the display of the "Set Material" + /// action on the Setup create/edit dialog. + bool showSetMaterial() const; + bool showSetMaterial(bool value); + + /// Initially false, this should be set to true to enable the display of the "Select Tool Assembly" + /// action on the Operation create/edit dialog. + bool showSelectToolAssembly() const; + bool showSelectToolAssembly(bool value); + + /// Initially false, this should be set to true to enable the display of the "Get Tool Recommendation" + /// action on the Operation create/edit dialog. + bool showGetToolRecommendation() const; + bool showGetToolRecommendation(bool value); + + /// Initially false, this should be set to true to enable the display of the "Get Cutting Data" + /// action on the Operation create/edit dialog. + bool showGetCuttingData() const; + bool showGetCuttingData(bool value); + + SANDVIKINTEGRATIONEVENTS_API static const char* classType(); + SANDVIKINTEGRATIONEVENTS_API const char* objectType() const override; + SANDVIKINTEGRATIONEVENTS_API void* queryInterface(const char* id) const override; + SANDVIKINTEGRATIONEVENTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual OperationBase* contextObject_raw() const = 0; + virtual bool showSetMaterial_raw() const = 0; + virtual bool showSetMaterial_raw(bool value) = 0; + virtual bool showSelectToolAssembly_raw() const = 0; + virtual bool showSelectToolAssembly_raw(bool value) = 0; + virtual bool showGetToolRecommendation_raw() const = 0; + virtual bool showGetToolRecommendation_raw(bool value) = 0; + virtual bool showGetCuttingData_raw() const = 0; + virtual bool showGetCuttingData_raw(bool value) = 0; +}; + +// Inline wrappers + +inline core::Ptr SandvikPreIntegrationEventArgs::contextObject() const +{ + core::Ptr res = contextObject_raw(); + return res; +} + +inline bool SandvikPreIntegrationEventArgs::showSetMaterial() const +{ + bool res = showSetMaterial_raw(); + return res; +} + +inline bool SandvikPreIntegrationEventArgs::showSetMaterial(bool value) +{ + return showSetMaterial_raw(value); +} + +inline bool SandvikPreIntegrationEventArgs::showSelectToolAssembly() const +{ + bool res = showSelectToolAssembly_raw(); + return res; +} + +inline bool SandvikPreIntegrationEventArgs::showSelectToolAssembly(bool value) +{ + return showSelectToolAssembly_raw(value); +} + +inline bool SandvikPreIntegrationEventArgs::showGetToolRecommendation() const +{ + bool res = showGetToolRecommendation_raw(); + return res; +} + +inline bool SandvikPreIntegrationEventArgs::showGetToolRecommendation(bool value) +{ + return showGetToolRecommendation_raw(value); +} + +inline bool SandvikPreIntegrationEventArgs::showGetCuttingData() const +{ + bool res = showGetCuttingData_raw(); + return res; +} + +inline bool SandvikPreIntegrationEventArgs::showGetCuttingData(bool value) +{ + return showGetCuttingData_raw(value); +} + +/// Event handler for the SandvikIntegrationEvent event. +class SandvikIntegrationEventHandler : public core::EventHandler { +public: + + /// The function called by CAM when the associated event is fired. + /// eventArgs : Returns an object that provides access to additional information associated with the event. + SANDVIKINTEGRATIONEVENTS_API virtual void notify(const core::Ptr& eventArgs) = 0; +}; + +/// This EventArgs object will be sent with the SandvikIntegrationEvent. +class SandvikIntegrationEventArgs : public core::EventArgs { +public: + + /// The action to be performed -- by convention with Sandvik. + /// Actions include: + /// "selectAssembly" + /// "getToolRecommendation" + /// "getCuttingData" + /// "setMaterial" + std::string action() const; + + /// Provides access to the object that is being edited or created. + core::Ptr contextObject() const; + + SANDVIKINTEGRATIONEVENTS_API static const char* classType(); + SANDVIKINTEGRATIONEVENTS_API const char* objectType() const override; + SANDVIKINTEGRATIONEVENTS_API void* queryInterface(const char* id) const override; + SANDVIKINTEGRATIONEVENTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* action_raw() const = 0; + virtual OperationBase* contextObject_raw() const = 0; +}; + +// Inline wrappers + +inline std::string SandvikIntegrationEventArgs::action() const +{ + std::string res; + + char* p= action_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline core::Ptr SandvikIntegrationEventArgs::contextObject() const +{ + core::Ptr res = contextObject_raw(); + return res; +} +}// namespace cam +}// namespace adsk + +#undef SANDVIKINTEGRATIONEVENTS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Core/.gitignore b/usr/autodesk/CPP/include/Core/.gitignore new file mode 100644 index 0000000..8f613bc --- /dev/null +++ b/usr/autodesk/CPP/include/Core/.gitignore @@ -0,0 +1,9 @@ +* +!.gitignore +!Application/EventHandler.h +!Application/ScriptHandler.h +!Base.h +!Deallocator.h +!Memory.h +!OSMacros.h +!Utils.h diff --git a/usr/autodesk/CPP/include/Core/Base.h b/usr/autodesk/CPP/include/Core/Base.h new file mode 100644 index 0000000..d7e3567 --- /dev/null +++ b/usr/autodesk/CPP/include/Core/Base.h @@ -0,0 +1,127 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "Memory.h" + +// THIS CLASS IS USED BY AN API CLIENT + + +#include "OSMacros.h" + +#ifdef XINTERFACE_EXPORTS +# ifdef __COMPILING_xIBASE_CPP__ +# define xIBASE_API XI_EXPORT +# else +# define xIBASE_API +# endif +#else +# define xIBASE_API XI_IMPORT +#endif + +namespace Ns { + class UniqueString; +} + + +namespace adsk +{ +namespace core +{ + +// Base class for all xInterface classes. The functions in this +// class are visible to and callable by an API client. +// The class does RTTI via the pObject->query() method. +class Base : public ReferenceCounted +{ +public: + + // All xInterface classes (except this one) + // have to implement the following + // and return a unique address that is based on the class name. + // static const char* classType(); + // We will do this via code generation from NIDL. + xIBASE_API static const char* classType(); + + // Get the interfaceId of the most derived (most specific) type of this reference. + virtual const char* objectType() const = 0; + + // Indicates if this object is still valid, i.e. hasn't been deleted + // or some other action done to invalidate the reference. + virtual bool isValid() const = 0; + + // This is used to do RTTI via a templatized pObject->query() method. + // It is used by API clients to do RTTI between xInterface classes. + template + Ptr cast() const; + + // Debug aid to get the total live instance count + xIBASE_API static size_t instances(); +protected: + + xIBASE_API Base(void); + xIBASE_API virtual ~Base(void); + + // This is used to do RTTI via a templatized pObject->query_raw() method. + // It is used internally to do RTTI to implementation (e.g. xLayer) classes + // (API clients will not have the implementation header files and can't do this). + // Public for implementation convenience, but not intended for normal client use. + // The result is equivalent to a cast and no reference count is added to the reference returned. +public: + template + T* query() const + { + return static_cast(this->queryInterface(T::interfaceId())); + } + + // For internal use. Just forwards to classType. + static const char* interfaceId() { return classType(); } +protected: + + // This will be implemented in the xInterface classes via + // code generation from NIDL. + // The result is equivalent to a cast and no reference count is added to the reference returned. + xIBASE_API virtual void* queryInterface(const char* interfaceId) const; + virtual void* queryInterface(const Ns::UniqueString* id) const = 0; + +private: + + virtual void placeholderBase0() {} + virtual void placeholderBase1() {} + virtual void placeholderBase2() {} + virtual void placeholderBase3() {} + virtual void placeholderBase4() {} + virtual void placeholderBase5() {} + virtual void placeholderBase6() {} + virtual void placeholderBase7() {} + virtual void placeholderBase8() {} + virtual void placeholderBase9() {} + virtual void placeholderBase10() {} + virtual void placeholderBase11() {} + virtual void placeholderBase12() {} + virtual void placeholderBase13() {} + virtual void placeholderBase14() {} + virtual void placeholderBase15() {} +}; + + +template +inline Ptr Base::cast() const +{ + T* pT = query(); + return Ptr(pT, false); +} + + +} // namespace core +} // namespace adsk + +#undef xIBASE_API diff --git a/usr/autodesk/CPP/include/Core/Deallocator.h b/usr/autodesk/CPP/include/Core/Deallocator.h new file mode 100644 index 0000000..9ea4062 --- /dev/null +++ b/usr/autodesk/CPP/include/Core/Deallocator.h @@ -0,0 +1,91 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "OSMacros.h" + +#ifdef XINTERFACE_EXPORTS +# ifdef __COMPILING_xIDEALLOCATOR_CPP__ +# define xIDEALLOCATOR_API XI_EXPORT +# else +# define xIDEALLOCATOR_API +# endif +#else +# define xIDEALLOCATOR_API XI_IMPORT +#endif + + +#define DEALLOCATEARRAYINTERNAL(T) \ + namespace adsk { namespace core {\ + xIDEALLOCATOR_API void DeallocateArrayInternal(T* p);\ + }} + +#define DEALLOCATEARRAYINTERNALCLASS(space, T) \ + namespace adsk { namespace space {\ + class T;\ + }}\ + DEALLOCATEARRAYINTERNAL(adsk::space::T*) + +DEALLOCATEARRAYINTERNAL(char) +DEALLOCATEARRAYINTERNAL(char*) +DEALLOCATEARRAYINTERNAL(int) +DEALLOCATEARRAYINTERNAL(short) +DEALLOCATEARRAYINTERNAL(double) +DEALLOCATEARRAYINTERNAL(bool) +DEALLOCATEARRAYINTERNAL(float) +DEALLOCATEARRAYINTERNAL(size_t) +DEALLOCATEARRAYINTERNALCLASS(core, Attribute) +DEALLOCATEARRAYINTERNALCLASS(core, DataFile) +DEALLOCATEARRAYINTERNALCLASS(core, DataFolder) +DEALLOCATEARRAYINTERNALCLASS(core, DataHub) +DEALLOCATEARRAYINTERNALCLASS(core, DataProject) +DEALLOCATEARRAYINTERNALCLASS(core, Point3D) +DEALLOCATEARRAYINTERNALCLASS(core, Point2D) +DEALLOCATEARRAYINTERNALCLASS(core, CommandDefinition) +DEALLOCATEARRAYINTERNALCLASS(core, Vector3D) +DEALLOCATEARRAYINTERNALCLASS(core, Vector2D) +DEALLOCATEARRAYINTERNALCLASS(core, Color) +DEALLOCATEARRAYINTERNALCLASS(core, Base) +DEALLOCATEARRAYINTERNALCLASS(core, Curve3D) +DEALLOCATEARRAYINTERNALCLASS(core, User) +DEALLOCATEARRAYINTERNALCLASS(core, Selection) +DEALLOCATEARRAYINTERNALCLASS(fusion, BRepBody) +DEALLOCATEARRAYINTERNALCLASS(fusion, BRepEdge) +DEALLOCATEARRAYINTERNALCLASS(fusion, BRepLoop) +DEALLOCATEARRAYINTERNALCLASS(fusion, BRepFace) +DEALLOCATEARRAYINTERNALCLASS(fusion, ConstructionPlane) +DEALLOCATEARRAYINTERNALCLASS(fusion, ConstructionPoint) +DEALLOCATEARRAYINTERNALCLASS(fusion, ConstructionAxis) +DEALLOCATEARRAYINTERNALCLASS(fusion, Sketch) +DEALLOCATEARRAYINTERNALCLASS(fusion, MeshBody) +DEALLOCATEARRAYINTERNALCLASS(fusion, Occurrence) +DEALLOCATEARRAYINTERNALCLASS(fusion, SketchCurve) +DEALLOCATEARRAYINTERNALCLASS(fusion, SketchEntity) +DEALLOCATEARRAYINTERNALCLASS(fusion, SketchLine) +DEALLOCATEARRAYINTERNALCLASS(fusion, Joint) +DEALLOCATEARRAYINTERNALCLASS(fusion, AsBuiltJoint) +DEALLOCATEARRAYINTERNALCLASS(fusion, RigidGroup) +DEALLOCATEARRAYINTERNALCLASS(fusion, JointOrigin) +DEALLOCATEARRAYINTERNALCLASS(fusion, CustomGraphicsCoordinates) +DEALLOCATEARRAYINTERNALCLASS(cam, Machine) +DEALLOCATEARRAYINTERNALCLASS(cam, MachineDescription) + +namespace adsk +{ +namespace core +{ + // delete an allocated address returned from an interface + template void DeallocateArray(T* p) { DeallocateArrayInternal(p); } + +} // namespace core +} // namespace adsk + +#undef xIDEALLOCATOR_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Core/Memory.h b/usr/autodesk/CPP/include/Core/Memory.h new file mode 100644 index 0000000..2e1edf9 --- /dev/null +++ b/usr/autodesk/CPP/include/Core/Memory.h @@ -0,0 +1,190 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include +#include +#include + +// THESE TYPES ARE USED BY AN API CLIENT + +#include "OSMacros.h" +#include "Deallocator.h" + +#ifdef XINTERFACE_EXPORTS +# ifdef __COMPILING_xIMEMORY_CPP__ +# define xIMEMORY_API XI_EXPORT +# else +# define xIMEMORY_API +# endif +#else +# define xIMEMORY_API XI_IMPORT +#endif + +namespace adsk +{ +namespace core +{ + +template class Iterator; + +class ReferenceCounted +{ +public: + // Reference counting on the interface. all interfaces returned from apis will have a reference count of + // at least one, and the caller is responsible for calling release. This reference counting should be hidden + // from clients through smart pointer wrappers defined in the interface. + virtual void addref() = 0; + virtual void release() = 0; + virtual int refcount() const = 0; +}; + +class IncompleteType +{ +public: + template static void addref(void* ptr) { reinterpret_cast(ptr)->addref(); } + template static void release(void* ptr) { reinterpret_cast(ptr)->release(); } +}; + +class CompleteType +{ +public: + template static void addref(T* ptr) { ptr->addref(); } + template static void release(T* ptr) { ptr->release(); } +}; + +template +class Ptr +{ +public: + + typedef T element_type; + + Ptr() : ptr_(nullptr) {} + Ptr(const Ptr& rhs) : ptr_(nullptr) { reset(rhs.ptr_); } + Ptr(const T* ptr, bool attach = true) : ptr_(nullptr) { reset(ptr, attach); } + + // casting constructor. call operator bool to verify if cast was successful + template + Ptr(const Ptr& rhs) : ptr_(nullptr) { + if (rhs) + reset(rhs->template query(), false); + } + + ~Ptr() { reset(nullptr); } + + void operator=(const Ptr& rhs) { if (&rhs != this) reset(rhs.ptr_); } + void operator=(const T* ptr) { reset(ptr, true); } + + // casting assignment operator. call operator bool to verify if cast was successful + template + void operator=(const Ptr& rhs) { + if (rhs) + reset(rhs->template query(), false); + else + reset(nullptr); + } + + void reset(const T* ptr, bool attach = false) { + if (ptr_ != ptr) + { + if (ptr_) + PT::template release(ptr_); + ptr_ = const_cast(ptr); + if (!attach && ptr_) + PT::template addref(ptr_); + } + } + + T* operator->() const { assert(ptr_ != nullptr); if (ptr_ == nullptr) throw std::exception(); return ptr_; } + + // Test if this pointer is empty (if operator-> will throw) + /*explicit*/ operator bool() const { return ptr_ != nullptr; } + + bool operator==(const Ptr& rhs) const { return ptr_ == rhs.ptr_; } + bool operator!=(const Ptr& rhs) const { return ptr_ != rhs.ptr_; } + bool operator<(const Ptr& rhs) const { return ptr_ < rhs.ptr_; } + + + // Iteration support. Only usable if T has count and item members and an iterable_type + typedef Iterator iterator; + iterator begin() const { return Iterator(*this); } + iterator end() const { return Iterator(*this, true); } + + // Caution the following functions if used incorrectly can cause a reference count leak + T* get() const { return ptr_; } + T* detach() { T* t = ptr_; ptr_ = nullptr; return t; } + +private: + + T* ptr_; +}; + + +template +class Iterator : public std::iterator> +{ +public: + + Iterator(const Ptr& container, bool end = false) : container_(container), i_(0), end_(end) + { if (!end && container_->count() == 0) end_ = true; assert(container_); } + Iterator(const Iterator& rhs) : container_(rhs.container_), current_(rhs.current_), i_(rhs.i_), end_(rhs.end_) {} + + Iterator& operator++() + { + assert(!end_); // undefined to advance an iterator at end, but just noop + if (!end_) + { + current_.reset(nullptr); + assert(container_); // should never fire unless constructed improperly + size_t count = container_->count(); + if (i_ < count) + ++i_; + if (i_ >= count) + end_ = true; + } + return *this; + } + + typename Iterator::value_type& operator*() + { + assert(!end_); + assert(container_); // should never fire unless constructed improplerly + if (!end_ && !current_ && container_) + { + current_ = container_->item(i_); + assert(current_); // assume container is not poplulated with null values, so this should indicate a container error, check getLastError + } + return current_; + } + + bool operator==(const Iterator& rhs) const + { + return container_ == rhs.container_ && end_ == rhs.end_ && (end_ || i_ == rhs.i_); + } + + Iterator operator++(int) { Iterator tmp(*this); operator++(); return tmp; } + typename Iterator::value_type& operator->() { return operator*(); } + bool operator!=(const Iterator& rhs) const { return !operator==(rhs); } + + +private: + + Ptr container_; + typename Iterator::value_type current_; + size_t i_; + bool end_; +}; + +} // namespace core +} // namespace adsk + +#undef xIMEMORY_API diff --git a/usr/autodesk/CPP/include/Core/OSMacros.h b/usr/autodesk/CPP/include/Core/OSMacros.h new file mode 100644 index 0000000..2e79397 --- /dev/null +++ b/usr/autodesk/CPP/include/Core/OSMacros.h @@ -0,0 +1,27 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#if defined(_WINDOWS) || defined(_WIN64) +# define XI_WIN +#elif defined(__APPLE__) && defined(__MACH__) +# define XI_OSX +#else +# error "Operating System Not Supported By Neutron. Only Windows and Mac OS X Supported" +#endif + +#if defined(XI_WIN) +# define XI_EXPORT __declspec(dllexport) +# define XI_IMPORT __declspec(dllimport) +#elif defined(XI_OSX) +# define XI_EXPORT __attribute__ ((visibility("default"))) +# define XI_IMPORT +#endif \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Core/Utils.h b/usr/autodesk/CPP/include/Core/Utils.h new file mode 100644 index 0000000..8bd457f --- /dev/null +++ b/usr/autodesk/CPP/include/Core/Utils.h @@ -0,0 +1,35 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "OSMacros.h" + +#ifdef XINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_UTILS_CPP__ +# define ADSK_UTILS_API XI_EXPORT +# else +# define ADSK_UTILS_API +# endif +#else +# define ADSK_UTILS_API XI_IMPORT +#endif + + +namespace adsk +{ + ADSK_UTILS_API bool terminate(); + + ADSK_UTILS_API bool autoTerminate(); + + ADSK_UTILS_API bool autoTerminate(bool value); + + ADSK_UTILS_API bool doEvents(); +} // namespace adsk \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Drawing/Drawing/Drawing.h b/usr/autodesk/CPP/include/Drawing/Drawing/Drawing.h new file mode 100644 index 0000000..5fd06e4 --- /dev/null +++ b/usr/autodesk/CPP/include/Drawing/Drawing/Drawing.h @@ -0,0 +1,63 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Application/Product.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef DRAWINGXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_DRAWING_DRAWING_CPP__ +# define ADSK_DRAWING_DRAWING_API XI_EXPORT +# else +# define ADSK_DRAWING_DRAWING_API +# endif +#else +# define ADSK_DRAWING_DRAWING_API XI_IMPORT +#endif + +namespace adsk { namespace drawing { + class DrawingExportManager; +}} + +namespace adsk { namespace drawing { + +/// Object that represents the drawing specific data within a drawing document. +class Drawing : public core::Product { +public: + + /// Returns the DrawingExportManager for this drawing. You use the ExportManager + /// to export the drawing in various formats. + core::Ptr exportManager() const; + + ADSK_DRAWING_DRAWING_API static const char* classType(); + ADSK_DRAWING_DRAWING_API const char* objectType() const override; + ADSK_DRAWING_DRAWING_API void* queryInterface(const char* id) const override; + ADSK_DRAWING_DRAWING_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual DrawingExportManager* exportManager_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr Drawing::exportManager() const +{ + core::Ptr res = exportManager_raw(); + return res; +} +}// namespace drawing +}// namespace adsk + +#undef ADSK_DRAWING_DRAWING_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Drawing/Drawing/DrawingDocument.h b/usr/autodesk/CPP/include/Drawing/Drawing/DrawingDocument.h new file mode 100644 index 0000000..c0f5ca6 --- /dev/null +++ b/usr/autodesk/CPP/include/Drawing/Drawing/DrawingDocument.h @@ -0,0 +1,62 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Application/Document.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef DRAWINGXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_DRAWING_DRAWINGDOCUMENT_CPP__ +# define ADSK_DRAWING_DRAWINGDOCUMENT_API XI_EXPORT +# else +# define ADSK_DRAWING_DRAWINGDOCUMENT_API +# endif +#else +# define ADSK_DRAWING_DRAWINGDOCUMENT_API XI_IMPORT +#endif + +namespace adsk { namespace drawing { + class Drawing; +}} + +namespace adsk { namespace drawing { + +/// Object that represents a Fusion 360 drawing document. +class DrawingDocument : public core::Document { +public: + + /// Returns the Drawing product object associated with this drawing document. + core::Ptr drawing() const; + + ADSK_DRAWING_DRAWINGDOCUMENT_API static const char* classType(); + ADSK_DRAWING_DRAWINGDOCUMENT_API const char* objectType() const override; + ADSK_DRAWING_DRAWINGDOCUMENT_API void* queryInterface(const char* id) const override; + ADSK_DRAWING_DRAWINGDOCUMENT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Drawing* drawing_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr DrawingDocument::drawing() const +{ + core::Ptr res = drawing_raw(); + return res; +} +}// namespace drawing +}// namespace adsk + +#undef ADSK_DRAWING_DRAWINGDOCUMENT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Drawing/Drawing/DrawingExportManager.h b/usr/autodesk/CPP/include/Drawing/Drawing/DrawingExportManager.h new file mode 100644 index 0000000..3ec3a7a --- /dev/null +++ b/usr/autodesk/CPP/include/Drawing/Drawing/DrawingExportManager.h @@ -0,0 +1,81 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../DrawingTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef DRAWINGXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_DRAWING_DRAWINGEXPORTMANAGER_CPP__ +# define ADSK_DRAWING_DRAWINGEXPORTMANAGER_API XI_EXPORT +# else +# define ADSK_DRAWING_DRAWINGEXPORTMANAGER_API +# endif +#else +# define ADSK_DRAWING_DRAWINGEXPORTMANAGER_API XI_IMPORT +#endif + +namespace adsk { namespace drawing { + class DrawingExportOptions; + class PDFExportOptions; +}} + +namespace adsk { namespace drawing { + +/// Provides support to export the drawing in various formats. +class DrawingExportManager : public core::Base { +public: + + /// Defines the various settings for a STEP export. + /// filename : The name of the file to export to. Use settings on the returned PDFExportOptions + /// object to change other settings. + /// Returns a PDFExportOptions object if successful and null if it should fail. + core::Ptr createPDFExportOptions(const std::string& filename); + + /// Executes the export operation to create the file in the format specified by the input ExportOptions object. + /// exportOptions : A DrawingExportOptions object that is created using one of the create methods on the DrawingExportManager object. + /// This defines the type of export and defines the options supported for that file type. + /// Returns true if the export was successful. + bool execute(const core::Ptr& exportOptions); + + ADSK_DRAWING_DRAWINGEXPORTMANAGER_API static const char* classType(); + ADSK_DRAWING_DRAWINGEXPORTMANAGER_API const char* objectType() const override; + ADSK_DRAWING_DRAWINGEXPORTMANAGER_API void* queryInterface(const char* id) const override; + ADSK_DRAWING_DRAWINGEXPORTMANAGER_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual PDFExportOptions* createPDFExportOptions_raw(const char * filename) = 0; + virtual bool execute_raw(DrawingExportOptions* exportOptions) = 0; +}; + +// Inline wrappers + +inline core::Ptr DrawingExportManager::createPDFExportOptions(const std::string& filename) +{ + core::Ptr res = createPDFExportOptions_raw(filename.c_str()); + return res; +} + +inline bool DrawingExportManager::execute(const core::Ptr& exportOptions) +{ + bool res = execute_raw(exportOptions.get()); + return res; +} +}// namespace drawing +}// namespace adsk + +#undef ADSK_DRAWING_DRAWINGEXPORTMANAGER_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Drawing/Drawing/DrawingExportOptions.h b/usr/autodesk/CPP/include/Drawing/Drawing/DrawingExportOptions.h new file mode 100644 index 0000000..01fd2bc --- /dev/null +++ b/usr/autodesk/CPP/include/Drawing/Drawing/DrawingExportOptions.h @@ -0,0 +1,106 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../DrawingTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef DRAWINGXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_DRAWING_DRAWINGEXPORTOPTIONS_CPP__ +# define ADSK_DRAWING_DRAWINGEXPORTOPTIONS_API XI_EXPORT +# else +# define ADSK_DRAWING_DRAWINGEXPORTOPTIONS_API +# endif +#else +# define ADSK_DRAWING_DRAWINGEXPORTOPTIONS_API XI_IMPORT +#endif + +namespace adsk { namespace drawing { + +/// The base class for the different drawing export types. This class is never directly used +/// in an export because you need the specific export type to specify the type of +/// export to be performed. +class DrawingExportOptions : public core::Base { +public: + + /// Gets and sets the filename that the exported file will be written to. + std::string filename() const; + bool filename(const std::string& value); + + ADSK_DRAWING_DRAWINGEXPORTOPTIONS_API static const char* classType(); + ADSK_DRAWING_DRAWINGEXPORTOPTIONS_API const char* objectType() const override; + ADSK_DRAWING_DRAWINGEXPORTOPTIONS_API void* queryInterface(const char* id) const override; + ADSK_DRAWING_DRAWINGEXPORTOPTIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* filename_raw() const = 0; + virtual bool filename_raw(const char * value) = 0; + virtual void placeholderDrawingExportOptions0() {} + virtual void placeholderDrawingExportOptions1() {} + virtual void placeholderDrawingExportOptions2() {} + virtual void placeholderDrawingExportOptions3() {} + virtual void placeholderDrawingExportOptions4() {} + virtual void placeholderDrawingExportOptions5() {} + virtual void placeholderDrawingExportOptions6() {} + virtual void placeholderDrawingExportOptions7() {} + virtual void placeholderDrawingExportOptions8() {} + virtual void placeholderDrawingExportOptions9() {} + virtual void placeholderDrawingExportOptions10() {} + virtual void placeholderDrawingExportOptions11() {} + virtual void placeholderDrawingExportOptions12() {} + virtual void placeholderDrawingExportOptions13() {} + virtual void placeholderDrawingExportOptions14() {} + virtual void placeholderDrawingExportOptions15() {} + virtual void placeholderDrawingExportOptions16() {} + virtual void placeholderDrawingExportOptions17() {} + virtual void placeholderDrawingExportOptions18() {} + virtual void placeholderDrawingExportOptions19() {} + virtual void placeholderDrawingExportOptions20() {} + virtual void placeholderDrawingExportOptions21() {} + virtual void placeholderDrawingExportOptions22() {} + virtual void placeholderDrawingExportOptions23() {} + virtual void placeholderDrawingExportOptions24() {} + virtual void placeholderDrawingExportOptions25() {} + virtual void placeholderDrawingExportOptions26() {} + virtual void placeholderDrawingExportOptions27() {} + virtual void placeholderDrawingExportOptions28() {} + virtual void placeholderDrawingExportOptions29() {} +}; + +// Inline wrappers + +inline std::string DrawingExportOptions::filename() const +{ + std::string res; + + char* p= filename_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool DrawingExportOptions::filename(const std::string& value) +{ + return filename_raw(value.c_str()); +} +}// namespace drawing +}// namespace adsk + +#undef ADSK_DRAWING_DRAWINGEXPORTOPTIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Drawing/Drawing/PDFExportOptions.h b/usr/autodesk/CPP/include/Drawing/Drawing/PDFExportOptions.h new file mode 100644 index 0000000..56e388f --- /dev/null +++ b/usr/autodesk/CPP/include/Drawing/Drawing/PDFExportOptions.h @@ -0,0 +1,133 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../DrawingTypeDefs.h" +#include "DrawingExportOptions.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef DRAWINGXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_DRAWING_PDFEXPORTOPTIONS_CPP__ +# define ADSK_DRAWING_PDFEXPORTOPTIONS_API XI_EXPORT +# else +# define ADSK_DRAWING_PDFEXPORTOPTIONS_API +# endif +#else +# define ADSK_DRAWING_PDFEXPORTOPTIONS_API XI_IMPORT +#endif + +namespace adsk { namespace drawing { + +/// Defines the inputs needed to export the drawing as PDF. +class PDFExportOptions : public DrawingExportOptions { +public: + + /// Defines which sheets to export. Defaults to AllPDFSheets which + /// will create a single PDF file containing all sheets in the drawing. + /// the SelectedPDFSheets and CurrentPDFSheet options are dependent on + /// the current selections in the user interface. + /// To set this to RangePDFSheets, use the sheetRange property to define + /// the range of sheets to print. + PDFSheetsExport sheetsToExport() const; + bool sheetsToExport(PDFSheetsExport value); + + /// Defines the range of sheets to export. This can be a string like + /// "1-3" or "1-2,5" where you can define a range of sheets and also + /// specific sheets. Setting this property will automatically set + /// the sheetsToExport setting to SelectedPDFSheets. + std::string sheetRange() const; + bool sheetRange(const std::string& value); + + /// Specifies that the PDF file will be opened after export. + bool openPDF() const; + bool openPDF(bool value); + + /// Specifies if line weights should be used in the exported PDF file. + bool useLineWeights() const; + bool useLineWeights(bool value); + + ADSK_DRAWING_PDFEXPORTOPTIONS_API static const char* classType(); + ADSK_DRAWING_PDFEXPORTOPTIONS_API const char* objectType() const override; + ADSK_DRAWING_PDFEXPORTOPTIONS_API void* queryInterface(const char* id) const override; + ADSK_DRAWING_PDFEXPORTOPTIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual PDFSheetsExport sheetsToExport_raw() const = 0; + virtual bool sheetsToExport_raw(PDFSheetsExport value) = 0; + virtual char* sheetRange_raw() const = 0; + virtual bool sheetRange_raw(const char * value) = 0; + virtual bool openPDF_raw() const = 0; + virtual bool openPDF_raw(bool value) = 0; + virtual bool useLineWeights_raw() const = 0; + virtual bool useLineWeights_raw(bool value) = 0; +}; + +// Inline wrappers + +inline PDFSheetsExport PDFExportOptions::sheetsToExport() const +{ + PDFSheetsExport res = sheetsToExport_raw(); + return res; +} + +inline bool PDFExportOptions::sheetsToExport(PDFSheetsExport value) +{ + return sheetsToExport_raw(value); +} + +inline std::string PDFExportOptions::sheetRange() const +{ + std::string res; + + char* p= sheetRange_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool PDFExportOptions::sheetRange(const std::string& value) +{ + return sheetRange_raw(value.c_str()); +} + +inline bool PDFExportOptions::openPDF() const +{ + bool res = openPDF_raw(); + return res; +} + +inline bool PDFExportOptions::openPDF(bool value) +{ + return openPDF_raw(value); +} + +inline bool PDFExportOptions::useLineWeights() const +{ + bool res = useLineWeights_raw(); + return res; +} + +inline bool PDFExportOptions::useLineWeights(bool value) +{ + return useLineWeights_raw(value); +} +}// namespace drawing +}// namespace adsk + +#undef ADSK_DRAWING_PDFEXPORTOPTIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Drawing/DrawingAll.h b/usr/autodesk/CPP/include/Drawing/DrawingAll.h new file mode 100644 index 0000000..d994119 --- /dev/null +++ b/usr/autodesk/CPP/include/Drawing/DrawingAll.h @@ -0,0 +1,6 @@ +#include +#include +#include +#include +#include +#include diff --git a/usr/autodesk/CPP/include/Drawing/DrawingTypeDefs.h b/usr/autodesk/CPP/include/Drawing/DrawingTypeDefs.h new file mode 100644 index 0000000..bcffe4f --- /dev/null +++ b/usr/autodesk/CPP/include/Drawing/DrawingTypeDefs.h @@ -0,0 +1,24 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once + +namespace adsk { namespace drawing { + +/// The various options that define which sheets to print. +enum PDFSheetsExport +{ + AllPDFSheetsExport, + SelectedPDFSheetsExport, + CurrentPDFSheetExport, + RangePDFSheetsExport +}; +}// namespace drawing +}// namespace adsk diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepBodies.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepBodies.h new file mode 100644 index 0000000..27afee2 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepBodies.h @@ -0,0 +1,126 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPBODIES_CPP__ +# define ADSK_FUSION_BREPBODIES_API XI_EXPORT +# else +# define ADSK_FUSION_BREPBODIES_API +# endif +#else +# define ADSK_FUSION_BREPBODIES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class BRepBody; +}} + +namespace adsk { namespace fusion { + +/// The BRepBodies collection provides access to all of the B-Rep +/// bodies within a component. +class BRepBodies : public core::Base { +public: + + /// Function that returns the specified body using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns a specific body using the name of the body within the collection. + /// name : The name of the body, as seen in the browser, to return. + /// The BRepBody or null if a body with the defined name is not found. + core::Ptr itemByName(const std::string& name) const; + + /// Returns the number of bodies in the collection. + size_t count() const; + + /// Creates a new BRepBody object. The input can be a persisted or transient BRepBody and the + /// result is a persisted BRepBody. In a model where the design history is ignored (direct edit model) + /// the BRepBody is created within the component the BRepBodies collection was obtained from. In + /// a model where the design history is captured (parametric model), the new BRepBody is created + /// within the specified Base Feature. + /// Because of a current limitation, if you want to create a BRepBody in a parametric model, + /// you must first call the edit method of the base feature, then use the add method to create + /// the body, and finally call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + /// body : The input BRepBody. Typically this is a transient BRepBody but that's not a requirement. In + /// any case, there is not any association back to the original BRepBody. + /// targetBaseFeature : The BaseFeature object that this B-Rep body will be associated with. This is an optional + /// requirement but is required when the model design history is being captured (parametric model) but is + /// ignored otherwise (direct edit model). + /// Returns the newly created BRepBody or null if the creation failed. + core::Ptr add(const core::Ptr& body, const core::Ptr& targetBaseFeature = NULL); + + typedef BRepBody iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BREPBODIES_API static const char* classType(); + ADSK_FUSION_BREPBODIES_API const char* objectType() const override; + ADSK_FUSION_BREPBODIES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPBODIES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepBody* item_raw(size_t index) const = 0; + virtual BRepBody* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual BRepBody* add_raw(BRepBody* body, BaseFeature* targetBaseFeature) = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepBodies::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr BRepBodies::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t BRepBodies::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr BRepBodies::add(const core::Ptr& body, const core::Ptr& targetBaseFeature) +{ + core::Ptr res = add_raw(body.get(), targetBaseFeature.get()); + return res; +} + +template inline void BRepBodies::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPBODIES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepBody.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepBody.h new file mode 100644 index 0000000..f683fd5 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepBody.h @@ -0,0 +1,681 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/CoreTypeDefs.h" +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPBODY_CPP__ +# define ADSK_FUSION_BREPBODY_API XI_EXPORT +# else +# define ADSK_FUSION_BREPBODY_API +# endif +#else +# define ADSK_FUSION_BREPBODY_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class BRepEdges; + class BRepFaces; + class BRepLumps; + class BRepShells; + class BRepVertices; + class BRepWires; + class Component; + class MeshManager; + class Occurrence; + class PhysicalProperties; +}} +namespace adsk { namespace core { + class Appearance; + class Attributes; + class BoundingBox3D; + class Material; + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// Represents a B-Rep (Boundary Representation) body. +class BRepBody : public core::Base { +public: + + /// Returns the component this body is owned by. + core::Ptr parentComponent() const; + + /// Returns a collection of all of the lumps in the body. + core::Ptr lumps() const; + + /// Returns a collection of all of the shells in the body. + core::Ptr shells() const; + + /// Returns a collection of all of the faces in the body. + core::Ptr faces() const; + + /// Returns a collection of all of the edges in the body. + core::Ptr edges() const; + + /// Returns a collection of all of the vertices in the body. + core::Ptr vertices() const; + + /// Returns whether this body is closed (solid) or not. + bool isSolid() const; + + /// Returns the bounding box of this body. + core::Ptr boundingBox() const; + + /// Returns all of the edges that connect concave faces. + core::Ptr concaveEdges() const; + + /// Returns all of the edges that connect convex faces. + core::Ptr convexEdges() const; + + /// Returns the area in cm ^ 2. + double area() const; + + /// Returns the volume in cm ^ 3. Returns 0 in the case the body is not solid. + double volume() const; + + /// Determines the relationship of the input point with respect to this body. + /// point : The point to do the containment check for. + /// Returns a value from the PointContainment enum indicating the relationship of + /// the input point to the body. + PointContainment pointContainment(const core::Ptr& point); + + /// Indicates if this body is represented in the model or is transient. + bool isTransient() const; + + /// Gets and sets the name of the body. + /// This property is only valid if the IsTransient property is false. + std::string name() const; + bool name(const std::string& value); + + /// Gets if this body is currently visible in the graphics window. Use the + /// isLightBulbOn to change if the light bulb beside the body node in the + /// browser is on or not. Parent nodes in the browser can have their light + /// bulb off which affects all of their children. This property indicates + /// the final result and whether this body is actually visible or not. + /// This property is only valid if the IsTransient property is false. + bool isVisible() const; + bool isVisible(bool value); + + /// Gets and sets if this body is selectable. + /// This property is only valid if the IsTransient property is false. + bool isSelectable() const; + bool isSelectable(bool value); + + /// Deletes the body. + /// This property is only valid if the IsTransient property is false. + /// Returns true if the delete was successful. + bool deleteMe(); + + /// Copies the body to the clipboard. + /// This property is only valid if the IsTransient property is false. + /// Returns true if the copy was successful. + bool copy(); + + /// Cuts the body to the clipboard. + /// This property is only valid if the IsTransient property is false. + /// Returns true if the cut was successful. + bool cut(); + + /// Read-write property that gets and sets the current appearance of the body. Setting this property will result in applying + /// an override appearance to the body and the AppearanceSourceType property will return OverrideAppearanceSource. Setting + /// this property to null will remove any override. + /// This property is only valid if the IsTransient property is false. + core::Ptr appearance() const; + bool appearance(const core::Ptr& value); + + /// Read-write property that gets the source of the appearance for the body. If this returns OverrideAppearanceSource, an override exists + /// on this body. The override can be removed by setting the Appearance property to null. + /// This property is only valid if the IsTransient property is false. + core::AppearanceSourceTypes appearanceSourceType() const; + + /// Gets and sets the material assigned to this body. + /// This property is only valid if the IsTransient property is false. + core::Ptr material() const; + bool material(const core::Ptr& value); + + /// Returns the mesh manager object for this body. + core::Ptr meshManager() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this + /// object in an assembly. This is only valid in the case where this + /// BRepBody object is acting as a proxy in an assembly. Returns null + /// in the case where the object is not in the context of an assembly. + /// but is already the native object. Also returns null in the case + /// where this body is transient. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// This method is only valid if the IsTransient property is false. + /// occurrence : The occurrence that defines the context for the created proxy. + /// Returns the new BRepBoy proxy or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Creates a new component and occurrence within the component that currently owns this body. + /// This body is moved into the new component and returned. The newly created component can be + /// obtained by using the parentComponent property of the BRepBody object. + /// This method is only valid if the IsTransient property is false. + /// Returns the BRrepBody in the new component or null in the case the creation failed. + core::Ptr createComponent(); + + /// Moves this body from it's current component into the root component or the component owned by the + /// specified occurrence. + /// target : The target can be either the root component or an occurrence. + /// In the case where an occurrence is specified, the body will be moved into the parent component of the target + /// occurrence and the target occurrence defines the transform of how the body will be copied so that the body + /// maintains it's same position with respect to the assembly. + /// Returns the moved BRepBody or null in the case the move failed. + core::Ptr moveToComponent(const core::Ptr& target); + + /// Creates a copy of this body into the specified target. + /// target : The target can be either the root component or an occurrence. + /// In the case where an occurrence is specified, the body will be copied into the parent component of the target + /// occurrence and the target occurrence defines the transform of how the body will be copied so that the body + /// maintains it's same position with respect to the assembly. + /// If target is null, then a copy of the body is created in the owning component of the original body. + /// Returns the moved BRepBody or null in the case the move failed. + core::Ptr copyToComponent(const core::Ptr& target); + + /// Returns the PhysicalProperties object that has properties for getting the area, density, mass, volume, moments, etc + /// of this body. Property values will be calculated using the 'LowCalculationAccuracy' setting when using this property + /// to get the PhysicalProperties object. To specify a higher calculation tolerance, use the getPhysicalProperties method + /// on the Design class instead. + core::Ptr physicalProperties() const; + + /// Gets and set if the light bulb beside the body node in the + /// browser is on or not. Parent nodes in the browser can have their light + /// bulb off which affects all of their children so this property does not + /// indicate if the body is actually visible, just that it should be visible + /// if all of it's parent nodes are also visible. Use the isVisible property + /// to determine if it's actually visible. + /// This property is only valid if the IsTransient property is false. + bool isLightBulbOn() const; + bool isLightBulbOn(bool value); + + /// Returns the collection of attributes associated with this face. + core::Ptr attributes() const; + + /// If this body is associated with a base feature, this property will return that base feature. + /// If it's not associated with a base feature, this property will return null. + core::Ptr baseFeature() const; + + /// Creates a new body where the faces and edges are converted to different + /// types of geometry based on the input options. This is particularly useful + /// when you need a body made up entirely of NURBS surfaces. + /// The tempId on the faces, edges, and vertices on the new body will match + /// with the corresponding tempId on the original body. In cases where faces are + /// split as a result of the conversion there can be more than one face or edge in + /// the new body that matches to a single face or edge in the original body. The + /// findByTempId method will find the entity with the matching id. + /// options : Input options that define how the conversion should be done. These are + /// bitwise options so they can be combined. + /// Returns the new converted body or null in the case of failure. + core::Ptr convert(BRepConvertOptions options); + + /// Returns all of the faces, edges, or vertices that match the input ID. + /// tempId : The ID of the B-Rep entity to find. + /// Returns an array of entities that have the specified ID. This + /// returns an array because it's possible that a body created by converting a + /// body can have multiple entities with the same ID in the case where a curve + /// or face was split. Returns an empty array in the case where no match is found. + std::vector> findByTempId(int tempId); + + /// Gets and sets the opacity override assigned to this body. A value of 1.0 specifies + /// that is it completely opaque and a value of 0.0 specifies that is it completely transparent. + /// This value is not necessarily related to what the user sees because the opacity is inherited. + /// For example, if you this body is in a component and that component's opacity is set to something + /// other than 1.0, the body will also be shown as slightly transparent even though the opacity + /// property for the body will return 1.0. Because the component that contains the body can be + /// referenced as an occurrence in other components and they can have different opacity settings, + /// it's possible that different instances of the same body can display using different opacity levels. + /// To get the opacity that it is being displayed with use the BrepBody.visibleOpacity property. + /// This is the API equivalent of the "Opacity Control" command available for the body in the browser. + double opacity() const; + bool opacity(double value); + + /// The user can set an override opacity for components and bodies these opacity overrides combine if + /// children and parent components have overrides. This property returns the actual opacity that is + /// being used to render the body. To set the opacity use the opacity property of the BRepBody object. + double visibleOpacity() const; + + /// Returns the current revision ID of the body. This ID changes any time the body is modified in any way. By getting + /// and saving the ID when you create any data that is dependent on the body, you can then compare the saved + /// ID with the current ID to determine if the body has changed to know if you should update your data. + std::string revisionId() const; + + /// Returns any wire bodies that exist within this body. + core::Ptr wires() const; + + /// Indicates if this body is represented in the model or is temporary. + bool isTemporary() const; + + /// Returns a token for the BRepBody object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same body. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + /// This is only valid for bodies that exist in the design, (the isTemporary + /// property is false). + std::string entityToken() const; + + /// Returns the PhysicalProperties object that has properties for getting the area, density, mass, volume, moments, etc + /// of this body. + /// accuracy : Specifies the desired level of computational accuracy of the property calculations. + /// The default value of 'LowCalculationAccuracy' returns results within a +/- 1% error margin. + core::Ptr getPhysicalProperties(CalculationAccuracy accuracy = adsk::fusion::LowCalculationAccuracy) const; + + ADSK_FUSION_BREPBODY_API static const char* classType(); + ADSK_FUSION_BREPBODY_API const char* objectType() const override; + ADSK_FUSION_BREPBODY_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPBODY_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Component* parentComponent_raw() const = 0; + virtual BRepLumps* lumps_raw() const = 0; + virtual BRepShells* shells_raw() const = 0; + virtual BRepFaces* faces_raw() const = 0; + virtual BRepEdges* edges_raw() const = 0; + virtual BRepVertices* vertices_raw() const = 0; + virtual bool isSolid_raw() const = 0; + virtual core::BoundingBox3D* boundingBox_raw() const = 0; + virtual BRepEdges* concaveEdges_raw() const = 0; + virtual BRepEdges* convexEdges_raw() const = 0; + virtual double area_raw() const = 0; + virtual double volume_raw() const = 0; + virtual PointContainment pointContainment_raw(core::Point3D* point) = 0; + virtual bool isTransient_raw() const = 0; + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual bool isVisible_raw() const = 0; + virtual bool isVisible_raw(bool value) = 0; + virtual bool isSelectable_raw() const = 0; + virtual bool isSelectable_raw(bool value) = 0; + virtual bool deleteMe_raw() = 0; + virtual bool copy_raw() = 0; + virtual bool cut_raw() = 0; + virtual core::Appearance* appearance_raw() const = 0; + virtual bool appearance_raw(core::Appearance* value) = 0; + virtual core::AppearanceSourceTypes appearanceSourceType_raw() const = 0; + virtual core::Material* material_raw() const = 0; + virtual bool material_raw(core::Material* value) = 0; + virtual MeshManager* meshManager_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual BRepBody* nativeObject_raw() const = 0; + virtual BRepBody* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual BRepBody* createComponent_raw() = 0; + virtual BRepBody* moveToComponent_raw(core::Base* target) = 0; + virtual BRepBody* copyToComponent_raw(core::Base* target) = 0; + virtual PhysicalProperties* physicalProperties_raw() const = 0; + virtual bool isLightBulbOn_raw() const = 0; + virtual bool isLightBulbOn_raw(bool value) = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual BaseFeature* baseFeature_raw() const = 0; + virtual BRepBody* convert_raw(BRepConvertOptions options) = 0; + virtual core::Base** findByTempId_raw(int tempId, size_t& return_size) = 0; + virtual double opacity_raw() const = 0; + virtual bool opacity_raw(double value) = 0; + virtual double visibleOpacity_raw() const = 0; + virtual char* revisionId_raw() const = 0; + virtual BRepWires* wires_raw() const = 0; + virtual bool isTemporary_raw() const = 0; + virtual char* entityToken_raw() const = 0; + virtual PhysicalProperties* getPhysicalProperties_raw(CalculationAccuracy accuracy) const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepBody::parentComponent() const +{ + core::Ptr res = parentComponent_raw(); + return res; +} + +inline core::Ptr BRepBody::lumps() const +{ + core::Ptr res = lumps_raw(); + return res; +} + +inline core::Ptr BRepBody::shells() const +{ + core::Ptr res = shells_raw(); + return res; +} + +inline core::Ptr BRepBody::faces() const +{ + core::Ptr res = faces_raw(); + return res; +} + +inline core::Ptr BRepBody::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline core::Ptr BRepBody::vertices() const +{ + core::Ptr res = vertices_raw(); + return res; +} + +inline bool BRepBody::isSolid() const +{ + bool res = isSolid_raw(); + return res; +} + +inline core::Ptr BRepBody::boundingBox() const +{ + core::Ptr res = boundingBox_raw(); + return res; +} + +inline core::Ptr BRepBody::concaveEdges() const +{ + core::Ptr res = concaveEdges_raw(); + return res; +} + +inline core::Ptr BRepBody::convexEdges() const +{ + core::Ptr res = convexEdges_raw(); + return res; +} + +inline double BRepBody::area() const +{ + double res = area_raw(); + return res; +} + +inline double BRepBody::volume() const +{ + double res = volume_raw(); + return res; +} + +inline PointContainment BRepBody::pointContainment(const core::Ptr& point) +{ + PointContainment res = pointContainment_raw(point.get()); + return res; +} + +inline bool BRepBody::isTransient() const +{ + bool res = isTransient_raw(); + return res; +} + +inline std::string BRepBody::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool BRepBody::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline bool BRepBody::isVisible() const +{ + bool res = isVisible_raw(); + return res; +} + +inline bool BRepBody::isVisible(bool value) +{ + return isVisible_raw(value); +} + +inline bool BRepBody::isSelectable() const +{ + bool res = isSelectable_raw(); + return res; +} + +inline bool BRepBody::isSelectable(bool value) +{ + return isSelectable_raw(value); +} + +inline bool BRepBody::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline bool BRepBody::copy() +{ + bool res = copy_raw(); + return res; +} + +inline bool BRepBody::cut() +{ + bool res = cut_raw(); + return res; +} + +inline core::Ptr BRepBody::appearance() const +{ + core::Ptr res = appearance_raw(); + return res; +} + +inline bool BRepBody::appearance(const core::Ptr& value) +{ + return appearance_raw(value.get()); +} + +inline core::AppearanceSourceTypes BRepBody::appearanceSourceType() const +{ + core::AppearanceSourceTypes res = appearanceSourceType_raw(); + return res; +} + +inline core::Ptr BRepBody::material() const +{ + core::Ptr res = material_raw(); + return res; +} + +inline bool BRepBody::material(const core::Ptr& value) +{ + return material_raw(value.get()); +} + +inline core::Ptr BRepBody::meshManager() const +{ + core::Ptr res = meshManager_raw(); + return res; +} + +inline core::Ptr BRepBody::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr BRepBody::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr BRepBody::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr BRepBody::createComponent() +{ + core::Ptr res = createComponent_raw(); + return res; +} + +inline core::Ptr BRepBody::moveToComponent(const core::Ptr& target) +{ + core::Ptr res = moveToComponent_raw(target.get()); + return res; +} + +inline core::Ptr BRepBody::copyToComponent(const core::Ptr& target) +{ + core::Ptr res = copyToComponent_raw(target.get()); + return res; +} + +inline core::Ptr BRepBody::physicalProperties() const +{ + core::Ptr res = physicalProperties_raw(); + return res; +} + +inline bool BRepBody::isLightBulbOn() const +{ + bool res = isLightBulbOn_raw(); + return res; +} + +inline bool BRepBody::isLightBulbOn(bool value) +{ + return isLightBulbOn_raw(value); +} + +inline core::Ptr BRepBody::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline core::Ptr BRepBody::baseFeature() const +{ + core::Ptr res = baseFeature_raw(); + return res; +} + +inline core::Ptr BRepBody::convert(BRepConvertOptions options) +{ + core::Ptr res = convert_raw(options); + return res; +} + +inline std::vector> BRepBody::findByTempId(int tempId) +{ + std::vector> res; + size_t s; + + core::Base** p= findByTempId_raw(tempId, s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline double BRepBody::opacity() const +{ + double res = opacity_raw(); + return res; +} + +inline bool BRepBody::opacity(double value) +{ + return opacity_raw(value); +} + +inline double BRepBody::visibleOpacity() const +{ + double res = visibleOpacity_raw(); + return res; +} + +inline std::string BRepBody::revisionId() const +{ + std::string res; + + char* p= revisionId_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline core::Ptr BRepBody::wires() const +{ + core::Ptr res = wires_raw(); + return res; +} + +inline bool BRepBody::isTemporary() const +{ + bool res = isTemporary_raw(); + return res; +} + +inline std::string BRepBody::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline core::Ptr BRepBody::getPhysicalProperties(CalculationAccuracy accuracy) const +{ + core::Ptr res = getPhysicalProperties_raw(accuracy); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPBODY_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepBodyDefinition.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepBodyDefinition.h new file mode 100644 index 0000000..a311a18 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepBodyDefinition.h @@ -0,0 +1,187 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPBODYDEFINITION_CPP__ +# define ADSK_FUSION_BREPBODYDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_BREPBODYDEFINITION_API +# endif +#else +# define ADSK_FUSION_BREPBODYDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class BRepEdgeDefinition; + class BRepLumpDefinitions; + class BRepVertexDefinition; +}} +namespace adsk { namespace core { + class Curve3D; + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// This object is used to define a temporary B-Rep body. This includes solid, surface, and wire +/// bodies. The class supports the ability to define the geometry and topology of the B-Rep and +/// once the definition is complete, it supports the creation of a temporary BRepBody object. +class BRepBodyDefinition : public core::Base { +public: + + /// Static function that creates a new BRepBodyDefinition object. It's initially empty but you can use + /// the functionality it provides to define the geometry and topology of the B-Rep + /// object you want to create. + /// Returns the newly created BRepBodyDefinition object. + static core::Ptr create(); + + /// Attempts to create a temporary BRepBody object using the definition + /// provided by this BRepBodyDefinition object. Properties on this BRepBodyDefinition + /// are used to define some of the criteria that control how the body is created. + /// Returns the newly created BRepBody object if successful, otherwise null is returned. + /// Information about the body creation can be obtained by using the outcomeInfo property. + /// The outcome info is especially useful when initially writing and debugging your code to understand + /// why the creation of the body is failing. + core::Ptr createBody(); + + /// Specifies if full healing is done when creating the body. This defaults to true and it's highly recommended + /// that you do full healing because it can find and correct problems with the input. If you're sure that the + /// B-Rep definition that you've constructed is correct then you can set this to false to skip the full + /// healing process. + bool doFullHealing() const; + bool doFullHealing(bool value); + + /// Returns an array of strings that contain information about the outcome of the previous + /// call of the createBody method. This is especially useful when the createBody method fails, + /// (returns null), because it provides information about why the failure occurred. It can + /// also sometimes provide some information even when createBody succeeds. + /// Each string that's returned represents a single set of information and is packaged as JSON + /// such as '{"description":"vertex data is null or inconsistent with edge geometry","associativeID":"unknown","code":37}' + /// The description is an English description of the error or warning. The associativeID maps back to the + /// entity provided that is the cause of the problem. The ID is the associative ID you can optionally + /// assign to the entity definition. The code is an internal code for the error or warning. + /// An empty array is returned if createBody succeeded and there's no additional information. + std::vector outcomeInfo() const; + + /// Provides access to the BRepLumpDefinitions object associated with this BRepBodyDefinition. + /// It's through the returned collection that you can create new BRepLumpDefinition objects. + core::Ptr lumpDefinitions() const; + + /// Using a curve in model space it creates a new BRepEdgeDefinition object that's associated with the body. + /// startVertex : Vertex definition that defines the start of the edge. For a closed curve, like a circle, you still + /// need to provide a vertex on the curve but you should use the same BRepVertexDefinition for both the start and end vertices. + /// endVertex : Vertex definition that defines the end of the edge. For a closed curve, like a circle, this should be the + /// same vertex as used for the start vertex. + /// modelSpaceCurve : A Curve3D object that defines the shape of the edge using 3D geometry in model space. + /// Valid input is an Arc3D, NurbsCurve3D, Circle3D, Ellipse3D, EllipticalArc3D, or Line3D. + /// Returns the created BRepEdgeDefinition object or null in the case of failure. + core::Ptr createEdgeDefinitionByCurve(const core::Ptr& startVertex, const core::Ptr& endVertex, const core::Ptr& modelSpaceCurve); + + /// Creates a new BRepVertexDefinition object that's associated with the body. + /// position : Specifies the position of the vertex in model space. + /// Returns the created BRepVertexDefinition object or null in the case of failure. + core::Ptr createVertexDefinition(const core::Ptr& position); + + ADSK_FUSION_BREPBODYDEFINITION_API static const char* classType(); + ADSK_FUSION_BREPBODYDEFINITION_API const char* objectType() const override; + ADSK_FUSION_BREPBODYDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPBODYDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_BREPBODYDEFINITION_API static BRepBodyDefinition* create_raw(); + virtual BRepBody* createBody_raw() = 0; + virtual bool doFullHealing_raw() const = 0; + virtual bool doFullHealing_raw(bool value) = 0; + virtual char** outcomeInfo_raw(size_t& return_size) const = 0; + virtual BRepLumpDefinitions* lumpDefinitions_raw() const = 0; + virtual BRepEdgeDefinition* createEdgeDefinitionByCurve_raw(BRepVertexDefinition* startVertex, BRepVertexDefinition* endVertex, core::Curve3D* modelSpaceCurve) = 0; + virtual BRepVertexDefinition* createVertexDefinition_raw(core::Point3D* position) = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepBodyDefinition::create() +{ + core::Ptr res = create_raw(); + return res; +} + +inline core::Ptr BRepBodyDefinition::createBody() +{ + core::Ptr res = createBody_raw(); + return res; +} + +inline bool BRepBodyDefinition::doFullHealing() const +{ + bool res = doFullHealing_raw(); + return res; +} + +inline bool BRepBodyDefinition::doFullHealing(bool value) +{ + return doFullHealing_raw(value); +} + +inline std::vector BRepBodyDefinition::outcomeInfo() const +{ + std::vector res; + size_t s; + + char** p= outcomeInfo_raw(s); + if(p) + { + res.resize(s); + for(size_t i=0; i BRepBodyDefinition::lumpDefinitions() const +{ + core::Ptr res = lumpDefinitions_raw(); + return res; +} + +inline core::Ptr BRepBodyDefinition::createEdgeDefinitionByCurve(const core::Ptr& startVertex, const core::Ptr& endVertex, const core::Ptr& modelSpaceCurve) +{ + core::Ptr res = createEdgeDefinitionByCurve_raw(startVertex.get(), endVertex.get(), modelSpaceCurve.get()); + return res; +} + +inline core::Ptr BRepBodyDefinition::createVertexDefinition(const core::Ptr& position) +{ + core::Ptr res = createVertexDefinition_raw(position.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPBODYDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepCoEdge.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepCoEdge.h new file mode 100644 index 0000000..15853f4 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepCoEdge.h @@ -0,0 +1,232 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPCOEDGE_CPP__ +# define ADSK_FUSION_BREPCOEDGE_API XI_EXPORT +# else +# define ADSK_FUSION_BREPCOEDGE_API +# endif +#else +# define ADSK_FUSION_BREPCOEDGE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class BRepEdge; + class BRepLoop; + class Occurrence; +}} +namespace adsk { namespace core { + class Curve2D; + class CurveEvaluator2D; +}} + +namespace adsk { namespace fusion { + +/// Represents the use of a BRepEdge by a BRepFace. +class BRepCoEdge : public core::Base { +public: + + /// Returns the edge this co-edge is associated with. + core::Ptr edge() const; + + /// Returns the loop this co-edge is part of. + core::Ptr loop() const; + + /// Returns a curve evaluator that can be used to perform geometric evaluations on the co-edge. + core::Ptr evaluator() const; + + /// Returns a geometry object that represents the shape of this co-edge in parameter space of the parent face's surface. + core::Ptr geometry() const; + + /// Indicates if the orientation of this co-edge is in the same direction or opposed to its associated edge. + bool isOpposedToEdge() const; + + /// Returns if the parametric direction of this co-edge is reversed + /// from the parametric direction of the underlying curve obtained from the geometry property. + /// A co-edge's parametric direction is from the start vertex to the end vertex. + /// But the underlying curve geometry may have the opposite parameterization. + /// This property indicates if the parameterization order of the evaluator obtained from + /// this co-edge is reversed from the order of the geometry curve's evaluator. + bool isParamReversed() const; + + /// Returns the next co-edge in the loop. + core::Ptr next() const; + + /// Returns the body this co-edge is part of. + core::Ptr body() const; + + /// Returns the co-edge on the adjacent face + core::Ptr partner() const; + + /// Returns the previous co-edge in the loop. + core::Ptr previous() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this + /// object in an assembly. This is only valid in the case where this + /// BRepCoEdge object is acting as a proxy in an assembly. Returns null + /// in the case where the object is not in the context of an assembly. + /// but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context for the created proxy. + /// Returns the new BrepCoEdge proxy or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns a token for the BRepCoEdge object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same co-edge. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + /// This is only valid for co-edges that exist in the design, (the isTemporary + /// property is false). + std::string entityToken() const; + + ADSK_FUSION_BREPCOEDGE_API static const char* classType(); + ADSK_FUSION_BREPCOEDGE_API const char* objectType() const override; + ADSK_FUSION_BREPCOEDGE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPCOEDGE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepEdge* edge_raw() const = 0; + virtual BRepLoop* loop_raw() const = 0; + virtual core::CurveEvaluator2D* evaluator_raw() const = 0; + virtual core::Curve2D* geometry_raw() const = 0; + virtual bool isOpposedToEdge_raw() const = 0; + virtual bool isParamReversed_raw() const = 0; + virtual BRepCoEdge* next_raw() const = 0; + virtual BRepBody* body_raw() const = 0; + virtual BRepCoEdge* partner_raw() const = 0; + virtual BRepCoEdge* previous_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual BRepCoEdge* nativeObject_raw() const = 0; + virtual BRepCoEdge* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepCoEdge::edge() const +{ + core::Ptr res = edge_raw(); + return res; +} + +inline core::Ptr BRepCoEdge::loop() const +{ + core::Ptr res = loop_raw(); + return res; +} + +inline core::Ptr BRepCoEdge::evaluator() const +{ + core::Ptr res = evaluator_raw(); + return res; +} + +inline core::Ptr BRepCoEdge::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline bool BRepCoEdge::isOpposedToEdge() const +{ + bool res = isOpposedToEdge_raw(); + return res; +} + +inline bool BRepCoEdge::isParamReversed() const +{ + bool res = isParamReversed_raw(); + return res; +} + +inline core::Ptr BRepCoEdge::next() const +{ + core::Ptr res = next_raw(); + return res; +} + +inline core::Ptr BRepCoEdge::body() const +{ + core::Ptr res = body_raw(); + return res; +} + +inline core::Ptr BRepCoEdge::partner() const +{ + core::Ptr res = partner_raw(); + return res; +} + +inline core::Ptr BRepCoEdge::previous() const +{ + core::Ptr res = previous_raw(); + return res; +} + +inline core::Ptr BRepCoEdge::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr BRepCoEdge::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr BRepCoEdge::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline std::string BRepCoEdge::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPCOEDGE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepCoEdgeDefinition.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepCoEdgeDefinition.h new file mode 100644 index 0000000..910dc48 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepCoEdgeDefinition.h @@ -0,0 +1,88 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPCOEDGEDEFINITION_CPP__ +# define ADSK_FUSION_BREPCOEDGEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_BREPCOEDGEDEFINITION_API +# endif +#else +# define ADSK_FUSION_BREPCOEDGEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepEdgeDefinition; +}} + +namespace adsk { namespace fusion { + +/// Represents the definition of a B-Rep co-edge that can be used as input to create a BRepBody that includes this co-edge. +class BRepCoEdgeDefinition : public core::Base { +public: + + /// Gets and sets the BRepEdgeDefinition object associated with this BrepCoEdgeDefinition object. + core::Ptr edgeDefinition() const; + bool edgeDefinition(const core::Ptr& value); + + /// Gets and sets if the orientation of this BRepCoEdgeDefinition object is reversed with + /// respect to the associated BRepEdgeDefinition object. + bool isOpposedToEdge() const; + bool isOpposedToEdge(bool value); + + ADSK_FUSION_BREPCOEDGEDEFINITION_API static const char* classType(); + ADSK_FUSION_BREPCOEDGEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_BREPCOEDGEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPCOEDGEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepEdgeDefinition* edgeDefinition_raw() const = 0; + virtual bool edgeDefinition_raw(BRepEdgeDefinition* value) = 0; + virtual bool isOpposedToEdge_raw() const = 0; + virtual bool isOpposedToEdge_raw(bool value) = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepCoEdgeDefinition::edgeDefinition() const +{ + core::Ptr res = edgeDefinition_raw(); + return res; +} + +inline bool BRepCoEdgeDefinition::edgeDefinition(const core::Ptr& value) +{ + return edgeDefinition_raw(value.get()); +} + +inline bool BRepCoEdgeDefinition::isOpposedToEdge() const +{ + bool res = isOpposedToEdge_raw(); + return res; +} + +inline bool BRepCoEdgeDefinition::isOpposedToEdge(bool value) +{ + return isOpposedToEdge_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPCOEDGEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepCoEdgeDefinitions.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepCoEdgeDefinitions.h new file mode 100644 index 0000000..97b4d8c --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepCoEdgeDefinitions.h @@ -0,0 +1,103 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPCOEDGEDEFINITIONS_CPP__ +# define ADSK_FUSION_BREPCOEDGEDEFINITIONS_API XI_EXPORT +# else +# define ADSK_FUSION_BREPCOEDGEDEFINITIONS_API +# endif +#else +# define ADSK_FUSION_BREPCOEDGEDEFINITIONS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepCoEdgeDefinition; + class BRepEdgeDefinition; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the BRepCoEdgeDefinition objects associated with the parent BRepLoopDefinition object. +/// It's through this object that you create new BRepCoEdgeDefinition objects. +class BRepCoEdgeDefinitions : public core::Base { +public: + + /// Function that returns the specified BRepCoEdgeDefinition object using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of B-Rep co-edge definition objects in the collection. + size_t count() const; + + /// Creates a new BrepCoEdgeDefinition object associated with the parent BrepLoopDefinition object. + /// edgeDefinition : The BRepEdgeDefinition object this co-edge is related to. + /// isOpposedToEdge : Boolean that indicates if the orientation of this BRepCoEdgeDefinition is reversed with respect + /// to the associated BRepEdgeDefinition object. + /// Returns the newly created BrepCoEdgeDefinition object or null in the case of failure. + core::Ptr add(const core::Ptr& edgeDefinition, bool isOpposedToEdge); + + typedef BRepCoEdgeDefinition iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BREPCOEDGEDEFINITIONS_API static const char* classType(); + ADSK_FUSION_BREPCOEDGEDEFINITIONS_API const char* objectType() const override; + ADSK_FUSION_BREPCOEDGEDEFINITIONS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPCOEDGEDEFINITIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepCoEdgeDefinition* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual BRepCoEdgeDefinition* add_raw(BRepEdgeDefinition* edgeDefinition, bool isOpposedToEdge) = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepCoEdgeDefinitions::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t BRepCoEdgeDefinitions::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr BRepCoEdgeDefinitions::add(const core::Ptr& edgeDefinition, bool isOpposedToEdge) +{ + core::Ptr res = add_raw(edgeDefinition.get(), isOpposedToEdge); + return res; +} + +template inline void BRepCoEdgeDefinitions::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPCOEDGEDEFINITIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepCoEdges.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepCoEdges.h new file mode 100644 index 0000000..ac3efff --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepCoEdges.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPCOEDGES_CPP__ +# define ADSK_FUSION_BREPCOEDGES_API XI_EXPORT +# else +# define ADSK_FUSION_BREPCOEDGES_API +# endif +#else +# define ADSK_FUSION_BREPCOEDGES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepCoEdge; +}} + +namespace adsk { namespace fusion { + +/// BRepCoEdge Collection. +class BRepCoEdges : public core::Base { +public: + + /// Function that returns the specified co-edge using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of co-edges in the collection. + size_t count() const; + + typedef BRepCoEdge iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BREPCOEDGES_API static const char* classType(); + ADSK_FUSION_BREPCOEDGES_API const char* objectType() const override; + ADSK_FUSION_BREPCOEDGES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPCOEDGES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepCoEdge* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepCoEdges::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t BRepCoEdges::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void BRepCoEdges::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPCOEDGES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepEdge.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepEdge.h new file mode 100644 index 0000000..abea1d4 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepEdge.h @@ -0,0 +1,326 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPEDGE_CPP__ +# define ADSK_FUSION_BREPEDGE_API XI_EXPORT +# else +# define ADSK_FUSION_BREPEDGE_API +# endif +#else +# define ADSK_FUSION_BREPEDGE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class BRepCoEdges; + class BRepFaces; + class BRepShell; + class BRepVertex; + class Occurrence; +}} +namespace adsk { namespace core { + class Attributes; + class BoundingBox3D; + class Curve3D; + class CurveEvaluator3D; + class ObjectCollection; + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// Represents a one-dimensional topological element that can be used to bound a BRepFace A BRepEdge uses a single, connected and bounded subset of a curve for it geometry. +class BRepEdge : public core::Base { +public: + + /// Returns the BRepVertex that bounds its low parameter end. + core::Ptr startVertex() const; + + /// Returns the BRepVertex that bounds its high parameter end. + core::Ptr endVertex() const; + + /// Returns the BRepFaces that are associated with this edge through its BRepCoEdges. + core::Ptr faces() const; + + /// Returns the parent shell of the edge. + core::Ptr shell() const; + + /// Returns the parent body of the edge. + core::Ptr body() const; + + /// Returns if the edge's geometry is degenerate. + /// For example, the apex of a cone is a degenerate edge. + bool isDegenerate() const; + + /// Returns CurveEvaluator3D for evaluation. + core::Ptr evaluator() const; + + /// Returns the underlying curve geometry of the edge. + core::Ptr geometry() const; + + /// Returns if the edge is tolerant. + /// The tolerance used is available from the tolerance property. + bool isTolerant() const; + + /// Returns the tolerance used by a tolerant edge. + /// This value is only useful when isTolerant is true. + double tolerance() const; + + /// Returns a sample point guaranteed to lie on the edge's curve, within its boundaries, + /// and not on a vertex (unless this is a degenerate edge). + core::Ptr pointOnEdge() const; + + /// Returns the BRepCoEdges on the edge. + core::Ptr coEdges() const; + + /// Returns if the parametric direction of this edge is reversed + /// from the parametric direction of the underlying curve obtained from the geometry property. + /// An edge's parametric direction is from the start vertex to the end vertex. + /// But the underlying curve geometry may have the opposite parameterization. + /// This property indicates if the parameterization order of the evaluator obtained from + /// this edge is reversed from the order of the geometry curve's evaluator. + bool isParamReversed() const; + + /// Returns a collection of edges that includes all of the edges tangentially connected + /// to this edge. The result includes this edge. The edges are in the collection + /// in their connected order. + core::Ptr tangentiallyConnectedEdges() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this + /// object in an assembly. This is only valid in the case where this + /// BRepEdge object is acting as a proxy in an assembly. Returns null + /// in the case where the object is not in the context of an assembly. + /// but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context for the created proxy. + /// Returns the new BrepEdge proxy or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns the collection of attributes associated with this face. + core::Ptr attributes() const; + + /// Returns the length of the edge in centimeters. + double length() const; + + /// Returns the temporary ID of this edge. This ID is only good while the document + /// remains open and as long as the owning BRepBody is not modified in any way. + /// The findByTempId method of the BRepBody will return the entity in the body with the given ID. + int tempId() const; + + /// Returns the bounding box of this edge. + core::Ptr boundingBox() const; + + /// Returns a token for the BRepEdge object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same edge. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + /// This is only valid for edges that exist in the design, (the isTemporary + /// property is false). + std::string entityToken() const; + + ADSK_FUSION_BREPEDGE_API static const char* classType(); + ADSK_FUSION_BREPEDGE_API const char* objectType() const override; + ADSK_FUSION_BREPEDGE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPEDGE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepVertex* startVertex_raw() const = 0; + virtual BRepVertex* endVertex_raw() const = 0; + virtual BRepFaces* faces_raw() const = 0; + virtual BRepShell* shell_raw() const = 0; + virtual BRepBody* body_raw() const = 0; + virtual bool isDegenerate_raw() const = 0; + virtual core::CurveEvaluator3D* evaluator_raw() const = 0; + virtual core::Curve3D* geometry_raw() const = 0; + virtual bool isTolerant_raw() const = 0; + virtual double tolerance_raw() const = 0; + virtual core::Point3D* pointOnEdge_raw() const = 0; + virtual BRepCoEdges* coEdges_raw() const = 0; + virtual bool isParamReversed_raw() const = 0; + virtual core::ObjectCollection* tangentiallyConnectedEdges_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual BRepEdge* nativeObject_raw() const = 0; + virtual BRepEdge* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual double length_raw() const = 0; + virtual int tempId_raw() const = 0; + virtual core::BoundingBox3D* boundingBox_raw() const = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepEdge::startVertex() const +{ + core::Ptr res = startVertex_raw(); + return res; +} + +inline core::Ptr BRepEdge::endVertex() const +{ + core::Ptr res = endVertex_raw(); + return res; +} + +inline core::Ptr BRepEdge::faces() const +{ + core::Ptr res = faces_raw(); + return res; +} + +inline core::Ptr BRepEdge::shell() const +{ + core::Ptr res = shell_raw(); + return res; +} + +inline core::Ptr BRepEdge::body() const +{ + core::Ptr res = body_raw(); + return res; +} + +inline bool BRepEdge::isDegenerate() const +{ + bool res = isDegenerate_raw(); + return res; +} + +inline core::Ptr BRepEdge::evaluator() const +{ + core::Ptr res = evaluator_raw(); + return res; +} + +inline core::Ptr BRepEdge::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline bool BRepEdge::isTolerant() const +{ + bool res = isTolerant_raw(); + return res; +} + +inline double BRepEdge::tolerance() const +{ + double res = tolerance_raw(); + return res; +} + +inline core::Ptr BRepEdge::pointOnEdge() const +{ + core::Ptr res = pointOnEdge_raw(); + return res; +} + +inline core::Ptr BRepEdge::coEdges() const +{ + core::Ptr res = coEdges_raw(); + return res; +} + +inline bool BRepEdge::isParamReversed() const +{ + bool res = isParamReversed_raw(); + return res; +} + +inline core::Ptr BRepEdge::tangentiallyConnectedEdges() const +{ + core::Ptr res = tangentiallyConnectedEdges_raw(); + return res; +} + +inline core::Ptr BRepEdge::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr BRepEdge::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr BRepEdge::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr BRepEdge::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline double BRepEdge::length() const +{ + double res = length_raw(); + return res; +} + +inline int BRepEdge::tempId() const +{ + int res = tempId_raw(); + return res; +} + +inline core::Ptr BRepEdge::boundingBox() const +{ + core::Ptr res = boundingBox_raw(); + return res; +} + +inline std::string BRepEdge::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPEDGE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepEdgeDefinition.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepEdgeDefinition.h new file mode 100644 index 0000000..674b1a6 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepEdgeDefinition.h @@ -0,0 +1,149 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPEDGEDEFINITION_CPP__ +# define ADSK_FUSION_BREPEDGEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_BREPEDGEDEFINITION_API +# endif +#else +# define ADSK_FUSION_BREPEDGEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepVertexDefinition; +}} +namespace adsk { namespace core { + class Curve3D; +}} + +namespace adsk { namespace fusion { + +/// Represents the definition of a B-Rep edge that can be used as input to create a BRepBody. +class BRepEdgeDefinition : public core::Base { +public: + + /// Gets and sets the associate ID of this edge definition. This ID will be copied to the corresponding + /// edge when the BRepBodyDefinition is used to create a BrepBody. It is used internally by Fusion360 as + /// the identifier for the edge and is used for tracking this geometry for parametric recomputes. + int associativeID() const; + bool associativeID(int value); + + /// Gets and sets the start vertex of the edge definition. + core::Ptr startVertex() const; + bool startVertex(const core::Ptr& value); + + /// Gets and sets the end vertex of the edge definition. + core::Ptr endVertex() const; + bool endVertex(const core::Ptr& value); + + /// Gets and sets the curve that defines the shape of the edge. + core::Ptr modelSpaceCurve() const; + bool modelSpaceCurve(const core::Ptr& value); + + /// Gets and sets if the two faces that share this edge can be merged along this + /// edge. This property defaults to true so that merging is always done but this + /// can be set to false in cases where you want to preserve the edge. + /// An example where merging is typically done is when you have multiple planar + /// faces that all lie on the same plane and are connected. When merging is allowed + /// these faces can be replaced by a single face and the edges connecting the + /// faces (the merged edges) are no longer part of the body. + bool isMergeable() const; + bool isMergeable(bool value); + + ADSK_FUSION_BREPEDGEDEFINITION_API static const char* classType(); + ADSK_FUSION_BREPEDGEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_BREPEDGEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPEDGEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual int associativeID_raw() const = 0; + virtual bool associativeID_raw(int value) = 0; + virtual BRepVertexDefinition* startVertex_raw() const = 0; + virtual bool startVertex_raw(BRepVertexDefinition* value) = 0; + virtual BRepVertexDefinition* endVertex_raw() const = 0; + virtual bool endVertex_raw(BRepVertexDefinition* value) = 0; + virtual core::Curve3D* modelSpaceCurve_raw() const = 0; + virtual bool modelSpaceCurve_raw(core::Curve3D* value) = 0; + virtual bool isMergeable_raw() const = 0; + virtual bool isMergeable_raw(bool value) = 0; +}; + +// Inline wrappers + +inline int BRepEdgeDefinition::associativeID() const +{ + int res = associativeID_raw(); + return res; +} + +inline bool BRepEdgeDefinition::associativeID(int value) +{ + return associativeID_raw(value); +} + +inline core::Ptr BRepEdgeDefinition::startVertex() const +{ + core::Ptr res = startVertex_raw(); + return res; +} + +inline bool BRepEdgeDefinition::startVertex(const core::Ptr& value) +{ + return startVertex_raw(value.get()); +} + +inline core::Ptr BRepEdgeDefinition::endVertex() const +{ + core::Ptr res = endVertex_raw(); + return res; +} + +inline bool BRepEdgeDefinition::endVertex(const core::Ptr& value) +{ + return endVertex_raw(value.get()); +} + +inline core::Ptr BRepEdgeDefinition::modelSpaceCurve() const +{ + core::Ptr res = modelSpaceCurve_raw(); + return res; +} + +inline bool BRepEdgeDefinition::modelSpaceCurve(const core::Ptr& value) +{ + return modelSpaceCurve_raw(value.get()); +} + +inline bool BRepEdgeDefinition::isMergeable() const +{ + bool res = isMergeable_raw(); + return res; +} + +inline bool BRepEdgeDefinition::isMergeable(bool value) +{ + return isMergeable_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPEDGEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepEdges.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepEdges.h new file mode 100644 index 0000000..a8dcebc --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepEdges.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPEDGES_CPP__ +# define ADSK_FUSION_BREPEDGES_API XI_EXPORT +# else +# define ADSK_FUSION_BREPEDGES_API +# endif +#else +# define ADSK_FUSION_BREPEDGES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepEdge; +}} + +namespace adsk { namespace fusion { + +/// BRepEdge collection. +class BRepEdges : public core::Base { +public: + + /// Function that returns the specified edge using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of edges in the collection. + size_t count() const; + + typedef BRepEdge iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BREPEDGES_API static const char* classType(); + ADSK_FUSION_BREPEDGES_API const char* objectType() const override; + ADSK_FUSION_BREPEDGES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPEDGES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepEdge* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepEdges::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t BRepEdges::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void BRepEdges::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPEDGES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepFace.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepFace.h new file mode 100644 index 0000000..c076316 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepFace.h @@ -0,0 +1,351 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/CoreTypeDefs.h" +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPFACE_CPP__ +# define ADSK_FUSION_BREPFACE_API XI_EXPORT +# else +# define ADSK_FUSION_BREPFACE_API +# endif +#else +# define ADSK_FUSION_BREPFACE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class BRepEdges; + class BRepFaces; + class BRepLoops; + class BRepShell; + class BRepVertices; + class MeshManager; + class Occurrence; +}} +namespace adsk { namespace core { + class Appearance; + class Attributes; + class BoundingBox3D; + class Point3D; + class Surface; + class SurfaceEvaluator; +}} + +namespace adsk { namespace fusion { + +/// Represent a connected region on a single geometric surface. +class BRepFace : public core::Base { +public: + + /// Returns the BRepEdges used by this face + core::Ptr edges() const; + + /// Returns the BRepVertices used by this face + core::Ptr vertices() const; + + /// Returns the parent shell of the face. + core::Ptr shell() const; + + /// Returns the BRepLoops owned by this face + core::Ptr loops() const; + + /// Returns the parent body of the face. + core::Ptr body() const; + + /// Returns the underlying surface geometry of this face + core::Ptr geometry() const; + + /// Returns a SurfaceEvaluator to allow geometric evaluations across the face's surface. + /// This evaluator differs from the evaluator available from the Surface obtained from the geometry + /// property by being bounded by the topological boundaries of this face. + core::Ptr evaluator() const; + + /// Returns a sample point guaranteed to lie on the face's surface, within the face's boundaries, and not on a boundary edge. + core::Ptr pointOnFace() const; + + /// Returns the set of faces that are tangentially adjacent to this face. + /// In other words, it is the set of faces that are adjacent to this face's edges + /// and have a smooth transition across those edges. + core::Ptr tangentiallyConnectedFaces() const; + + /// Returns a MeshManager object that allows access to existing and new meshes of this face. + core::Ptr meshManager() const; + + /// Read-write property that gets and sets the current appearance of the face. Setting this property will result in applying + /// an override appearance to the face and the AppearanceSourceType property will return OverrideAppearanceSource. Setting + /// this property to null will remove any override. + core::Ptr appearance() const; + bool appearance(const core::Ptr& value); + + /// Read-write property that gets the source of the appearance for the face. If this returns OverrideAppearanceSource, an override exists + /// on this face. The override can be removed by setting the Appearance property to null. + core::AppearanceSourceTypes appearanceSourceType() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this + /// object in an assembly. This is only valid in the case where this + /// BRepFace object is acting as a proxy in an assembly. Returns null + /// in the case where the object is not in the context of an assembly. + /// but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context for the created proxy. + /// Returns the new BRepFace proxy or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns the area in cm ^ 2. + double area() const; + + /// Returns the bounding box of this face + core::Ptr boundingBox() const; + + /// Returns a point at the centroid (aka, geometric center) of the face. + core::Ptr centroid() const; + + /// Returns the collection of attributes associated with this face. + core::Ptr attributes() const; + + /// Returns the temporary ID of this face. This ID is only good while the document + /// remains open and as long as the owning BRepBody is not modified in any way. + /// The findByTempId method of the BRepBody will return the entity in the body with the given ID. + int tempId() const; + + /// Creates a new body where this face and its edges are converted to different + /// types of geometry based on the input options. + /// The tempId on the faces, edges, and vertices on the new body will match + /// with the corresponding tempId on the original body. In cases where the face is + /// split as a result of the conversion there can be more than one face or edge in + /// the new body that matches to a single face or edge in the original body. + /// options : Input options that define how the conversion should be done. These are + /// bitwise options so they can be combined. + /// Returns the new converted body or null in the case of failure. + core::Ptr convert(BRepConvertOptions options); + + /// Gets if the normal of this face is reversed with respect to the surface geometry associated + /// with this face. + bool isParamReversed() const; + + /// Returns a token for the BRepFace object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same face. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + /// This is only valid for faces that exist in the design, (the isTemporary + /// property is false). + std::string entityToken() const; + + ADSK_FUSION_BREPFACE_API static const char* classType(); + ADSK_FUSION_BREPFACE_API const char* objectType() const override; + ADSK_FUSION_BREPFACE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPFACE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepEdges* edges_raw() const = 0; + virtual BRepVertices* vertices_raw() const = 0; + virtual BRepShell* shell_raw() const = 0; + virtual BRepLoops* loops_raw() const = 0; + virtual BRepBody* body_raw() const = 0; + virtual core::Surface* geometry_raw() const = 0; + virtual core::SurfaceEvaluator* evaluator_raw() const = 0; + virtual core::Point3D* pointOnFace_raw() const = 0; + virtual BRepFaces* tangentiallyConnectedFaces_raw() const = 0; + virtual MeshManager* meshManager_raw() const = 0; + virtual core::Appearance* appearance_raw() const = 0; + virtual bool appearance_raw(core::Appearance* value) = 0; + virtual core::AppearanceSourceTypes appearanceSourceType_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual BRepFace* nativeObject_raw() const = 0; + virtual BRepFace* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual double area_raw() const = 0; + virtual core::BoundingBox3D* boundingBox_raw() const = 0; + virtual core::Point3D* centroid_raw() const = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual int tempId_raw() const = 0; + virtual BRepBody* convert_raw(BRepConvertOptions options) = 0; + virtual bool isParamReversed_raw() const = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepFace::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline core::Ptr BRepFace::vertices() const +{ + core::Ptr res = vertices_raw(); + return res; +} + +inline core::Ptr BRepFace::shell() const +{ + core::Ptr res = shell_raw(); + return res; +} + +inline core::Ptr BRepFace::loops() const +{ + core::Ptr res = loops_raw(); + return res; +} + +inline core::Ptr BRepFace::body() const +{ + core::Ptr res = body_raw(); + return res; +} + +inline core::Ptr BRepFace::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline core::Ptr BRepFace::evaluator() const +{ + core::Ptr res = evaluator_raw(); + return res; +} + +inline core::Ptr BRepFace::pointOnFace() const +{ + core::Ptr res = pointOnFace_raw(); + return res; +} + +inline core::Ptr BRepFace::tangentiallyConnectedFaces() const +{ + core::Ptr res = tangentiallyConnectedFaces_raw(); + return res; +} + +inline core::Ptr BRepFace::meshManager() const +{ + core::Ptr res = meshManager_raw(); + return res; +} + +inline core::Ptr BRepFace::appearance() const +{ + core::Ptr res = appearance_raw(); + return res; +} + +inline bool BRepFace::appearance(const core::Ptr& value) +{ + return appearance_raw(value.get()); +} + +inline core::AppearanceSourceTypes BRepFace::appearanceSourceType() const +{ + core::AppearanceSourceTypes res = appearanceSourceType_raw(); + return res; +} + +inline core::Ptr BRepFace::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr BRepFace::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr BRepFace::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline double BRepFace::area() const +{ + double res = area_raw(); + return res; +} + +inline core::Ptr BRepFace::boundingBox() const +{ + core::Ptr res = boundingBox_raw(); + return res; +} + +inline core::Ptr BRepFace::centroid() const +{ + core::Ptr res = centroid_raw(); + return res; +} + +inline core::Ptr BRepFace::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline int BRepFace::tempId() const +{ + int res = tempId_raw(); + return res; +} + +inline core::Ptr BRepFace::convert(BRepConvertOptions options) +{ + core::Ptr res = convert_raw(options); + return res; +} + +inline bool BRepFace::isParamReversed() const +{ + bool res = isParamReversed_raw(); + return res; +} + +inline std::string BRepFace::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPFACE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepFaceDefinition.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepFaceDefinition.h new file mode 100644 index 0000000..0a288b3 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepFaceDefinition.h @@ -0,0 +1,121 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPFACEDEFINITION_CPP__ +# define ADSK_FUSION_BREPFACEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_BREPFACEDEFINITION_API +# endif +#else +# define ADSK_FUSION_BREPFACEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepLoopDefinitions; +}} +namespace adsk { namespace core { + class Surface; +}} + +namespace adsk { namespace fusion { + +/// Represents the definition of a B-Rep face that can be used as input to create a BRepBody that includes this face. +class BRepFaceDefinition : public core::Base { +public: + + /// Gets and sets the associate ID of this face definition. This ID will be copied to the corresponding + /// face when the BRepBodyDefinition is used to create a BrepBody. It is used by Fusion360 as + /// the identifier for the face and is used for tracking this geometry for parametric recomputes. + int associativeID() const; + bool associativeID(int value); + + /// Provides access to the BRepLoopDefinitions object associated with this BRepFaceDefinition. + /// It's through the returned collection that you can create new BRepLoopDefinition objects. + core::Ptr loopDefinitions() const; + + /// Gets and sets the surface geometry associated with this face definition. + core::Ptr surfaceGeometry() const; + bool surfaceGeometry(const core::Ptr& value); + + /// Gets and sets if the normal of this face is reversed with respect to the surface geometry associated + /// with this face definition. + bool isParamReversed() const; + bool isParamReversed(bool value); + + ADSK_FUSION_BREPFACEDEFINITION_API static const char* classType(); + ADSK_FUSION_BREPFACEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_BREPFACEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPFACEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual int associativeID_raw() const = 0; + virtual bool associativeID_raw(int value) = 0; + virtual BRepLoopDefinitions* loopDefinitions_raw() const = 0; + virtual core::Surface* surfaceGeometry_raw() const = 0; + virtual bool surfaceGeometry_raw(core::Surface* value) = 0; + virtual bool isParamReversed_raw() const = 0; + virtual bool isParamReversed_raw(bool value) = 0; +}; + +// Inline wrappers + +inline int BRepFaceDefinition::associativeID() const +{ + int res = associativeID_raw(); + return res; +} + +inline bool BRepFaceDefinition::associativeID(int value) +{ + return associativeID_raw(value); +} + +inline core::Ptr BRepFaceDefinition::loopDefinitions() const +{ + core::Ptr res = loopDefinitions_raw(); + return res; +} + +inline core::Ptr BRepFaceDefinition::surfaceGeometry() const +{ + core::Ptr res = surfaceGeometry_raw(); + return res; +} + +inline bool BRepFaceDefinition::surfaceGeometry(const core::Ptr& value) +{ + return surfaceGeometry_raw(value.get()); +} + +inline bool BRepFaceDefinition::isParamReversed() const +{ + bool res = isParamReversed_raw(); + return res; +} + +inline bool BRepFaceDefinition::isParamReversed(bool value) +{ + return isParamReversed_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPFACEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepFaceDefinitions.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepFaceDefinitions.h new file mode 100644 index 0000000..aacc07a --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepFaceDefinitions.h @@ -0,0 +1,106 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPFACEDEFINITIONS_CPP__ +# define ADSK_FUSION_BREPFACEDEFINITIONS_API XI_EXPORT +# else +# define ADSK_FUSION_BREPFACEDEFINITIONS_API +# endif +#else +# define ADSK_FUSION_BREPFACEDEFINITIONS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepFaceDefinition; +}} +namespace adsk { namespace core { + class Surface; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the BRepFaceDefinition objects associated with the object the collection was obtained from. +/// It's through this object that you create new BRepFaceDefinition objects. +class BRepFaceDefinitions : public core::Base { +public: + + /// Function that returns the specified BRepFaceDefinition object using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of B-Rep face definition objects in the collection. + size_t count() const; + + /// Creates a new BrepFaceDefinition within the parent BRepShellDefinition object. + /// surfaceGeometry : Input surface object that defines the geometry of the face. Valid objects for input are + /// NurbsSurface, Cone, Cylinder, EllipticalCone, EllipticalCylinder, Plane, Sphere, and Torus. + /// isParamReversed : Input Boolean that indicates if the normal of this face is reversed with respect to the + /// surface geometry associated with this face definition. + /// Returns the newly created BRepFaceDefinition object or null in the case of failure. + core::Ptr add(const core::Ptr& surfaceGeometry, bool isParamReversed); + + typedef BRepFaceDefinition iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BREPFACEDEFINITIONS_API static const char* classType(); + ADSK_FUSION_BREPFACEDEFINITIONS_API const char* objectType() const override; + ADSK_FUSION_BREPFACEDEFINITIONS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPFACEDEFINITIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepFaceDefinition* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual BRepFaceDefinition* add_raw(core::Surface* surfaceGeometry, bool isParamReversed) = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepFaceDefinitions::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t BRepFaceDefinitions::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr BRepFaceDefinitions::add(const core::Ptr& surfaceGeometry, bool isParamReversed) +{ + core::Ptr res = add_raw(surfaceGeometry.get(), isParamReversed); + return res; +} + +template inline void BRepFaceDefinitions::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPFACEDEFINITIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepFaces.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepFaces.h new file mode 100644 index 0000000..cf1286a --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepFaces.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPFACES_CPP__ +# define ADSK_FUSION_BREPFACES_API XI_EXPORT +# else +# define ADSK_FUSION_BREPFACES_API +# endif +#else +# define ADSK_FUSION_BREPFACES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepFace; +}} + +namespace adsk { namespace fusion { + +/// BRepFace collection. +class BRepFaces : public core::Base { +public: + + /// Function that returns the specified face using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of faces in the collection. + size_t count() const; + + typedef BRepFace iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BREPFACES_API static const char* classType(); + ADSK_FUSION_BREPFACES_API const char* objectType() const override; + ADSK_FUSION_BREPFACES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPFACES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepFace* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepFaces::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t BRepFaces::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void BRepFaces::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPFACES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepLoop.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepLoop.h new file mode 100644 index 0000000..20983ea --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepLoop.h @@ -0,0 +1,187 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPLOOP_CPP__ +# define ADSK_FUSION_BREPLOOP_API XI_EXPORT +# else +# define ADSK_FUSION_BREPLOOP_API +# endif +#else +# define ADSK_FUSION_BREPLOOP_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class BRepCoEdges; + class BRepEdges; + class BRepFace; + class Occurrence; +}} +namespace adsk { namespace core { + class BoundingBox3D; +}} + +namespace adsk { namespace fusion { + +/// Represents a connected portion of a BRepFace boundary. It consists of a chain of BRepCoEdges. +class BRepLoop : public core::Base { +public: + + /// Returns the BRepEdges used by this loop + core::Ptr edges() const; + + /// Returns the BRepCoEdges consisting this loop + core::Ptr coEdges() const; + + /// Returns true of this loop is an outer loop of a face + bool isOuter() const; + + /// Returns the bounding box of this loop + core::Ptr boundingBox() const; + + /// Returns the parent face of the loop. + core::Ptr face() const; + + /// Returns the parent body of the loop. + core::Ptr body() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this + /// object in an assembly. This is only valid in the case where this + /// BRepLoop object is acting as a proxy in an assembly. Returns null + /// in the case where the object is not in the context of an assembly. + /// but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context for the created proxy. + /// Returns the new BrepLoop proxy or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns a token for the BRepLoop object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same loop. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + /// This is only valid for loops that exist in the design, (the isTemporary + /// property is false). + std::string entityToken() const; + + ADSK_FUSION_BREPLOOP_API static const char* classType(); + ADSK_FUSION_BREPLOOP_API const char* objectType() const override; + ADSK_FUSION_BREPLOOP_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPLOOP_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepEdges* edges_raw() const = 0; + virtual BRepCoEdges* coEdges_raw() const = 0; + virtual bool isOuter_raw() const = 0; + virtual core::BoundingBox3D* boundingBox_raw() const = 0; + virtual BRepFace* face_raw() const = 0; + virtual BRepBody* body_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual BRepLoop* nativeObject_raw() const = 0; + virtual BRepLoop* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepLoop::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline core::Ptr BRepLoop::coEdges() const +{ + core::Ptr res = coEdges_raw(); + return res; +} + +inline bool BRepLoop::isOuter() const +{ + bool res = isOuter_raw(); + return res; +} + +inline core::Ptr BRepLoop::boundingBox() const +{ + core::Ptr res = boundingBox_raw(); + return res; +} + +inline core::Ptr BRepLoop::face() const +{ + core::Ptr res = face_raw(); + return res; +} + +inline core::Ptr BRepLoop::body() const +{ + core::Ptr res = body_raw(); + return res; +} + +inline core::Ptr BRepLoop::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr BRepLoop::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr BRepLoop::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline std::string BRepLoop::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPLOOP_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepLoopDefinition.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepLoopDefinition.h new file mode 100644 index 0000000..6845900 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepLoopDefinition.h @@ -0,0 +1,64 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPLOOPDEFINITION_CPP__ +# define ADSK_FUSION_BREPLOOPDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_BREPLOOPDEFINITION_API +# endif +#else +# define ADSK_FUSION_BREPLOOPDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepCoEdgeDefinitions; +}} + +namespace adsk { namespace fusion { + +/// Represents the definition of a B-Rep loop that can be used as input to create a BRepBody that includes this loop. +class BRepLoopDefinition : public core::Base { +public: + + /// Provides access to the BRepCoEdgeDefinitions object associated with the parent BRepFaceDefinition object. + /// It's through the returned collection that you can create new BRepCoEdgeDefinition objects. + core::Ptr bRepCoEdgeDefinitions() const; + + ADSK_FUSION_BREPLOOPDEFINITION_API static const char* classType(); + ADSK_FUSION_BREPLOOPDEFINITION_API const char* objectType() const override; + ADSK_FUSION_BREPLOOPDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPLOOPDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepCoEdgeDefinitions* bRepCoEdgeDefinitions_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepLoopDefinition::bRepCoEdgeDefinitions() const +{ + core::Ptr res = bRepCoEdgeDefinitions_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPLOOPDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepLoopDefinitions.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepLoopDefinitions.h new file mode 100644 index 0000000..ee9dc03 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepLoopDefinitions.h @@ -0,0 +1,99 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPLOOPDEFINITIONS_CPP__ +# define ADSK_FUSION_BREPLOOPDEFINITIONS_API XI_EXPORT +# else +# define ADSK_FUSION_BREPLOOPDEFINITIONS_API +# endif +#else +# define ADSK_FUSION_BREPLOOPDEFINITIONS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepLoopDefinition; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the BRepLoopDefinition objects associated with the parent BRepFaceDefinition object. +/// It's through this object that you create new BRepLoopDefinition objects. +class BRepLoopDefinitions : public core::Base { +public: + + /// Function that returns the specified BRepLoopDefinition object using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of B-Rep loop definition objects in the collection. + size_t count() const; + + /// Creates a new empty loop associated with the parent face definition. + /// Returns the newly created BRepLoopDefinition object. + core::Ptr add(); + + typedef BRepLoopDefinition iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BREPLOOPDEFINITIONS_API static const char* classType(); + ADSK_FUSION_BREPLOOPDEFINITIONS_API const char* objectType() const override; + ADSK_FUSION_BREPLOOPDEFINITIONS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPLOOPDEFINITIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepLoopDefinition* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual BRepLoopDefinition* add_raw() = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepLoopDefinitions::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t BRepLoopDefinitions::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr BRepLoopDefinitions::add() +{ + core::Ptr res = add_raw(); + return res; +} + +template inline void BRepLoopDefinitions::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPLOOPDEFINITIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepLoops.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepLoops.h new file mode 100644 index 0000000..170becc --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepLoops.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPLOOPS_CPP__ +# define ADSK_FUSION_BREPLOOPS_API XI_EXPORT +# else +# define ADSK_FUSION_BREPLOOPS_API +# endif +#else +# define ADSK_FUSION_BREPLOOPS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepLoop; +}} + +namespace adsk { namespace fusion { + +/// BRepLoop collection. +class BRepLoops : public core::Base { +public: + + /// Function that returns the specified loop using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of loops in the collection. + size_t count() const; + + typedef BRepLoop iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BREPLOOPS_API static const char* classType(); + ADSK_FUSION_BREPLOOPS_API const char* objectType() const override; + ADSK_FUSION_BREPLOOPS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPLOOPS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepLoop* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepLoops::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t BRepLoops::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void BRepLoops::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPLOOPS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepLump.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepLump.h new file mode 100644 index 0000000..4c375ed --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepLump.h @@ -0,0 +1,243 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPLUMP_CPP__ +# define ADSK_FUSION_BREPLUMP_API XI_EXPORT +# else +# define ADSK_FUSION_BREPLUMP_API +# endif +#else +# define ADSK_FUSION_BREPLUMP_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class BRepEdges; + class BRepFaces; + class BRepShells; + class BRepVertices; + class MeshManager; + class Occurrence; +}} +namespace adsk { namespace core { + class BoundingBox3D; + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// Represents an entirely connected set of entities. A BRepBody consists of BRepLumps. +class BRepLump : public core::Base { +public: + + /// Returns the BRepShells owned by the lump + core::Ptr shells() const; + + /// Returns the BRepFaces owned by the lump + core::Ptr faces() const; + + /// Returns the BRepEdges owned by the lump + core::Ptr edges() const; + + /// Returns the BRepVertices owned by the lump + core::Ptr vertices() const; + + /// Returns the immediate owner BRepBody of the lump + core::Ptr body() const; + + /// Returns true of the lump is closed + bool isClosed() const; + + /// Returns the bounding box of the lump + core::Ptr boundingBox() const; + + /// Returns the area in cm ^ 2. + double area() const; + + /// Returns the volume in cm ^ 3. Returns 0 in the case the lump is not solid. + double volume() const; + + /// Determines the relationship of the input point with respect to this lump. + /// point : The point to do the containment check for. + /// Returns a value from the PointContainment enum indicating the relationship of + /// the input point to the lump. + PointContainment pointContainment(const core::Ptr& point); + + /// Returns the mesh manager object for this lump. + core::Ptr meshManager() const; + + /// Returns the assembly context that is directly referencing this + /// object in an assembly. This is only valid in the case where this + /// BRepLump object is acting as a proxy in an assembly. Returns null + /// in the case where the object is not in the context of an assembly. + /// but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context for the created proxy. + /// Returns the new BrepLump proxy or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns a token for the BRepLump object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same lump. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + /// This is only valid for lump that exist in the design, (the isTemporary + /// property is false). + std::string entityToken() const; + + ADSK_FUSION_BREPLUMP_API static const char* classType(); + ADSK_FUSION_BREPLUMP_API const char* objectType() const override; + ADSK_FUSION_BREPLUMP_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPLUMP_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepShells* shells_raw() const = 0; + virtual BRepFaces* faces_raw() const = 0; + virtual BRepEdges* edges_raw() const = 0; + virtual BRepVertices* vertices_raw() const = 0; + virtual BRepBody* body_raw() const = 0; + virtual bool isClosed_raw() const = 0; + virtual core::BoundingBox3D* boundingBox_raw() const = 0; + virtual double area_raw() const = 0; + virtual double volume_raw() const = 0; + virtual PointContainment pointContainment_raw(core::Point3D* point) = 0; + virtual MeshManager* meshManager_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual BRepLump* nativeObject_raw() const = 0; + virtual BRepLump* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepLump::shells() const +{ + core::Ptr res = shells_raw(); + return res; +} + +inline core::Ptr BRepLump::faces() const +{ + core::Ptr res = faces_raw(); + return res; +} + +inline core::Ptr BRepLump::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline core::Ptr BRepLump::vertices() const +{ + core::Ptr res = vertices_raw(); + return res; +} + +inline core::Ptr BRepLump::body() const +{ + core::Ptr res = body_raw(); + return res; +} + +inline bool BRepLump::isClosed() const +{ + bool res = isClosed_raw(); + return res; +} + +inline core::Ptr BRepLump::boundingBox() const +{ + core::Ptr res = boundingBox_raw(); + return res; +} + +inline double BRepLump::area() const +{ + double res = area_raw(); + return res; +} + +inline double BRepLump::volume() const +{ + double res = volume_raw(); + return res; +} + +inline PointContainment BRepLump::pointContainment(const core::Ptr& point) +{ + PointContainment res = pointContainment_raw(point.get()); + return res; +} + +inline core::Ptr BRepLump::meshManager() const +{ + core::Ptr res = meshManager_raw(); + return res; +} + +inline core::Ptr BRepLump::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr BRepLump::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr BRepLump::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline std::string BRepLump::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPLUMP_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepLumpDefinition.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepLumpDefinition.h new file mode 100644 index 0000000..c68dc7f --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepLumpDefinition.h @@ -0,0 +1,64 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPLUMPDEFINITION_CPP__ +# define ADSK_FUSION_BREPLUMPDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_BREPLUMPDEFINITION_API +# endif +#else +# define ADSK_FUSION_BREPLUMPDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepShellDefinitions; +}} + +namespace adsk { namespace fusion { + +/// Represents the definition of a B-Rep lump which is used in defining the topology of a B-Rep body. +class BRepLumpDefinition : public core::Base { +public: + + /// Provides access to the BRepShellDefinitions object associated with this BRepLumpDefinition. + /// It's through the returned collection that you can create new BRepShellDefinition objects. + core::Ptr shellDefinitions() const; + + ADSK_FUSION_BREPLUMPDEFINITION_API static const char* classType(); + ADSK_FUSION_BREPLUMPDEFINITION_API const char* objectType() const override; + ADSK_FUSION_BREPLUMPDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPLUMPDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepShellDefinitions* shellDefinitions_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepLumpDefinition::shellDefinitions() const +{ + core::Ptr res = shellDefinitions_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPLUMPDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepLumpDefinitions.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepLumpDefinitions.h new file mode 100644 index 0000000..72f9499 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepLumpDefinitions.h @@ -0,0 +1,99 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPLUMPDEFINITIONS_CPP__ +# define ADSK_FUSION_BREPLUMPDEFINITIONS_API XI_EXPORT +# else +# define ADSK_FUSION_BREPLUMPDEFINITIONS_API +# endif +#else +# define ADSK_FUSION_BREPLUMPDEFINITIONS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepLumpDefinition; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the BRepLumpDefinition objects associated with the BRepBodyDefinition +/// and it's through this object that you create new BRepLumpDefinition objects. +class BRepLumpDefinitions : public core::Base { +public: + + /// Function that returns the specified BRepLumpDefinition object using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of B-Rep lump definition objects in the collection. + size_t count() const; + + /// Creates a new empty BRepLumpDefinition associated with the parent BRepBodyDefinition object. + /// Returns the newly created BRepLumpDefinition object. + core::Ptr add(); + + typedef BRepLumpDefinition iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BREPLUMPDEFINITIONS_API static const char* classType(); + ADSK_FUSION_BREPLUMPDEFINITIONS_API const char* objectType() const override; + ADSK_FUSION_BREPLUMPDEFINITIONS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPLUMPDEFINITIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepLumpDefinition* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual BRepLumpDefinition* add_raw() = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepLumpDefinitions::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t BRepLumpDefinitions::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr BRepLumpDefinitions::add() +{ + core::Ptr res = add_raw(); + return res; +} + +template inline void BRepLumpDefinitions::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPLUMPDEFINITIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepLumps.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepLumps.h new file mode 100644 index 0000000..957866a --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepLumps.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPLUMPS_CPP__ +# define ADSK_FUSION_BREPLUMPS_API XI_EXPORT +# else +# define ADSK_FUSION_BREPLUMPS_API +# endif +#else +# define ADSK_FUSION_BREPLUMPS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepLump; +}} + +namespace adsk { namespace fusion { + +/// BRepLump collection. +class BRepLumps : public core::Base { +public: + + /// Function that returns the specified lump using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of lumps in the collection. + size_t count() const; + + typedef BRepLump iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BREPLUMPS_API static const char* classType(); + ADSK_FUSION_BREPLUMPS_API const char* objectType() const override; + ADSK_FUSION_BREPLUMPS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPLUMPS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepLump* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepLumps::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t BRepLumps::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void BRepLumps::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPLUMPS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepShell.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepShell.h new file mode 100644 index 0000000..16ab5ff --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepShell.h @@ -0,0 +1,265 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPSHELL_CPP__ +# define ADSK_FUSION_BREPSHELL_API XI_EXPORT +# else +# define ADSK_FUSION_BREPSHELL_API +# endif +#else +# define ADSK_FUSION_BREPSHELL_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class BRepEdges; + class BRepFaces; + class BRepLump; + class BRepVertices; + class BRepWire; + class MeshManager; + class Occurrence; +}} +namespace adsk { namespace core { + class BoundingBox3D; + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// Represents an entirely connected set of BRepFaces. A BRepLump may contain multiple BRepShells. +class BRepShell : public core::Base { +public: + + /// Returns the BRepFaces directly owned by this shell + core::Ptr faces() const; + + /// returns the BRepEdges owned by this shell + core::Ptr edges() const; + + /// Returns the BRepVertices owned by this shell + core::Ptr vertices() const; + + /// Returns the parent lump of this shell. + core::Ptr lump() const; + + /// Returns the parent body of the shell. + core::Ptr body() const; + + /// Returns the bounding box of this shell + core::Ptr boundingBox() const; + + /// Determines the relationship of the input point with respect to this shell. + /// point : The point to do the containment check for. + /// Returns a value from the PointContainment enum indicating the relationship of + /// the input point to the shell. + PointContainment pointContainment(const core::Ptr& point); + + /// Returns true if this shell is closed + bool isClosed() const; + + /// Returns true if the faces of this shell bound a void or an empty space within an outer shell. + bool isVoid() const; + + /// Returns the area in cm ^ 2. + double area() const; + + /// Returns the volume in cm ^ 3. Returns 0 in the case the shell is not solid. + double volume() const; + + /// Returns the mesh manager object for this shell. + core::Ptr meshManager() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this + /// object in an assembly. This is only valid in the case where this + /// BRepShell object is acting as a proxy in an assembly. Returns null + /// in the case where the object is not in the context of an assembly. + /// but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context for the created proxy. + /// Returns the new BrepShell proxy or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns the wire body, if any, that exists in this shell. Returns null if the + /// shell doesn't have a wire body. + core::Ptr wire() const; + + /// Returns a token for the BRepShell object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same shell. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + /// This is only valid for shells that exist in the design, (the isTemporary + /// property is false). + std::string entityToken() const; + + ADSK_FUSION_BREPSHELL_API static const char* classType(); + ADSK_FUSION_BREPSHELL_API const char* objectType() const override; + ADSK_FUSION_BREPSHELL_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPSHELL_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepFaces* faces_raw() const = 0; + virtual BRepEdges* edges_raw() const = 0; + virtual BRepVertices* vertices_raw() const = 0; + virtual BRepLump* lump_raw() const = 0; + virtual BRepBody* body_raw() const = 0; + virtual core::BoundingBox3D* boundingBox_raw() const = 0; + virtual PointContainment pointContainment_raw(core::Point3D* point) = 0; + virtual bool isClosed_raw() const = 0; + virtual bool isVoid_raw() const = 0; + virtual double area_raw() const = 0; + virtual double volume_raw() const = 0; + virtual MeshManager* meshManager_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual BRepShell* nativeObject_raw() const = 0; + virtual BRepShell* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual BRepWire* wire_raw() const = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepShell::faces() const +{ + core::Ptr res = faces_raw(); + return res; +} + +inline core::Ptr BRepShell::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline core::Ptr BRepShell::vertices() const +{ + core::Ptr res = vertices_raw(); + return res; +} + +inline core::Ptr BRepShell::lump() const +{ + core::Ptr res = lump_raw(); + return res; +} + +inline core::Ptr BRepShell::body() const +{ + core::Ptr res = body_raw(); + return res; +} + +inline core::Ptr BRepShell::boundingBox() const +{ + core::Ptr res = boundingBox_raw(); + return res; +} + +inline PointContainment BRepShell::pointContainment(const core::Ptr& point) +{ + PointContainment res = pointContainment_raw(point.get()); + return res; +} + +inline bool BRepShell::isClosed() const +{ + bool res = isClosed_raw(); + return res; +} + +inline bool BRepShell::isVoid() const +{ + bool res = isVoid_raw(); + return res; +} + +inline double BRepShell::area() const +{ + double res = area_raw(); + return res; +} + +inline double BRepShell::volume() const +{ + double res = volume_raw(); + return res; +} + +inline core::Ptr BRepShell::meshManager() const +{ + core::Ptr res = meshManager_raw(); + return res; +} + +inline core::Ptr BRepShell::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr BRepShell::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr BRepShell::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr BRepShell::wire() const +{ + core::Ptr res = wire_raw(); + return res; +} + +inline std::string BRepShell::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPSHELL_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepShellDefinition.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepShellDefinition.h new file mode 100644 index 0000000..0cdbae8 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepShellDefinition.h @@ -0,0 +1,75 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPSHELLDEFINITION_CPP__ +# define ADSK_FUSION_BREPSHELLDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_BREPSHELLDEFINITION_API +# endif +#else +# define ADSK_FUSION_BREPSHELLDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepFaceDefinitions; + class BRepWireDefinition; +}} + +namespace adsk { namespace fusion { + +/// Represents the definition of a B-Rep shell that can be used as input to create a BRepBody that includes this shell. +class BRepShellDefinition : public core::Base { +public: + + /// Provides access to the BRepFaceDefinitions object associated with this BRepShellDefinition. + /// It's through the returned collection that you can create new BRepFaceDefinition objects. + core::Ptr faceDefinitions() const; + + /// Returns the single BRepWireDefinition associated with this shell definition. + core::Ptr wireDefinition() const; + + ADSK_FUSION_BREPSHELLDEFINITION_API static const char* classType(); + ADSK_FUSION_BREPSHELLDEFINITION_API const char* objectType() const override; + ADSK_FUSION_BREPSHELLDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPSHELLDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepFaceDefinitions* faceDefinitions_raw() const = 0; + virtual BRepWireDefinition* wireDefinition_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepShellDefinition::faceDefinitions() const +{ + core::Ptr res = faceDefinitions_raw(); + return res; +} + +inline core::Ptr BRepShellDefinition::wireDefinition() const +{ + core::Ptr res = wireDefinition_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPSHELLDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepShellDefinitions.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepShellDefinitions.h new file mode 100644 index 0000000..24f0f06 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepShellDefinitions.h @@ -0,0 +1,99 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPSHELLDEFINITIONS_CPP__ +# define ADSK_FUSION_BREPSHELLDEFINITIONS_API XI_EXPORT +# else +# define ADSK_FUSION_BREPSHELLDEFINITIONS_API +# endif +#else +# define ADSK_FUSION_BREPSHELLDEFINITIONS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepShellDefinition; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the BRepShellDefinition objects associated with the object the collection was obtained from. +/// It's through this object that you create new BRepShellDefinition objects. +class BRepShellDefinitions : public core::Base { +public: + + /// Function that returns the specified BRepShellDefinition object using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of B-Rep shell definition objects in the collection. + size_t count() const; + + /// Creates a new empty BRepShellDefinition object associated with the parent BRepLumpDefinition. + /// Returns the newly created BRepShellDefinition object. + core::Ptr add(); + + typedef BRepShellDefinition iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BREPSHELLDEFINITIONS_API static const char* classType(); + ADSK_FUSION_BREPSHELLDEFINITIONS_API const char* objectType() const override; + ADSK_FUSION_BREPSHELLDEFINITIONS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPSHELLDEFINITIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepShellDefinition* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual BRepShellDefinition* add_raw() = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepShellDefinitions::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t BRepShellDefinitions::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr BRepShellDefinitions::add() +{ + core::Ptr res = add_raw(); + return res; +} + +template inline void BRepShellDefinitions::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPSHELLDEFINITIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepShells.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepShells.h new file mode 100644 index 0000000..67f37cc --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepShells.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPSHELLS_CPP__ +# define ADSK_FUSION_BREPSHELLS_API XI_EXPORT +# else +# define ADSK_FUSION_BREPSHELLS_API +# endif +#else +# define ADSK_FUSION_BREPSHELLS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepShell; +}} + +namespace adsk { namespace fusion { + +/// BRepShell collection. +class BRepShells : public core::Base { +public: + + /// Function that returns the specified shell using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of shells in the collection. + size_t count() const; + + typedef BRepShell iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BREPSHELLS_API static const char* classType(); + ADSK_FUSION_BREPSHELLS_API const char* objectType() const override; + ADSK_FUSION_BREPSHELLS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPSHELLS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepShell* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepShells::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t BRepShells::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void BRepShells::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPSHELLS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepVertex.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepVertex.h new file mode 100644 index 0000000..880d9e2 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepVertex.h @@ -0,0 +1,222 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPVERTEX_CPP__ +# define ADSK_FUSION_BREPVERTEX_API XI_EXPORT +# else +# define ADSK_FUSION_BREPVERTEX_API +# endif +#else +# define ADSK_FUSION_BREPVERTEX_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class BRepEdges; + class BRepFaces; + class BRepShell; + class Occurrence; +}} +namespace adsk { namespace core { + class Attributes; + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// A 0-dimensional topological entity that bounds a BRepEdge. +class BRepVertex : public core::Base { +public: + + /// Returns the BRepFaces that uses this vertex through BRepEdge + core::Ptr faces() const; + + /// Returns the BRepEdges bounded by this vertex + core::Ptr edges() const; + + /// Returns if the vertex is tolerant. + /// The tolerance used is available from the tolerance property. + bool isTolerant() const; + + /// Returns the tolerance used by a tolerant vertex. + /// This value is only useful when isTolerant is true. + double tolerance() const; + + /// Returns the underlying geometry point + core::Ptr geometry() const; + + /// Returns the parent shell. + core::Ptr shell() const; + + /// Returns the parent body. + core::Ptr body() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this + /// object in an assembly. This is only valid in the case where this + /// BRepVertex object is acting as a proxy in an assembly. Returns null + /// in the case where the object is not in the context of an assembly. + /// but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context for the created proxy. + /// Returns the new BrepVertex proxy or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns the collection of attributes associated with this face. + core::Ptr attributes() const; + + /// Returns the temporary ID of this vertex. This ID is only good while the document + /// remains open and as long as the owning BRepBody is not modified in any way. + /// The findByTempId method of the BRepBody will return the entity in the body with the given ID. + int tempId() const; + + /// Returns a token for the BRepVertex object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same vertex. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + /// This is only valid for vertices that exist in the design, (the isTemporary + /// property is false). + std::string entityToken() const; + + ADSK_FUSION_BREPVERTEX_API static const char* classType(); + ADSK_FUSION_BREPVERTEX_API const char* objectType() const override; + ADSK_FUSION_BREPVERTEX_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPVERTEX_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepFaces* faces_raw() const = 0; + virtual BRepEdges* edges_raw() const = 0; + virtual bool isTolerant_raw() const = 0; + virtual double tolerance_raw() const = 0; + virtual core::Point3D* geometry_raw() const = 0; + virtual BRepShell* shell_raw() const = 0; + virtual BRepBody* body_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual BRepVertex* nativeObject_raw() const = 0; + virtual BRepVertex* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual int tempId_raw() const = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepVertex::faces() const +{ + core::Ptr res = faces_raw(); + return res; +} + +inline core::Ptr BRepVertex::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline bool BRepVertex::isTolerant() const +{ + bool res = isTolerant_raw(); + return res; +} + +inline double BRepVertex::tolerance() const +{ + double res = tolerance_raw(); + return res; +} + +inline core::Ptr BRepVertex::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline core::Ptr BRepVertex::shell() const +{ + core::Ptr res = shell_raw(); + return res; +} + +inline core::Ptr BRepVertex::body() const +{ + core::Ptr res = body_raw(); + return res; +} + +inline core::Ptr BRepVertex::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr BRepVertex::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr BRepVertex::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr BRepVertex::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline int BRepVertex::tempId() const +{ + int res = tempId_raw(); + return res; +} + +inline std::string BRepVertex::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPVERTEX_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepVertexDefinition.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepVertexDefinition.h new file mode 100644 index 0000000..45c4a15 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepVertexDefinition.h @@ -0,0 +1,70 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPVERTEXDEFINITION_CPP__ +# define ADSK_FUSION_BREPVERTEXDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_BREPVERTEXDEFINITION_API +# endif +#else +# define ADSK_FUSION_BREPVERTEXDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// Represents the definition of a B-Rep vertex that can be used as input to create a BRepBody that includes this vertex. +class BRepVertexDefinition : public core::Base { +public: + + /// Gets and sets the position of the vertex in model space. + core::Ptr position() const; + bool position(const core::Ptr& value); + + ADSK_FUSION_BREPVERTEXDEFINITION_API static const char* classType(); + ADSK_FUSION_BREPVERTEXDEFINITION_API const char* objectType() const override; + ADSK_FUSION_BREPVERTEXDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPVERTEXDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Point3D* position_raw() const = 0; + virtual bool position_raw(core::Point3D* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepVertexDefinition::position() const +{ + core::Ptr res = position_raw(); + return res; +} + +inline bool BRepVertexDefinition::position(const core::Ptr& value) +{ + return position_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPVERTEXDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepVertices.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepVertices.h new file mode 100644 index 0000000..4f2708e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepVertices.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPVERTICES_CPP__ +# define ADSK_FUSION_BREPVERTICES_API XI_EXPORT +# else +# define ADSK_FUSION_BREPVERTICES_API +# endif +#else +# define ADSK_FUSION_BREPVERTICES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepVertex; +}} + +namespace adsk { namespace fusion { + +/// BRepVertex collection. +class BRepVertices : public core::Base { +public: + + /// Function that returns the specified vertex using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of vertices in the collection. + size_t count() const; + + typedef BRepVertex iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BREPVERTICES_API static const char* classType(); + ADSK_FUSION_BREPVERTICES_API const char* objectType() const override; + ADSK_FUSION_BREPVERTICES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPVERTICES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepVertex* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepVertices::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t BRepVertices::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void BRepVertices::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPVERTICES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepWire.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepWire.h new file mode 100644 index 0000000..9ca6a83 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepWire.h @@ -0,0 +1,174 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPWIRE_CPP__ +# define ADSK_FUSION_BREPWIRE_API XI_EXPORT +# else +# define ADSK_FUSION_BREPWIRE_API +# endif +#else +# define ADSK_FUSION_BREPWIRE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class BRepCoEdges; + class BRepEdges; + class BRepVertices; + class Occurrence; +}} +namespace adsk { namespace core { + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// Represents a single B-Rep wire body. A wire body consists of one or +/// more edges and their vertices. +class BRepWire : public core::Base { +public: + + /// Returns the B-Rep edges associated with this wire body. + core::Ptr edges() const; + + /// Returns the B-Rep vertices associated with this wire body. + core::Ptr vertices() const; + + /// Returns the co-edges associated with this wire body. The co-edges record + /// the connections between the edges in the wire body. + core::Ptr coEdges() const; + + /// Indicates if this entities making up this wire body are planar and all lie on the same plane. + bool isPlanar() const; + + /// Returns the parent BRepBody object that contains this wire. + core::Ptr parent() const; + + /// Method that computes the offset for a planar wire. A BRepBody containing the resulting + /// BRepWire object(s) is returned. It's possible that the offset result of a single wire + /// can result in multiple wires. + /// planeNormal : Input Vector3D object that defines the positive direction of the + /// plane the plane the wire lies on. This vector must be normal to the plane and is used to + /// determine the side to offset the curves to. A positive offset distance is in the direction + /// of the cross product (wire_tangent x wire_plane_normal). A negative offset is in the + /// opposite direction. + /// distance : The offset distance in centimeters. See the description for the Normal argument to see how + /// a positive or negative value for the distance specifies the direction of the offset. + /// cornerType : Specifies how the corners are connected when offsetting the curves results in gaps in the corners. + /// See the documentation of the enum for a detailed description of each option. + /// Returns a new temporary BRepBody that contains one or more wires that represent the offset. + core::Ptr offsetPlanarWire(const core::Ptr& planeNormal, double distance, OffsetCornerTypes cornerType); + + /// Returns the assembly occurrence (i.e. the occurrence) of this + /// object in an assembly. This is only valid in the case where this + /// BRepFace object is acting as a proxy in an assembly. Returns null + /// in the case where the object is not in the context of an assembly. + /// but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context for the created proxy. + /// Returns the new BRepWire proxy or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_BREPWIRE_API static const char* classType(); + ADSK_FUSION_BREPWIRE_API const char* objectType() const override; + ADSK_FUSION_BREPWIRE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPWIRE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepEdges* edges_raw() const = 0; + virtual BRepVertices* vertices_raw() const = 0; + virtual BRepCoEdges* coEdges_raw() const = 0; + virtual bool isPlanar_raw() const = 0; + virtual BRepBody* parent_raw() const = 0; + virtual BRepBody* offsetPlanarWire_raw(core::Vector3D* planeNormal, double distance, OffsetCornerTypes cornerType) = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual BRepWire* nativeObject_raw() const = 0; + virtual BRepWire* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepWire::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline core::Ptr BRepWire::vertices() const +{ + core::Ptr res = vertices_raw(); + return res; +} + +inline core::Ptr BRepWire::coEdges() const +{ + core::Ptr res = coEdges_raw(); + return res; +} + +inline bool BRepWire::isPlanar() const +{ + bool res = isPlanar_raw(); + return res; +} + +inline core::Ptr BRepWire::parent() const +{ + core::Ptr res = parent_raw(); + return res; +} + +inline core::Ptr BRepWire::offsetPlanarWire(const core::Ptr& planeNormal, double distance, OffsetCornerTypes cornerType) +{ + core::Ptr res = offsetPlanarWire_raw(planeNormal.get(), distance, cornerType); + return res; +} + +inline core::Ptr BRepWire::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr BRepWire::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr BRepWire::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPWIRE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepWireDefinition.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepWireDefinition.h new file mode 100644 index 0000000..a185af5 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepWireDefinition.h @@ -0,0 +1,64 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPWIREDEFINITION_CPP__ +# define ADSK_FUSION_BREPWIREDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_BREPWIREDEFINITION_API +# endif +#else +# define ADSK_FUSION_BREPWIREDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepWireEdgeDefinitions; +}} + +namespace adsk { namespace fusion { + +/// Represents the definition of a B-Rep wire that can be used as input to create a BRepBody that includes this wire. +class BRepWireDefinition : public core::Base { +public: + + /// Provides access to the BRepWireEdgeDefinitions object associated with the parent BRepWireDefinition object. + /// It's through the returned collection that you can create new BRepWireEdgeDefinitions objects. + core::Ptr wireEdgeDefinitions() const; + + ADSK_FUSION_BREPWIREDEFINITION_API static const char* classType(); + ADSK_FUSION_BREPWIREDEFINITION_API const char* objectType() const override; + ADSK_FUSION_BREPWIREDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPWIREDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepWireEdgeDefinitions* wireEdgeDefinitions_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepWireDefinition::wireEdgeDefinitions() const +{ + core::Ptr res = wireEdgeDefinitions_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPWIREDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepWireEdgeDefinition.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepWireEdgeDefinition.h new file mode 100644 index 0000000..bd99d0e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepWireEdgeDefinition.h @@ -0,0 +1,127 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPWIREEDGEDEFINITION_CPP__ +# define ADSK_FUSION_BREPWIREEDGEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_BREPWIREEDGEDEFINITION_API +# endif +#else +# define ADSK_FUSION_BREPWIREEDGEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepVertexDefinition; +}} +namespace adsk { namespace core { + class Curve3D; +}} + +namespace adsk { namespace fusion { + +/// Represents the definition of an edge in B-Rep wire that can be used as input to create a BRepBody that includes this wire edge. +class BRepWireEdgeDefinition : public core::Base { +public: + + /// Gets and sets the associate ID of this B-Rep wire definition. This ID will be copied to the corresponding + /// edge when the BRepBodyDefinition is used to create a BrepBody. It is used by Fusion360 as + /// the identifier for the edge and is used for tracking this geometry for parametric recomputes. + int associativeID() const; + bool associativeID(int value); + + /// Gets and sets the start vertex of the wire edge definition. + core::Ptr startVertex() const; + bool startVertex(const core::Ptr& value); + + /// Gets and sets the end vertex of the wire edge definition. + core::Ptr endVertex() const; + bool endVertex(const core::Ptr& value); + + /// Gets and sets the Curve3D object that defines the shape of the edge using 3D geometry in model space. + /// Valid objects are an Arc3D, NurbsCurve3D, Circle3D, Ellipse3D, EllipticalArc3D, or Line3D. + core::Ptr modelSpaceCurve() const; + bool modelSpaceCurve(const core::Ptr& value); + + ADSK_FUSION_BREPWIREEDGEDEFINITION_API static const char* classType(); + ADSK_FUSION_BREPWIREEDGEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_BREPWIREEDGEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPWIREEDGEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual int associativeID_raw() const = 0; + virtual bool associativeID_raw(int value) = 0; + virtual BRepVertexDefinition* startVertex_raw() const = 0; + virtual bool startVertex_raw(BRepVertexDefinition* value) = 0; + virtual BRepVertexDefinition* endVertex_raw() const = 0; + virtual bool endVertex_raw(BRepVertexDefinition* value) = 0; + virtual core::Curve3D* modelSpaceCurve_raw() const = 0; + virtual bool modelSpaceCurve_raw(core::Curve3D* value) = 0; +}; + +// Inline wrappers + +inline int BRepWireEdgeDefinition::associativeID() const +{ + int res = associativeID_raw(); + return res; +} + +inline bool BRepWireEdgeDefinition::associativeID(int value) +{ + return associativeID_raw(value); +} + +inline core::Ptr BRepWireEdgeDefinition::startVertex() const +{ + core::Ptr res = startVertex_raw(); + return res; +} + +inline bool BRepWireEdgeDefinition::startVertex(const core::Ptr& value) +{ + return startVertex_raw(value.get()); +} + +inline core::Ptr BRepWireEdgeDefinition::endVertex() const +{ + core::Ptr res = endVertex_raw(); + return res; +} + +inline bool BRepWireEdgeDefinition::endVertex(const core::Ptr& value) +{ + return endVertex_raw(value.get()); +} + +inline core::Ptr BRepWireEdgeDefinition::modelSpaceCurve() const +{ + core::Ptr res = modelSpaceCurve_raw(); + return res; +} + +inline bool BRepWireEdgeDefinition::modelSpaceCurve(const core::Ptr& value) +{ + return modelSpaceCurve_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPWIREEDGEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepWireEdgeDefinitions.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepWireEdgeDefinitions.h new file mode 100644 index 0000000..a62d055 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepWireEdgeDefinitions.h @@ -0,0 +1,108 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPWIREEDGEDEFINITIONS_CPP__ +# define ADSK_FUSION_BREPWIREEDGEDEFINITIONS_API XI_EXPORT +# else +# define ADSK_FUSION_BREPWIREEDGEDEFINITIONS_API +# endif +#else +# define ADSK_FUSION_BREPWIREEDGEDEFINITIONS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepVertexDefinition; + class BRepWireEdgeDefinition; +}} +namespace adsk { namespace core { + class Curve3D; +}} + +namespace adsk { namespace fusion { + +/// +class BRepWireEdgeDefinitions : public core::Base { +public: + + /// Function that returns the specified BRepWireEdgeDefinition object using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of B-Rep wire edge definition objects in the collection. + size_t count() const; + + /// Creates a new BRepWireEdgeDefinition object associated with the parent BRepWireDefinition object. + /// startVertex : Vertex definition that defines the start of the edge. For a closed curve, like a circle, you still + /// need to provide a vertex on the curve but should use the same BRepVertexDefinition for both the start and end vertices. + /// endVertex : Vertex definition that defines the end of the edge. For a closed curve, like a circle, this should be the + /// same vertex as used for the start vertex. + /// modelSpaceCurve : A Curve3D object that defines the shape of the edge using 3D geometry in model space. + /// Valid input is an Arc3D, NurbsCurve3D, Circle3D, Ellipse3D, EllipticalArc3D, or Line3D. + /// Returns the newly created BRepWireEdgeDefinition object or null in the case of failure. + core::Ptr add(const core::Ptr& startVertex, const core::Ptr& endVertex, const core::Ptr& modelSpaceCurve); + + typedef BRepWireEdgeDefinition iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BREPWIREEDGEDEFINITIONS_API static const char* classType(); + ADSK_FUSION_BREPWIREEDGEDEFINITIONS_API const char* objectType() const override; + ADSK_FUSION_BREPWIREEDGEDEFINITIONS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPWIREEDGEDEFINITIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepWireEdgeDefinition* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual BRepWireEdgeDefinition* add_raw(BRepVertexDefinition* startVertex, BRepVertexDefinition* endVertex, core::Curve3D* modelSpaceCurve) = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepWireEdgeDefinitions::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t BRepWireEdgeDefinitions::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr BRepWireEdgeDefinitions::add(const core::Ptr& startVertex, const core::Ptr& endVertex, const core::Ptr& modelSpaceCurve) +{ + core::Ptr res = add_raw(startVertex.get(), endVertex.get(), modelSpaceCurve.get()); + return res; +} + +template inline void BRepWireEdgeDefinitions::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPWIREEDGEDEFINITIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/BRepWires.h b/usr/autodesk/CPP/include/Fusion/BRep/BRepWires.h new file mode 100644 index 0000000..32e0af0 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/BRepWires.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPWIRES_CPP__ +# define ADSK_FUSION_BREPWIRES_API XI_EXPORT +# else +# define ADSK_FUSION_BREPWIRES_API +# endif +#else +# define ADSK_FUSION_BREPWIRES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepWire; +}} + +namespace adsk { namespace fusion { + +/// Provides access to B-Rep wire bodies. +class BRepWires : public core::Base { +public: + + /// Function that returns the specified wire using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of B-Rep wire bodies in the collection. + size_t count() const; + + typedef BRepWire iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BREPWIRES_API static const char* classType(); + ADSK_FUSION_BREPWIRES_API const char* objectType() const override; + ADSK_FUSION_BREPWIRES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPWIRES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepWire* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepWires::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t BRepWires::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void BRepWires::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPWIRES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/BRep/TemporaryBRepManager.h b/usr/autodesk/CPP/include/Fusion/BRep/TemporaryBRepManager.h new file mode 100644 index 0000000..79f7e00 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/BRep/TemporaryBRepManager.h @@ -0,0 +1,446 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TEMPORARYBREPMANAGER_CPP__ +# define ADSK_FUSION_TEMPORARYBREPMANAGER_API XI_EXPORT +# else +# define ADSK_FUSION_TEMPORARYBREPMANAGER_API +# endif +#else +# define ADSK_FUSION_TEMPORARYBREPMANAGER_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBodies; + class BRepBody; + class BRepEdge; + class BRepFace; + class BRepWire; +}} +namespace adsk { namespace core { + class Curve3D; + class Matrix3D; + class OrientedBoundingBox3D; + class Plane; + class Point3D; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// A utility object that provides functionality to create and manipulate B-Rep data outside +/// the context of a document. The provides direct access to the modeling core without the +/// overhead of parametrics, persistence, transactions, or graphics. It also provides a way +/// of directly defining and creating B-Rep data. +class TemporaryBRepManager : public core::Base { +public: + + /// Gets the TempoaryBRepManager object. This object provides access to functionality to + /// create an manipulate temporary B-Rep data outside the context of a document. + /// Returns the TemporaryBRepManager object. + static core::Ptr get(); + + /// Creates a temporary copy of the input BRepBody, BRepFace, or BRepEdge object. + /// bRepEntity : The BRepBody, BRepFace, BRepLoop, or BRepEdge to create a copy of. This can be a parametric + /// B-Rep entity or a temporary B-Rep entity. + /// Returns a BRepBody that contains the result. If a BRepBody is input the copy is + /// of the entire body. If a BRepFace is input, then the result is a BRepBody that + /// contains a single face. If a BRepLoop is input then the result is a BRepBody that + /// contains a wire where each edge in the loop will have a corresponding edge in the wire. + /// If a BRepEdge is input then the result is a BRepBody that contains a wire that contains + /// the single edge. + core::Ptr copy(const core::Ptr& bRepEntity); + + /// Calculates the intersection between the input body and plane and creates a + /// wire body that represents the intersection curves. + /// body : The BRepBody to intersection. + /// plane : The geometry Plane to intersect with the body. + /// Returns a BRepBody that contains a wire body that represents the intersection. + core::Ptr planeIntersection(const core::Ptr& body, const core::Ptr& plane); + + /// Creates a new body by creating a ruled surface between the two input wire bodies. + /// sectionOne : BRepWire that defines the shape of the first section. + /// sectionTwo : BRepWire that defines the shape of the second section. + /// Returns the created ruled surface as a BRepBody object. + core::Ptr createRuledSurface(const core::Ptr& sectionOne, const core::Ptr& sectionTwo); + + /// Calculates the silhouette curve geometry for a given face as viewed from a given direction. + /// face : Input BRepFace object to calculate the silhouette curve for. + /// viewDirection : Input Vector3D object that defines the view direction to calculate the silhouette curve relative to. + /// The silhouette curve(s) will lie along the path where the face normal is perpendicular to the view direction. + /// returnCoincidentSilhouettes : Input Boolean that specifies if silhouette curves that are coincident to the edges of the face should be + /// returned or not. If true, these curves will be returned. + /// Returns a SurfaceBody object that will contain one or more BRepWire objects that represent the silhouette curve(s). + /// This method can return null in the case where there is not a silhouette curve for the specified face. + core::Ptr createSilhouetteCurves(const core::Ptr& face, const core::Ptr& viewDirection, bool returnCoincidentSilhouettes); + + /// Deletes one or more faces from a temporary BRepBody. The body that will be modified is determined + /// by getting the parent body of the input faces. + /// faces : An array of BRepFace objects to delete. If more than one face is provided, + /// all of the faces must exist within the same body. + /// deleteSpecifiedFaces : This allows you to either delete the faces that were input or to keep those faces and delete all the + /// other faces in the body. + /// Returns true if the operation was successful. + bool deleteFaces(const std::vector>& faces, bool deleteSpecifiedFaces); + + /// Performs the specified Boolean operation between the two input bodies. The input bodies need + /// not be solid but can be faces that are combined or trimmed. + /// targetBody : The target body that will be modified as a result of the Boolean operation. + /// toolBody : The tool body that will be used to operate on the target body. + /// booleanType : The type of Boolean operation to perform. + /// Returns true if the operation was successful. If successful, the target body is modified as a result of the + /// Boolean operation. Because of this the targetBody must always be a temporary BRepBody. The tool body is not + /// modified. This is analogous to a machining operation where you have the target that is being machined and + /// the tool that removes material. + bool booleanOperation(const core::Ptr& targetBody, const core::Ptr& toolBody, BooleanTypes booleanType); + + /// Transforms the input body using the specified transformation matrix. + /// body : The BRepBody object to transform. + /// transform : The transformation matrix that defines the transform to apply to the body. + /// Returns true if the specified transform was successfully applied to the body. + bool transform(const core::Ptr& body, const core::Ptr& transform); + + /// Creates new BRepBody objects based on the contents of the specified file. + /// filename : The full path and name of the file to read in. This can be a SMT, SMB, SAT, or SAB file. + /// A BRepBodies collection object is returned which can contain multiple BRepBody objects. + /// null is returned in the case where it was unable to read the file. + core::Ptr createFromFile(const std::string& filename); + + /// Exports the input bodies to the specified file. + /// bodies : An array of BRepBody objects that you want to export. + /// filename : The filename to write the BRepBody objects to. The type of file to create + /// is inferred from the extension of the file. The valid extensions are ".sat" and ".smt". + /// Returns true if the export was successful. + bool exportToFile(const std::vector>& bodies, const std::string& filename); + + /// Creates a new temporary solid box BRepBody object. + /// box : The OrientedBoundingBox3D object that defines the position, orientation, and + /// size of the box to crate. + /// Returns the newly created temporary BRepBody object or null in the case of failure. + core::Ptr createBox(const core::Ptr& box); + + /// Creates a temporary solid cylinder or cone BRepBody object. + /// pointOne : A point at one end of the cylinder or cone. + /// pointOneRadius : The radius of the cylinder or cone at the point one end, in centimeters. + /// pointTwo : A point at the opposite end of the cylinder or cone. + /// pointTwoRadius : The radius of the cylinder or cone at the point two end, in centimeters. + /// For a cylinder the pointTwoRadius should be equal to the pointOneRadius. + /// Returns the newly created temporary BRepBody object or null in the case of failure. + core::Ptr createCylinderOrCone(const core::Ptr& pointOne, double pointOneRadius, const core::Ptr& pointTwo, double pointTwoRadius); + + /// Creates a temporary elliptical solid cylinder or cone BrepBody object. + /// pointOne : A point at one end of the cylinder or cone. + /// pointOneMajorRadius : The major radius of the cylinder or cone at the point one end, in centimeters. + /// pointOneMinorRadius : The minor radius of the cylinder or cone at the point one end, in centimeters. + /// pointTwo : A point at the opposite end of the cone. + /// pointTwoMajorRadius : The major radius of the cylinder or cone at the point two end, in centimeters. The + /// minor radius is automatically determined using the point one ratio of the minor and major + /// radii. + /// majorAxisDirection : A Vector3D object that defines the direction of the major axis. + /// Returns the newly created temporary BRepBody object or null in the case of failure. + core::Ptr createEllipticalCylinderOrCone(const core::Ptr& pointOne, double pointOneMajorRadius, double pointOneMinorRadius, const core::Ptr& pointTwo, double pointTwoMajorRadius, const core::Ptr& majorAxisDirection); + + /// Creates a temporary spherical BRepBody object. + /// center : The center point of the sphere. + /// radius : The radius of the sphere in centimeters. + /// Returns the newly created temporary BRepBody object or null in the case of failure. + core::Ptr createSphere(const core::Ptr& center, double radius); + + /// Creates a temporary toroidal BRepBody object. + /// center : The center point of the torus. + /// axis : The axis of the torus. + /// majorRadius : The radius, in centimeters, of the major radius of the torus. If the torus was created + /// by sweeping a circle around another circle this would be the radius of the path circle. + /// minorRadius : The radius, in centimeters, of the minor radius of the torus. If the torus was created + /// by sweeping a circle around another circle this would be the radius of the profile circle. + /// Returns the newly created temporary BRepBody object or null in the case of failure. + core::Ptr createTorus(const core::Ptr& center, const core::Ptr& axis, double majorRadius, double minorRadius); + + /// Creates a body from multiple wires that all lie within the same plane. Multiple wires are + /// used when creating a plane with interior holes. One wire defines the outer shape and the + /// other wires define the interior loops of the created face. + /// wireBodies : An array of bodies that contain planar wires. Each wire must be closed, they should not overlap, + /// and they should all lie on the same plane. + /// Returns a BRepBody containing the created BRepFace object or null in the case of failure. + core::Ptr createFaceFromPlanarWires(const std::vector>& wireBodies); + + ///

Method that finds regions of faces on two bodies which overlap and creates new bodies where the faces + /// are split at the edges of the overlaps. This does not modify the original bodies but creates new + /// temporary bodies that contain the imprints.

+ ///

The picture below shows an example of imprinting. The picture on the left shows the initial two bodies + /// that are positioned so there are coincident faces. The picture on the right shows the two bodies individually + /// so you can see the result of the imprint and how the coincident faces were split.

+ ///


+ ///

The ability to imprint solids can be important to applications that need to mesh models. By creating edges + /// at the points where solids connect, it guarantees that there will be mesh nodes along those boundaries.

+ /// bodyOne : Input BRepBody that will participate in the imprint operation. This body can be either a parametric + /// or temporary body. + /// bodyTwo : Input BRepBody that will participate in the imprint operation. This body can be either a parametric + /// or temporary body. + /// imprintCoincidentEdges :

Input Boolean that indicates if overlapping edges should be included in the result. The picture below + /// shows an example of when this argument will make a difference. The two bodies have overlapping faces + /// and there is also an overlapping edge. If this argument is true, then the edge shown in red below + /// will be included in the output as an overlapping edge. If False it will not be included and only + /// the edges of the overlapping faces will be in the overlapping faces collections.

+ ///

+ /// resultBodyOne : Output temporary BRepBody that contains the imprinted body that corresponds to the body provided through the bodyOne argument. + /// resultBodyTwo : Output temporary BRepBody that contains the imprinted body that corresponds to the body provided through the bodyTwo argument. + /// bodyOneOverlappingFaces : Output array of BRepFace objects that represent the overlapping faces that are part of resultBodyOne. Faces at the same index within the + /// collection returned here and that returned by the bodyTwoOverlappingFaces are overlapping. + /// bodyTwoOverlappingFaces : Output array of BRepFace objects that represent the overlapping faces that are part of resultBodyTwo. Faces at the same index within the + /// collection returned here and that returned by the bodyOneOverlappingFaces are overlapping. + /// bodyOneOverlappingEdges : Output array of BRepEdge objects that represent the overlapping edges that are part of resultBodyOne. Edges at the same index within the + /// collection returned here and that returned by the bodyTwoOverlappingEdges are overlapping. + /// bodyTwoOverlappingEdges : Output array of BRepEdge objects that represent the overlapping edges that are part of resultBodyTwo. Edges at the same index within the + /// collection returned here and that returned by the bodyOneOverlappingEdges are overlapping. + /// tolerance : Optional Input double that specifies the tolerance, in centimeters, to use when comparing the bodies. If not specified, or a value of zero + /// is specified, the internal modeling tolerance will be used. + /// Returns true if the imprint calculation was successful. + bool imprintOverlapBodies(const core::Ptr& bodyOne, const core::Ptr& bodyTwo, bool imprintCoincidentEdges, core::Ptr& resultBodyOne, core::Ptr& resultBodyTwo, std::vector>& bodyOneOverlappingFaces, std::vector>& bodyTwoOverlappingFaces, std::vector>& bodyOneOverlappingEdges, std::vector>& bodyTwoOverlappingEdges, double tolerance = 0); + + /// Give an array of curve geometry objects, this method creates a new wire body. + /// curves : An array containing the input Curve3D objects. These can be Arc3D, Circle3D, Ellipse3D, EllipticalArc3D or Line3D objects. + /// edgeMap : An array of edges in the returned body. The order that the edges are in this collection is the + /// same order as the original corresponding Curve3D object is in the input curves array. This allows you to + /// map between the original input curve and created edge. + /// allowSelfIntersections : Specifies if you want to allow self-intersection in the input curves or not. + /// Returns the B-Rep body containing the created wire or null in the case of failure. + core::Ptr createWireFromCurves(const std::vector>& curves, std::vector>& edgeMap, bool allowSelfIntersections = false); + + /// Creates a B-Rep body that contains a wire with a single edge that represents a helical curve. + /// axisPoint : A Point3D object that defines a point along the axis of the helix. + /// axisVector : A Vector3D object that defines the direction of the axis of the helix. + /// startPoint : A Point3D that defines the start point of the helix. This is a point on the helix and defines the starting + /// point of the helix. The distance of this point to the axis defines the starting radius of the helix. + /// pitch : The pitch of the helix, or the distance between each of the turns, in centimeters. + /// turns : The number of turns of the helix. + /// taperAngle : The taper angle of the helix in radians. + /// + core::Ptr createHelixWire(const core::Ptr& axisPoint, const core::Ptr& axisVector, const core::Ptr& startPoint, double pitch, double turns, double taperAngle); + + ADSK_FUSION_TEMPORARYBREPMANAGER_API static const char* classType(); + ADSK_FUSION_TEMPORARYBREPMANAGER_API const char* objectType() const override; + ADSK_FUSION_TEMPORARYBREPMANAGER_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TEMPORARYBREPMANAGER_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_TEMPORARYBREPMANAGER_API static TemporaryBRepManager* get_raw(); + virtual BRepBody* copy_raw(core::Base* bRepEntity) = 0; + virtual BRepBody* planeIntersection_raw(BRepBody* body, core::Plane* plane) = 0; + virtual BRepBody* createRuledSurface_raw(BRepWire* sectionOne, BRepWire* sectionTwo) = 0; + virtual BRepBody* createSilhouetteCurves_raw(BRepFace* face, core::Vector3D* viewDirection, bool returnCoincidentSilhouettes) = 0; + virtual bool deleteFaces_raw(BRepFace** faces, size_t faces_size, bool deleteSpecifiedFaces) = 0; + virtual bool booleanOperation_raw(BRepBody* targetBody, BRepBody* toolBody, BooleanTypes booleanType) = 0; + virtual bool transform_raw(BRepBody* body, core::Matrix3D* transform) = 0; + virtual BRepBodies* createFromFile_raw(const char * filename) = 0; + virtual bool exportToFile_raw(BRepBody** bodies, size_t bodies_size, const char * filename) = 0; + virtual BRepBody* createBox_raw(core::OrientedBoundingBox3D* box) = 0; + virtual BRepBody* createCylinderOrCone_raw(core::Point3D* pointOne, double pointOneRadius, core::Point3D* pointTwo, double pointTwoRadius) = 0; + virtual BRepBody* createEllipticalCylinderOrCone_raw(core::Point3D* pointOne, double pointOneMajorRadius, double pointOneMinorRadius, core::Point3D* pointTwo, double pointTwoMajorRadius, core::Vector3D* majorAxisDirection) = 0; + virtual BRepBody* createSphere_raw(core::Point3D* center, double radius) = 0; + virtual BRepBody* createTorus_raw(core::Point3D* center, core::Vector3D* axis, double majorRadius, double minorRadius) = 0; + virtual BRepBody* createFaceFromPlanarWires_raw(BRepBody** wireBodies, size_t wireBodies_size) = 0; + virtual bool imprintOverlapBodies_raw(BRepBody* bodyOne, BRepBody* bodyTwo, bool imprintCoincidentEdges, BRepBody*& resultBodyOne, BRepBody*& resultBodyTwo, BRepFace**& bodyOneOverlappingFaces, size_t& bodyOneOverlappingFaces_size, BRepFace**& bodyTwoOverlappingFaces, size_t& bodyTwoOverlappingFaces_size, BRepEdge**& bodyOneOverlappingEdges, size_t& bodyOneOverlappingEdges_size, BRepEdge**& bodyTwoOverlappingEdges, size_t& bodyTwoOverlappingEdges_size, double tolerance) = 0; + virtual BRepBody* createWireFromCurves_raw(core::Curve3D** curves, size_t curves_size, BRepEdge**& edgeMap, size_t& edgeMap_size, bool allowSelfIntersections) = 0; + virtual BRepBody* createHelixWire_raw(core::Point3D* axisPoint, core::Vector3D* axisVector, core::Point3D* startPoint, double pitch, double turns, double taperAngle) = 0; +}; + +// Inline wrappers + +inline core::Ptr TemporaryBRepManager::get() +{ + core::Ptr res = get_raw(); + return res; +} + +inline core::Ptr TemporaryBRepManager::copy(const core::Ptr& bRepEntity) +{ + core::Ptr res = copy_raw(bRepEntity.get()); + return res; +} + +inline core::Ptr TemporaryBRepManager::planeIntersection(const core::Ptr& body, const core::Ptr& plane) +{ + core::Ptr res = planeIntersection_raw(body.get(), plane.get()); + return res; +} + +inline core::Ptr TemporaryBRepManager::createRuledSurface(const core::Ptr& sectionOne, const core::Ptr& sectionTwo) +{ + core::Ptr res = createRuledSurface_raw(sectionOne.get(), sectionTwo.get()); + return res; +} + +inline core::Ptr TemporaryBRepManager::createSilhouetteCurves(const core::Ptr& face, const core::Ptr& viewDirection, bool returnCoincidentSilhouettes) +{ + core::Ptr res = createSilhouetteCurves_raw(face.get(), viewDirection.get(), returnCoincidentSilhouettes); + return res; +} + +inline bool TemporaryBRepManager::deleteFaces(const std::vector>& faces, bool deleteSpecifiedFaces) +{ + BRepFace** faces_ = new BRepFace*[faces.size()]; + for(size_t i=0; i& targetBody, const core::Ptr& toolBody, BooleanTypes booleanType) +{ + bool res = booleanOperation_raw(targetBody.get(), toolBody.get(), booleanType); + return res; +} + +inline bool TemporaryBRepManager::transform(const core::Ptr& body, const core::Ptr& transform) +{ + bool res = transform_raw(body.get(), transform.get()); + return res; +} + +inline core::Ptr TemporaryBRepManager::createFromFile(const std::string& filename) +{ + core::Ptr res = createFromFile_raw(filename.c_str()); + return res; +} + +inline bool TemporaryBRepManager::exportToFile(const std::vector>& bodies, const std::string& filename) +{ + BRepBody** bodies_ = new BRepBody*[bodies.size()]; + for(size_t i=0; i TemporaryBRepManager::createBox(const core::Ptr& box) +{ + core::Ptr res = createBox_raw(box.get()); + return res; +} + +inline core::Ptr TemporaryBRepManager::createCylinderOrCone(const core::Ptr& pointOne, double pointOneRadius, const core::Ptr& pointTwo, double pointTwoRadius) +{ + core::Ptr res = createCylinderOrCone_raw(pointOne.get(), pointOneRadius, pointTwo.get(), pointTwoRadius); + return res; +} + +inline core::Ptr TemporaryBRepManager::createEllipticalCylinderOrCone(const core::Ptr& pointOne, double pointOneMajorRadius, double pointOneMinorRadius, const core::Ptr& pointTwo, double pointTwoMajorRadius, const core::Ptr& majorAxisDirection) +{ + core::Ptr res = createEllipticalCylinderOrCone_raw(pointOne.get(), pointOneMajorRadius, pointOneMinorRadius, pointTwo.get(), pointTwoMajorRadius, majorAxisDirection.get()); + return res; +} + +inline core::Ptr TemporaryBRepManager::createSphere(const core::Ptr& center, double radius) +{ + core::Ptr res = createSphere_raw(center.get(), radius); + return res; +} + +inline core::Ptr TemporaryBRepManager::createTorus(const core::Ptr& center, const core::Ptr& axis, double majorRadius, double minorRadius) +{ + core::Ptr res = createTorus_raw(center.get(), axis.get(), majorRadius, minorRadius); + return res; +} + +inline core::Ptr TemporaryBRepManager::createFaceFromPlanarWires(const std::vector>& wireBodies) +{ + BRepBody** wireBodies_ = new BRepBody*[wireBodies.size()]; + for(size_t i=0; i res = createFaceFromPlanarWires_raw(wireBodies_, wireBodies.size()); + delete[] wireBodies_; + return res; +} + +inline bool TemporaryBRepManager::imprintOverlapBodies(const core::Ptr& bodyOne, const core::Ptr& bodyTwo, bool imprintCoincidentEdges, core::Ptr& resultBodyOne, core::Ptr& resultBodyTwo, std::vector>& bodyOneOverlappingFaces, std::vector>& bodyTwoOverlappingFaces, std::vector>& bodyOneOverlappingEdges, std::vector>& bodyTwoOverlappingEdges, double tolerance) +{ + BRepBody* resultBodyOne_ = nullptr; + BRepBody* resultBodyTwo_ = nullptr; + BRepFace** bodyOneOverlappingFaces_ = nullptr; + size_t bodyOneOverlappingFaces_size; + BRepFace** bodyTwoOverlappingFaces_ = nullptr; + size_t bodyTwoOverlappingFaces_size; + BRepEdge** bodyOneOverlappingEdges_ = nullptr; + size_t bodyOneOverlappingEdges_size; + BRepEdge** bodyTwoOverlappingEdges_ = nullptr; + size_t bodyTwoOverlappingEdges_size; + + bool res = imprintOverlapBodies_raw(bodyOne.get(), bodyTwo.get(), imprintCoincidentEdges, resultBodyOne_, resultBodyTwo_, bodyOneOverlappingFaces_, bodyOneOverlappingFaces_size, bodyTwoOverlappingFaces_, bodyTwoOverlappingFaces_size, bodyOneOverlappingEdges_, bodyOneOverlappingEdges_size, bodyTwoOverlappingEdges_, bodyTwoOverlappingEdges_size, tolerance); + resultBodyOne = resultBodyOne_; + resultBodyTwo = resultBodyTwo_; + if(bodyOneOverlappingFaces_) + { + bodyOneOverlappingFaces.assign(bodyOneOverlappingFaces_, bodyOneOverlappingFaces_ + bodyOneOverlappingFaces_size); + core::DeallocateArray(bodyOneOverlappingFaces_); + } + if(bodyTwoOverlappingFaces_) + { + bodyTwoOverlappingFaces.assign(bodyTwoOverlappingFaces_, bodyTwoOverlappingFaces_ + bodyTwoOverlappingFaces_size); + core::DeallocateArray(bodyTwoOverlappingFaces_); + } + if(bodyOneOverlappingEdges_) + { + bodyOneOverlappingEdges.assign(bodyOneOverlappingEdges_, bodyOneOverlappingEdges_ + bodyOneOverlappingEdges_size); + core::DeallocateArray(bodyOneOverlappingEdges_); + } + if(bodyTwoOverlappingEdges_) + { + bodyTwoOverlappingEdges.assign(bodyTwoOverlappingEdges_, bodyTwoOverlappingEdges_ + bodyTwoOverlappingEdges_size); + core::DeallocateArray(bodyTwoOverlappingEdges_); + } + return res; +} + +inline core::Ptr TemporaryBRepManager::createWireFromCurves(const std::vector>& curves, std::vector>& edgeMap, bool allowSelfIntersections) +{ + core::Curve3D** curves_ = new core::Curve3D*[curves.size()]; + for(size_t i=0; i res = createWireFromCurves_raw(curves_, curves.size(), edgeMap_, edgeMap_size, allowSelfIntersections); + delete[] curves_; + if(edgeMap_) + { + edgeMap.assign(edgeMap_, edgeMap_ + edgeMap_size); + core::DeallocateArray(edgeMap_); + } + return res; +} + +inline core::Ptr TemporaryBRepManager::createHelixWire(const core::Ptr& axisPoint, const core::Ptr& axisVector, const core::Ptr& startPoint, double pitch, double turns, double taperAngle) +{ + core::Ptr res = createHelixWire_raw(axisPoint.get(), axisVector.get(), startPoint.get(), pitch, turns, taperAngle); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TEMPORARYBREPMANAGER_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/AsBuiltJoint.h b/usr/autodesk/CPP/include/Fusion/Components/AsBuiltJoint.h new file mode 100644 index 0000000..b076b71 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/AsBuiltJoint.h @@ -0,0 +1,432 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_ASBUILTJOINT_CPP__ +# define ADSK_FUSION_ASBUILTJOINT_API XI_EXPORT +# else +# define ADSK_FUSION_ASBUILTJOINT_API +# endif +#else +# define ADSK_FUSION_ASBUILTJOINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Component; + class JointGeometry; + class JointMotion; + class Occurrence; + class TimelineObject; +}} +namespace adsk { namespace core { + class Attributes; +}} + +namespace adsk { namespace fusion { + +/// Represent an as-built joint. +class AsBuiltJoint : public core::Base { +public: + + /// Returns the parent component that owns this AsBuiltJoint. + core::Ptr parentComponent() const; + + /// The name of the as-built joint as it is displayed in the timeline and the browser. The + /// name can be changed. + std::string name() const; + bool name(const std::string& value); + + /// Specifies the first of two occurrences the joint is between. + core::Ptr occurrenceOne() const; + + /// Specifies the second of two occurrences the joint is between. + core::Ptr occurrenceTwo() const; + + /// Specifies the position of the joint. Getting this property will return null and + /// setting it will be ignored in the case where the joint motion is rigid. + /// To set this property, you need to position the timeline marker to immediately before this as-built joint. + /// This can be accomplished using the following code: thisAsBuiltJoint.timelineObject.rollTo(True) + core::Ptr geometry() const; + bool geometry(const core::Ptr& value); + + /// Deletes this as-built joint. + /// Returns true if the delete was successful. + bool deleteMe(); + + /// Returns the timeline object associated with this as-built joint. + core::Ptr timelineObject() const; + + /// Returns a JointMotion object that defines the motion relationship between the two geometries. + core::Ptr jointMotion() const; + + /// Redefines the relationship between the two joint geometries as a rigid joint. + /// To use this method, you need to position the timeline marker to immediately before this as-built joint. + /// This can be accomplished using the following code: thisAsBuiltJoint.timelineObject.rollTo(True) + /// Returns true if successful. + bool setAsRigidJointMotion(); + + /// Redefines the relationship between the two joint geometries as a revolute joint. + /// To use this method, you need to position the timeline marker to immediately before this as-built joint. + /// This can be accomplished using the following code: thisAsBuiltJoint.timelineObject.rollTo(True) + /// rotationAxis : Specifies which axis the rotation is around. If this is set to CustomJointDirection then the + /// customRotationAxisEntity argument must also be provided. + /// geometry : Redefines the joint geometry. If not provided, the existing geometry is used. This argument is + /// required if the current joint motion is rigid. + /// customRotationAxisEntity : If the rotationAxis is customAxisEntity this argument is used to specify the entity that defines + /// the custom axis of rotation. This can be several types of entities that an axis can be derived + /// from. + /// Returns true if the operation was successful. + bool setAsRevoluteJointMotion(JointDirections rotationAxis, const core::Ptr& geometry = NULL, const core::Ptr& customRotationAxisEntity = NULL); + + /// Redefines the relationship between the two joint geometries as a slider joint. + /// To use this method, you need to position the timeline marker to immediately before this as-built joint. + /// This can be accomplished using the following code: thisAsBuiltJoint.timelineObject.rollTo(True) + /// sliderDirection : Specifies which axis the slide direction is along. If this is set to CustomJointDirection then the + /// customSliderDirectionEntity argument must also be provided. + /// geometry : Redefines the joint geometry. If not provided, the existing geometry is used. This argument is + /// required if the current joint motion is rigid. + /// customSliderDirectionEntity : If the sliderDirection is CustomJointDirection this argument is used to specify the entity that defines + /// the custom slider direction. This can be several types of entities that can define a direction. + /// Returns true if the operation was successful. + bool setAsSliderJointMotion(JointDirections sliderDirection, const core::Ptr& geometry = NULL, const core::Ptr& customSliderDirectionEntity = NULL); + + /// Redefines the relationship between the two joint geometries as a cylindrical joint. + /// To use this method, you need to position the timeline marker to immediately before this as-built joint. + /// This can be accomplished using the following code: thisAsBuiltJoint.timelineObject.rollTo(True) + /// rotationAxis : Specifies which axis the rotation is around. If this is set to CustomJointDirection then the + /// customRotationAxisEntity argument must also be provided. + /// geometry : Redefines the joint geometry. If not provided, the existing geometry is used. This argument is + /// required if the current joint motion is rigid. + /// customRotationAxisEntity : If the rotationAxis is customAxisEntity this argument is used to specify the entity that defines + /// the custom axis of rotation. This can be several types of entities that an axis can be derived + /// from. + /// Returns true if the operation was successful. + bool setAsCylindricalJointMotion(JointDirections rotationAxis, const core::Ptr& geometry = NULL, const core::Ptr& customRotationAxisEntity = NULL); + + /// Redefines the relationship between the two joint geometries as a pin-slot joint. + /// To use this method, you need to position the timeline marker to immediately before this as-built joint. + /// This can be accomplished using the following code: thisAsBuiltJoint.timelineObject.rollTo(True) + /// rotationAxis : Specifies which axis the rotation is around. If this is set to CustomJointDirection then the + /// customRotationAxisEntity argument must also be provided. + /// slideDirection : Specifies which axis the slide direction is along. If this is set to CustomJointDirection then the + /// customSlideDirectionEntity argument must also be provided. + /// geometry : Redefines the joint geometry. If not provided, the existing geometry is used. This argument is + /// required if the current joint motion is rigid. + /// customRotationAxisEntity : If the rotationAxis is customAxisEntity this argument is used to specify the entity that defines + /// the custom axis of rotation. This can be several types of entities that an axis can be derived + /// customSlideDirectionEntity : If the slideDirection is CustomJointDirection this argument is used to specify the entity that defines + /// the custom slide direction. This can be several types of entities that can define a direction. + /// Returns true if the operation was successful. + bool setAsPinSlotJointMotion(JointDirections rotationAxis, JointDirections slideDirection, const core::Ptr& geometry = NULL, const core::Ptr& customRotationAxisEntity = NULL, const core::Ptr& customSlideDirectionEntity = NULL); + + /// Redefines the relationship between the two joint geometries as a planar joint. + /// To use this method, you need to position the timeline marker to immediately before this as-built joint. + /// This can be accomplished using the following code: thisAsBuiltJoint.timelineObject.rollTo(True) + /// normalDirection : Defines the direction of the normal of the single degree of rotation. + /// This can be set to XAxisJointDirection, YAxisJointDirection, ZAxisJointDirection, + /// or CustomJointDirection. If set to CustomJointDirection then the customNormalDirectionEntity + /// argument must also be provided. + /// geometry : Redefines the joint geometry. If not provided, the existing geometry is used. This argument is + /// required if the current joint motion is rigid. + /// customNormalDirectionEntity : If the normalDirection is CustomJointDirection this argument is used to specify the entity that defines + /// the direction of the normal. This can be several types of entities that can define a direction. + /// customPrimarySlideDirection : This arguments defines the direction of the primary slide direction. A default primary slide direction + /// is automatically chosen and will be used if this argument is not provided or is null. The secondary slide + /// direction is automatically inferred from the normal and primary slide directions. + /// Returns true if the operation was successful. + bool setAsPlanarJointMotion(JointDirections normalDirection, const core::Ptr& geometry = NULL, const core::Ptr& customNormalDirectionEntity = NULL, const core::Ptr& customPrimarySlideDirection = NULL); + + /// Redefines the relationship between the two joint geometries as a ball joint. + /// To use this method, you need to position the timeline marker to immediately before this as-built joint. + /// This can be accomplished using the following code: thisAsBuiltJoint.timelineObject.rollTo(True) + /// pitchDirection : Defines the direction the pitch angle is measured from. This can be ZAxisJointDirection or CustomJointDirection. If + /// CustomJointDirection is specified then you must also provide a value for the customPitchDirection argument. + /// yawDirection : Defines the direction the yaw is measured from. This can be XAxisJointDirection or CustomJointDirection. If + /// CustomJointDirection is specified then you must also provide a value for the customYawDirection argument. + /// geometry : Redefines the joint geometry. If not provided, the existing geometry is used. This argument is + /// required if the current joint motion is rigid. + /// customPitchDirection : If the pitchDirection argument is customPitchDirection this argument is used to define the direction the pitch + /// angel is measured from. This can be several types of entities that can define a direction. + /// customYawDirection : If the yawDirection argument is customPitchDirection this argument is used to define the direction the yaw + /// angel is measured from. This can be several types of entities that can define a direction. + /// Returns true if the operation was successful. + bool setAsBallJointMotion(JointDirections pitchDirection, JointDirections yawDirection, const core::Ptr& geometry = NULL, const core::Ptr& customPitchDirection = NULL, const core::Ptr& customYawDirection = NULL); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this object + /// in an assembly. This is only valid in the case where this is acting + /// as a proxy in an assembly. Returns null in the case where the object + /// is not in the context of an assembly but is already the native object. + core::Ptr assemblyContext() const; + + /// Gets and sets if this as-built joint is suppressed. + bool isSuppressed() const; + bool isSuppressed(bool value); + + /// Gets and sets if the light bulb of this as-built joint as displayed in the browser is on or off. + /// A joint will only be visible if the light bulb is switched on. However, + /// the light bulb can be on and the joint still invisible if a higher level occurrence + /// in the assembly context is not visible because its light bulb is off or the joints folder + /// is light bulb is off. + bool isLightBulbOn() const; + bool isLightBulbOn(bool value); + + /// Gets whether the as-built joint is visible. To change the visibility see the isLightBulbOn property. + /// This property is affected by the assembly context. + bool isVisible() const; + + /// Returns the collection of attributes associated with this as-built joint. + core::Ptr attributes() const; + + /// Returns a token for the AsBuiltJoint object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same as-built joint. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + ADSK_FUSION_ASBUILTJOINT_API static const char* classType(); + ADSK_FUSION_ASBUILTJOINT_API const char* objectType() const override; + ADSK_FUSION_ASBUILTJOINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_ASBUILTJOINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Component* parentComponent_raw() const = 0; + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual Occurrence* occurrenceOne_raw() const = 0; + virtual Occurrence* occurrenceTwo_raw() const = 0; + virtual JointGeometry* geometry_raw() const = 0; + virtual bool geometry_raw(JointGeometry* value) = 0; + virtual bool deleteMe_raw() = 0; + virtual TimelineObject* timelineObject_raw() const = 0; + virtual JointMotion* jointMotion_raw() const = 0; + virtual bool setAsRigidJointMotion_raw() = 0; + virtual bool setAsRevoluteJointMotion_raw(JointDirections rotationAxis, JointGeometry* geometry, core::Base* customRotationAxisEntity) = 0; + virtual bool setAsSliderJointMotion_raw(JointDirections sliderDirection, JointGeometry* geometry, core::Base* customSliderDirectionEntity) = 0; + virtual bool setAsCylindricalJointMotion_raw(JointDirections rotationAxis, JointGeometry* geometry, core::Base* customRotationAxisEntity) = 0; + virtual bool setAsPinSlotJointMotion_raw(JointDirections rotationAxis, JointDirections slideDirection, JointGeometry* geometry, core::Base* customRotationAxisEntity, core::Base* customSlideDirectionEntity) = 0; + virtual bool setAsPlanarJointMotion_raw(JointDirections normalDirection, JointGeometry* geometry, core::Base* customNormalDirectionEntity, core::Base* customPrimarySlideDirection) = 0; + virtual bool setAsBallJointMotion_raw(JointDirections pitchDirection, JointDirections yawDirection, JointGeometry* geometry, core::Base* customPitchDirection, core::Base* customYawDirection) = 0; + virtual AsBuiltJoint* nativeObject_raw() const = 0; + virtual AsBuiltJoint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual bool isSuppressed_raw() const = 0; + virtual bool isSuppressed_raw(bool value) = 0; + virtual bool isLightBulbOn_raw() const = 0; + virtual bool isLightBulbOn_raw(bool value) = 0; + virtual bool isVisible_raw() const = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr AsBuiltJoint::parentComponent() const +{ + core::Ptr res = parentComponent_raw(); + return res; +} + +inline std::string AsBuiltJoint::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool AsBuiltJoint::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline core::Ptr AsBuiltJoint::occurrenceOne() const +{ + core::Ptr res = occurrenceOne_raw(); + return res; +} + +inline core::Ptr AsBuiltJoint::occurrenceTwo() const +{ + core::Ptr res = occurrenceTwo_raw(); + return res; +} + +inline core::Ptr AsBuiltJoint::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline bool AsBuiltJoint::geometry(const core::Ptr& value) +{ + return geometry_raw(value.get()); +} + +inline bool AsBuiltJoint::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline core::Ptr AsBuiltJoint::timelineObject() const +{ + core::Ptr res = timelineObject_raw(); + return res; +} + +inline core::Ptr AsBuiltJoint::jointMotion() const +{ + core::Ptr res = jointMotion_raw(); + return res; +} + +inline bool AsBuiltJoint::setAsRigidJointMotion() +{ + bool res = setAsRigidJointMotion_raw(); + return res; +} + +inline bool AsBuiltJoint::setAsRevoluteJointMotion(JointDirections rotationAxis, const core::Ptr& geometry, const core::Ptr& customRotationAxisEntity) +{ + bool res = setAsRevoluteJointMotion_raw(rotationAxis, geometry.get(), customRotationAxisEntity.get()); + return res; +} + +inline bool AsBuiltJoint::setAsSliderJointMotion(JointDirections sliderDirection, const core::Ptr& geometry, const core::Ptr& customSliderDirectionEntity) +{ + bool res = setAsSliderJointMotion_raw(sliderDirection, geometry.get(), customSliderDirectionEntity.get()); + return res; +} + +inline bool AsBuiltJoint::setAsCylindricalJointMotion(JointDirections rotationAxis, const core::Ptr& geometry, const core::Ptr& customRotationAxisEntity) +{ + bool res = setAsCylindricalJointMotion_raw(rotationAxis, geometry.get(), customRotationAxisEntity.get()); + return res; +} + +inline bool AsBuiltJoint::setAsPinSlotJointMotion(JointDirections rotationAxis, JointDirections slideDirection, const core::Ptr& geometry, const core::Ptr& customRotationAxisEntity, const core::Ptr& customSlideDirectionEntity) +{ + bool res = setAsPinSlotJointMotion_raw(rotationAxis, slideDirection, geometry.get(), customRotationAxisEntity.get(), customSlideDirectionEntity.get()); + return res; +} + +inline bool AsBuiltJoint::setAsPlanarJointMotion(JointDirections normalDirection, const core::Ptr& geometry, const core::Ptr& customNormalDirectionEntity, const core::Ptr& customPrimarySlideDirection) +{ + bool res = setAsPlanarJointMotion_raw(normalDirection, geometry.get(), customNormalDirectionEntity.get(), customPrimarySlideDirection.get()); + return res; +} + +inline bool AsBuiltJoint::setAsBallJointMotion(JointDirections pitchDirection, JointDirections yawDirection, const core::Ptr& geometry, const core::Ptr& customPitchDirection, const core::Ptr& customYawDirection) +{ + bool res = setAsBallJointMotion_raw(pitchDirection, yawDirection, geometry.get(), customPitchDirection.get(), customYawDirection.get()); + return res; +} + +inline core::Ptr AsBuiltJoint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr AsBuiltJoint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr AsBuiltJoint::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline bool AsBuiltJoint::isSuppressed() const +{ + bool res = isSuppressed_raw(); + return res; +} + +inline bool AsBuiltJoint::isSuppressed(bool value) +{ + return isSuppressed_raw(value); +} + +inline bool AsBuiltJoint::isLightBulbOn() const +{ + bool res = isLightBulbOn_raw(); + return res; +} + +inline bool AsBuiltJoint::isLightBulbOn(bool value) +{ + return isLightBulbOn_raw(value); +} + +inline bool AsBuiltJoint::isVisible() const +{ + bool res = isVisible_raw(); + return res; +} + +inline core::Ptr AsBuiltJoint::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline std::string AsBuiltJoint::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_ASBUILTJOINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/AsBuiltJointInput.h b/usr/autodesk/CPP/include/Fusion/Components/AsBuiltJointInput.h new file mode 100644 index 0000000..cd60991 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/AsBuiltJointInput.h @@ -0,0 +1,233 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_ASBUILTJOINTINPUT_CPP__ +# define ADSK_FUSION_ASBUILTJOINTINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_ASBUILTJOINTINPUT_API +# endif +#else +# define ADSK_FUSION_ASBUILTJOINTINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class JointGeometry; + class JointMotion; + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// Defines all of the information needed to create an as-built joint. +class AsBuiltJointInput : public core::Base { +public: + + /// Specifies the first of two occurrences the joint is between. + core::Ptr occurrenceOne() const; + bool occurrenceOne(const core::Ptr& value); + + /// Specifies the second of two occurrences the joint is between. + core::Ptr occurrenceTwo() const; + bool occurrenceTwo(const core::Ptr& value); + + /// Specifies the position of the joint. + core::Ptr geometry() const; + bool geometry(const core::Ptr& value); + + /// Defines the relationship between the two joint geometries as a rigid joint. + /// Returns true if successful. + bool setAsRigidJointMotion(); + + /// Defines the relationship between the two joint geometries as a revolute joint. + /// rotationAxis : Specifies which axis the rotation is around. If this is set to CustomJointDirection then the + /// customRotationAxisEntity argument must also be provided. + /// customRotationAxisEntity : If the rotationAxis is customAxisEntity this argument is used to specify the entity that defines + /// the custom axis of rotation. This can be several types of entities that an axis can be derived + /// from. + /// Returns true if the operation was successful. + bool setAsRevoluteJointMotion(JointDirections rotationAxis, const core::Ptr& customRotationAxisEntity = NULL); + + /// Defines the relationship between the two joint geometries as a slider joint. + /// sliderDirection : Specifies which axis the slide direction is along. If this is set to CustomJointDirection then the + /// customSliderDirectionEntity argument must also be provided. + /// customSliderDirectionEntity : If the sliderDirection is CustomJointDirection this argument is used to specify the entity that defines + /// the custom slider direction. This can be several types of entities that can define a direction. + /// Returns true if the operation was successful. + bool setAsSliderJointMotion(JointDirections sliderDirection, const core::Ptr& customSliderDirectionEntity = NULL); + + /// Defines the relationship between the two joint geometries as a cylindrical joint. + /// rotationAxis : Specifies which axis the rotation is around. If this is set to CustomJointDirection then the + /// customRotationAxisEntity argument must also be provided. + /// customRotationAxisEntity : If the rotationAxis is customAxisEntity this argument is used to specify the entity that defines + /// the custom axis of rotation. This can be several types of entities that an axis can be derived + /// from. + /// Returns true if the operation was successful. + bool setAsCylindricalJointMotion(JointDirections rotationAxis, const core::Ptr& customRotationAxisEntity = NULL); + + /// Defines the relationship between the two joint geometries as a pin-slot joint. + /// rotationAxis : Specifies which axis the rotation is around. If this is set to CustomJointDirection then the + /// customRotationAxisEntity argument must also be provided. + /// slideDirection : Specifies which axis the slide direction is along. If this is set to CustomJointDirection then the + /// customSlideDirectionEntity argument must also be provided. + /// customRotationAxisEntity : If the rotationAxis is customAxisEntity this argument is used to specify the entity that defines + /// the custom axis of rotation. This can be several types of entities that an axis can be derived + /// customSlideDirectionEntity : If the slideDirection is CustomJointDirection this argument is used to specify the entity that defines + /// the custom slide direction. This can be several types of entities that can define a direction. + /// Returns true if the operation was successful. + bool setAsPinSlotJointMotion(JointDirections rotationAxis, JointDirections slideDirection, const core::Ptr& customRotationAxisEntity = NULL, const core::Ptr& customSlideDirectionEntity = NULL); + + /// Defines the relationship between the two joint geometries as a planar joint. + /// normalDirection : Defines the direction of the normal of the single degree of rotation. + /// This can be set to XAxisJointDirection, YAxisJointDirection, ZAxisJointDirection, + /// or CustomJointDirection. If set to CustomJointDirection then the customNormalDirectionEntity + /// argument must also be provided. + /// customNormalDirectionEntity : If the normalDirection is CustomJointDirection this argument is used to specify the entity that defines + /// the direction of the normal. This can be several types of entities that can define a direction. + /// customPrimarySlideDirection : This arguments defines the direction of the primary slide direction. A default primary slide direction + /// is automatically chosen and will be used if this argument is not provided or is null. The secondary slide + /// direction is automatically inferred from the normal and primary slide directions. + /// Returns true if the operation was successful. + bool setAsPlanarJointMotion(JointDirections normalDirection, const core::Ptr& customNormalDirectionEntity = NULL, const core::Ptr& customPrimarySlideDirection = NULL); + + /// Defines the relationship between the two joint geometries as a ball joint. + /// pitchDirection : Defines the direction the pitch angle is measured from. This can be ZAxisJointDirection or CustomJointDirection. If + /// CustomJointDirection is specified then you must also provide a value for the customPitchDirection argument. + /// yawDirection : Defines the direction the yaw is measured from. This can be XAxisJointDirection or CustomJointDirection. If + /// CustomJointDirection is specified then you must also provide a value for the customYawDirection argument. + /// customPitchDirection : If the pitchDirection argument is customPitchDirection this argument is used to define the direction the pitch + /// angel is measured from. This can be several types of entities that can define a direction. + /// customYawDirection : If the yawDirection argument is customPitchDirection this argument is used to define the direction the yaw + /// angel is measured from. This can be several types of entities that can define a direction. + /// Returns true if the operation was successful. + bool setAsBallJointMotion(JointDirections pitchDirection, JointDirections yawDirection, const core::Ptr& customPitchDirection = NULL, const core::Ptr& customYawDirection = NULL); + + /// Returns one of the objects derived from JointMotion that defines how the motion between + /// the two joint geometries is defined. Can be null if the motion hasn't yet been defined. + core::Ptr jointMotion() const; + + ADSK_FUSION_ASBUILTJOINTINPUT_API static const char* classType(); + ADSK_FUSION_ASBUILTJOINTINPUT_API const char* objectType() const override; + ADSK_FUSION_ASBUILTJOINTINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_ASBUILTJOINTINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Occurrence* occurrenceOne_raw() const = 0; + virtual bool occurrenceOne_raw(Occurrence* value) = 0; + virtual Occurrence* occurrenceTwo_raw() const = 0; + virtual bool occurrenceTwo_raw(Occurrence* value) = 0; + virtual JointGeometry* geometry_raw() const = 0; + virtual bool geometry_raw(JointGeometry* value) = 0; + virtual bool setAsRigidJointMotion_raw() = 0; + virtual bool setAsRevoluteJointMotion_raw(JointDirections rotationAxis, core::Base* customRotationAxisEntity) = 0; + virtual bool setAsSliderJointMotion_raw(JointDirections sliderDirection, core::Base* customSliderDirectionEntity) = 0; + virtual bool setAsCylindricalJointMotion_raw(JointDirections rotationAxis, core::Base* customRotationAxisEntity) = 0; + virtual bool setAsPinSlotJointMotion_raw(JointDirections rotationAxis, JointDirections slideDirection, core::Base* customRotationAxisEntity, core::Base* customSlideDirectionEntity) = 0; + virtual bool setAsPlanarJointMotion_raw(JointDirections normalDirection, core::Base* customNormalDirectionEntity, core::Base* customPrimarySlideDirection) = 0; + virtual bool setAsBallJointMotion_raw(JointDirections pitchDirection, JointDirections yawDirection, core::Base* customPitchDirection, core::Base* customYawDirection) = 0; + virtual JointMotion* jointMotion_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr AsBuiltJointInput::occurrenceOne() const +{ + core::Ptr res = occurrenceOne_raw(); + return res; +} + +inline bool AsBuiltJointInput::occurrenceOne(const core::Ptr& value) +{ + return occurrenceOne_raw(value.get()); +} + +inline core::Ptr AsBuiltJointInput::occurrenceTwo() const +{ + core::Ptr res = occurrenceTwo_raw(); + return res; +} + +inline bool AsBuiltJointInput::occurrenceTwo(const core::Ptr& value) +{ + return occurrenceTwo_raw(value.get()); +} + +inline core::Ptr AsBuiltJointInput::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline bool AsBuiltJointInput::geometry(const core::Ptr& value) +{ + return geometry_raw(value.get()); +} + +inline bool AsBuiltJointInput::setAsRigidJointMotion() +{ + bool res = setAsRigidJointMotion_raw(); + return res; +} + +inline bool AsBuiltJointInput::setAsRevoluteJointMotion(JointDirections rotationAxis, const core::Ptr& customRotationAxisEntity) +{ + bool res = setAsRevoluteJointMotion_raw(rotationAxis, customRotationAxisEntity.get()); + return res; +} + +inline bool AsBuiltJointInput::setAsSliderJointMotion(JointDirections sliderDirection, const core::Ptr& customSliderDirectionEntity) +{ + bool res = setAsSliderJointMotion_raw(sliderDirection, customSliderDirectionEntity.get()); + return res; +} + +inline bool AsBuiltJointInput::setAsCylindricalJointMotion(JointDirections rotationAxis, const core::Ptr& customRotationAxisEntity) +{ + bool res = setAsCylindricalJointMotion_raw(rotationAxis, customRotationAxisEntity.get()); + return res; +} + +inline bool AsBuiltJointInput::setAsPinSlotJointMotion(JointDirections rotationAxis, JointDirections slideDirection, const core::Ptr& customRotationAxisEntity, const core::Ptr& customSlideDirectionEntity) +{ + bool res = setAsPinSlotJointMotion_raw(rotationAxis, slideDirection, customRotationAxisEntity.get(), customSlideDirectionEntity.get()); + return res; +} + +inline bool AsBuiltJointInput::setAsPlanarJointMotion(JointDirections normalDirection, const core::Ptr& customNormalDirectionEntity, const core::Ptr& customPrimarySlideDirection) +{ + bool res = setAsPlanarJointMotion_raw(normalDirection, customNormalDirectionEntity.get(), customPrimarySlideDirection.get()); + return res; +} + +inline bool AsBuiltJointInput::setAsBallJointMotion(JointDirections pitchDirection, JointDirections yawDirection, const core::Ptr& customPitchDirection, const core::Ptr& customYawDirection) +{ + bool res = setAsBallJointMotion_raw(pitchDirection, yawDirection, customPitchDirection.get(), customYawDirection.get()); + return res; +} + +inline core::Ptr AsBuiltJointInput::jointMotion() const +{ + core::Ptr res = jointMotion_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_ASBUILTJOINTINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/AsBuiltJointList.h b/usr/autodesk/CPP/include/Fusion/Components/AsBuiltJointList.h new file mode 100644 index 0000000..f1d9179 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/AsBuiltJointList.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_ASBUILTJOINTLIST_CPP__ +# define ADSK_FUSION_ASBUILTJOINTLIST_API XI_EXPORT +# else +# define ADSK_FUSION_ASBUILTJOINTLIST_API +# endif +#else +# define ADSK_FUSION_ASBUILTJOINTLIST_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class AsBuiltJoint; +}} + +namespace adsk { namespace fusion { + +/// A list of as-built joints. +class AsBuiltJointList : public core::Base { +public: + + /// Function that returns the specified as-built joint using an index into the list. + /// index : The index of the item within the list to return. The first item in the list has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified as-built joint using a name. + /// name : The name of the item within the list to return. + /// Returns the specified item or null if an invalid name was specified. + core::Ptr itemByName(const std::string& name) const; + + /// Returns number of as-built joints in the list. + size_t count() const; + + typedef AsBuiltJoint iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_ASBUILTJOINTLIST_API static const char* classType(); + ADSK_FUSION_ASBUILTJOINTLIST_API const char* objectType() const override; + ADSK_FUSION_ASBUILTJOINTLIST_API void* queryInterface(const char* id) const override; + ADSK_FUSION_ASBUILTJOINTLIST_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual AsBuiltJoint* item_raw(size_t index) const = 0; + virtual AsBuiltJoint* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr AsBuiltJointList::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr AsBuiltJointList::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t AsBuiltJointList::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void AsBuiltJointList::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_ASBUILTJOINTLIST_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/AsBuiltJoints.h b/usr/autodesk/CPP/include/Fusion/Components/AsBuiltJoints.h new file mode 100644 index 0000000..6c4e375 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/AsBuiltJoints.h @@ -0,0 +1,136 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_ASBUILTJOINTS_CPP__ +# define ADSK_FUSION_ASBUILTJOINTS_API XI_EXPORT +# else +# define ADSK_FUSION_ASBUILTJOINTS_API +# endif +#else +# define ADSK_FUSION_ASBUILTJOINTS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class AsBuiltJoint; + class AsBuiltJointInput; + class JointGeometry; + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// The collection of as-built joints in this component. This provides access to all existing +/// as-built joints and supports the ability to create new as-built joints. +class AsBuiltJoints : public core::Base { +public: + + /// Function that returns the specified as-built joint using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified as-built joint using a name. + /// name : The name of the item within the collection to return. + /// Returns the specified item or null if an invalid name was specified. + core::Ptr itemByName(const std::string& name) const; + + /// Returns number of joint origins in the collection. + size_t count() const; + + /// Creates an AsBuiltJointInput object which is used to collect all of the information needed + /// to create an as-built joint. This object is equivalent to the as-built joint dialog in the + /// user-interface in that it doesn't represent an actual joint but just the information needed + /// to create an as-built joint. Once this is fully defined the add method can be called, passing + /// this object in to create the actual joint. + /// occurrenceOne : Specifies the first of two occurrences the joint is between. + /// occurrenceTwo : Specifies the second of two occurrences the joint is between. + /// geometry : Specifies the geometry of where the joint will be positioned. If the as-built joint is + /// a rigid joint, this argument should be null because no geometry is needed. + /// Returns the new AsBuiltJointInput object or null in the case of failure. + core::Ptr createInput(const core::Ptr& occurrenceOne, const core::Ptr& occurrenceTwo, const core::Ptr& geometry); + + /// Creates a new as-built joint. + /// input : An AsBuiltJointInput object that was created using the AsBuiltJoints.createInput method and then fully defined + /// using the properties and methods on the AsBuiltJointInput object. + /// Returns the new AsBuiltJoint object or null in the case of failure. + core::Ptr add(const core::Ptr& input); + + typedef AsBuiltJoint iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_ASBUILTJOINTS_API static const char* classType(); + ADSK_FUSION_ASBUILTJOINTS_API const char* objectType() const override; + ADSK_FUSION_ASBUILTJOINTS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_ASBUILTJOINTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual AsBuiltJoint* item_raw(size_t index) const = 0; + virtual AsBuiltJoint* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual AsBuiltJointInput* createInput_raw(Occurrence* occurrenceOne, Occurrence* occurrenceTwo, JointGeometry* geometry) = 0; + virtual AsBuiltJoint* add_raw(AsBuiltJointInput* input) = 0; +}; + +// Inline wrappers + +inline core::Ptr AsBuiltJoints::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr AsBuiltJoints::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t AsBuiltJoints::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr AsBuiltJoints::createInput(const core::Ptr& occurrenceOne, const core::Ptr& occurrenceTwo, const core::Ptr& geometry) +{ + core::Ptr res = createInput_raw(occurrenceOne.get(), occurrenceTwo.get(), geometry.get()); + return res; +} + +inline core::Ptr AsBuiltJoints::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +template inline void AsBuiltJoints::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_ASBUILTJOINTS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/BallJointMotion.h b/usr/autodesk/CPP/include/Fusion/Components/BallJointMotion.h new file mode 100644 index 0000000..ac5cea4 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/BallJointMotion.h @@ -0,0 +1,269 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "JointMotion.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BALLJOINTMOTION_CPP__ +# define ADSK_FUSION_BALLJOINTMOTION_API XI_EXPORT +# else +# define ADSK_FUSION_BALLJOINTMOTION_API +# endif +#else +# define ADSK_FUSION_BALLJOINTMOTION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class JointLimits; +}} +namespace adsk { namespace core { + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// Represents the set of information specific to a ball joint. +class BallJointMotion : public JointMotion { +public: + + /// Gets and sets the direction that the pitch is measured from. + /// This can only be set to ZAxisJointDirection and can return ZAxisJointDirection + /// or CustomJointDirection. If this returns CustomJointDirection then the + /// customNormalDirectionEntity will return an entity that defines the direction. + /// If there is a custom direction defined and this property is set to ZAxisJointDirection, + /// the custom direction will be removed and customNormalDirectionEntity will return null. + JointDirections pitchDirection() const; + bool pitchDirection(JointDirections value); + + /// This property defines a custom pitch direction and can be set using various types + /// of entities that can infer a direction. For example, a linear edge, sketch line, + /// planar face, and cylindrical face.This property is only valid in the case where the + /// pitchDirection property returns CustomJointDirection. Setting this property will + /// automatically set the pitchDirection property to CustomJointDirection. + /// To set this property, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + core::Ptr customPitchDirectionEntity() const; + bool customPitchDirectionEntity(const core::Ptr& value); + + /// Returns the direction that the pitch angle is measured from. This property will return null in the case + /// where the BallJointMotion object was obtained from a JointInput object. + core::Ptr pitchDirectionVector() const; + + /// Gets and sets the direction that the pitch is measured from. + /// This can only be set to XAxisJointDirection and can return XAxisJointDirection + /// or CustomJointDirection. If this returns CustomJointDirection then the + /// customYawDirectionEntity will return an entity that defines the direction. + /// If there is a custom direction defined and this property is set to XAxisJointDirection, + /// the custom direction will be removed and customYawDirectionEntity will return null. + JointDirections yawDirection() const; + bool yawDirection(JointDirections value); + + /// This property defines a custom yaw direction and can be set using various types + /// of entities that can infer a direction. For example, a linear edge, sketch line, + /// planar face, and cylindrical face.This property is only valid in the case where the + /// yawDirection property returns CustomJointDirection. Setting this property will + /// automatically set the yawDirection property to CustomJointDirection. + /// To set this property, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + core::Ptr customYawDirectionEntity() const; + bool customYawDirectionEntity(const core::Ptr& value); + + /// Returns the direction that the yaw angle is measured from. This property will return null in the case + /// where the BallJointMotion object was obtained from a JointInput object. + core::Ptr yawDirectionVector() const; + + /// Returns the direction that the roll angle is measured from. This property will return null in the case + /// where the BallJointMotion object was obtained from a JointInput object. + core::Ptr rollDirectionVector() const; + + /// Gets and sets the pitch value. This is in radians. Setting this value is + /// the equivalent of using the Drive Joints command. + double pitchValue() const; + bool pitchValue(double value); + + /// Returns a JointLimits object that defines the limits of rotation for the pitch. + /// Use the functionality of the returned JointLimits object to get, set, and modify + /// the joint limits. + core::Ptr pitchLimits() const; + + /// Gets and sets the yaw value. This is in radians. Setting this value is + /// the equivalent of using the Drive Joints command. + double yawValue() const; + bool yawValue(double value); + + /// Returns a JointLimits object that defines the limits of rotation for the yaw. + /// Use the functionality of the returned JointLimits object to get, set, and modify + /// the joint limits. + core::Ptr yawLimits() const; + + /// Gets and sets the roll value. This is in radians. Setting this value is + /// the equivalent of using the Drive Joints command. + double rollValue() const; + bool rollValue(double value); + + /// Returns a JointLimits object that defines the limits of rotation for the roll. + /// Use the functionality of the returned JointLimits object to get, set, and modify + /// the joint limits. + core::Ptr rollLimits() const; + + ADSK_FUSION_BALLJOINTMOTION_API static const char* classType(); + ADSK_FUSION_BALLJOINTMOTION_API const char* objectType() const override; + ADSK_FUSION_BALLJOINTMOTION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BALLJOINTMOTION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual JointDirections pitchDirection_raw() const = 0; + virtual bool pitchDirection_raw(JointDirections value) = 0; + virtual core::Base* customPitchDirectionEntity_raw() const = 0; + virtual bool customPitchDirectionEntity_raw(core::Base* value) = 0; + virtual core::Vector3D* pitchDirectionVector_raw() const = 0; + virtual JointDirections yawDirection_raw() const = 0; + virtual bool yawDirection_raw(JointDirections value) = 0; + virtual core::Base* customYawDirectionEntity_raw() const = 0; + virtual bool customYawDirectionEntity_raw(core::Base* value) = 0; + virtual core::Vector3D* yawDirectionVector_raw() const = 0; + virtual core::Vector3D* rollDirectionVector_raw() const = 0; + virtual double pitchValue_raw() const = 0; + virtual bool pitchValue_raw(double value) = 0; + virtual JointLimits* pitchLimits_raw() const = 0; + virtual double yawValue_raw() const = 0; + virtual bool yawValue_raw(double value) = 0; + virtual JointLimits* yawLimits_raw() const = 0; + virtual double rollValue_raw() const = 0; + virtual bool rollValue_raw(double value) = 0; + virtual JointLimits* rollLimits_raw() const = 0; +}; + +// Inline wrappers + +inline JointDirections BallJointMotion::pitchDirection() const +{ + JointDirections res = pitchDirection_raw(); + return res; +} + +inline bool BallJointMotion::pitchDirection(JointDirections value) +{ + return pitchDirection_raw(value); +} + +inline core::Ptr BallJointMotion::customPitchDirectionEntity() const +{ + core::Ptr res = customPitchDirectionEntity_raw(); + return res; +} + +inline bool BallJointMotion::customPitchDirectionEntity(const core::Ptr& value) +{ + return customPitchDirectionEntity_raw(value.get()); +} + +inline core::Ptr BallJointMotion::pitchDirectionVector() const +{ + core::Ptr res = pitchDirectionVector_raw(); + return res; +} + +inline JointDirections BallJointMotion::yawDirection() const +{ + JointDirections res = yawDirection_raw(); + return res; +} + +inline bool BallJointMotion::yawDirection(JointDirections value) +{ + return yawDirection_raw(value); +} + +inline core::Ptr BallJointMotion::customYawDirectionEntity() const +{ + core::Ptr res = customYawDirectionEntity_raw(); + return res; +} + +inline bool BallJointMotion::customYawDirectionEntity(const core::Ptr& value) +{ + return customYawDirectionEntity_raw(value.get()); +} + +inline core::Ptr BallJointMotion::yawDirectionVector() const +{ + core::Ptr res = yawDirectionVector_raw(); + return res; +} + +inline core::Ptr BallJointMotion::rollDirectionVector() const +{ + core::Ptr res = rollDirectionVector_raw(); + return res; +} + +inline double BallJointMotion::pitchValue() const +{ + double res = pitchValue_raw(); + return res; +} + +inline bool BallJointMotion::pitchValue(double value) +{ + return pitchValue_raw(value); +} + +inline core::Ptr BallJointMotion::pitchLimits() const +{ + core::Ptr res = pitchLimits_raw(); + return res; +} + +inline double BallJointMotion::yawValue() const +{ + double res = yawValue_raw(); + return res; +} + +inline bool BallJointMotion::yawValue(double value) +{ + return yawValue_raw(value); +} + +inline core::Ptr BallJointMotion::yawLimits() const +{ + core::Ptr res = yawLimits_raw(); + return res; +} + +inline double BallJointMotion::rollValue() const +{ + double res = rollValue_raw(); + return res; +} + +inline bool BallJointMotion::rollValue(double value) +{ + return rollValue_raw(value); +} + +inline core::Ptr BallJointMotion::rollLimits() const +{ + core::Ptr res = rollLimits_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BALLJOINTMOTION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/BaseComponent.h b/usr/autodesk/CPP/include/Fusion/Components/BaseComponent.h new file mode 100644 index 0000000..2949c9a --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/BaseComponent.h @@ -0,0 +1,291 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BASECOMPONENT_CPP__ +# define ADSK_FUSION_BASECOMPONENT_API XI_EXPORT +# else +# define ADSK_FUSION_BASECOMPONENT_API +# endif +#else +# define ADSK_FUSION_BASECOMPONENT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBodies; + class Component; + class ConstructionAxes; + class ConstructionPlanes; + class ConstructionPoints; + class Design; + class OccurrenceList; + class Occurrences; +}} +namespace adsk { namespace core { + class ObjectCollection; + class Point3D; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// The BaseComponent object that defines all of the common design data +/// and is the base class for the product specific components. +class BaseComponent : public core::Base { +public: + + /// Property that gets and sets the name of this component. This is the name + /// shown in the browser for each occurrence referencing this component. + std::string name() const; + bool name(const std::string& value); + + /// Property that returns the Occurrences collection associated with this component. + /// This provides access to the occurrences at the top-level of this component and provides + /// the functionality to add new occurrences. + core::Ptr occurrences() const; + + /// Returns all occurrences at the top-level of this component that reference the specified component. + /// The returned list is read-only. + /// component : The component that is being referenced by the occurrences that will be returned. + /// The occurrences referenced by the specified component. + core::Ptr occurrencesByComponent(const core::Ptr& component) const; + + /// Returns all of the occurrences in the assembly regardless of their level within the assembly structure. + /// The returned list is read-only. + core::Ptr allOccurrences() const; + + /// Returns all occurrences, at any level of the assembly, that reference the specified component. + /// The returned list is read-only. + /// component : The component that is being referenced by the occurrences that will be returned. + /// The occurrences referenced by the specified component. + core::Ptr allOccurrencesByComponent(const core::Ptr& component) const; + + /// Returns the construction planes collection associated with this component. + /// This provides access to the existing construction planes and supports + /// the creation of new construction planes. + core::Ptr constructionPlanes() const; + + /// Returns the construction axes collection associated with this component. + /// This provides access to the existing construction axes and supports + /// the creation of new construction axes. + core::Ptr constructionAxes() const; + + /// Returns the construction points collection associated with this component. + /// This provides access to the existing construction points and supports + /// the creation of new construction points. + core::Ptr constructionPoints() const; + + /// Returns the B-Rep bodies collection associated with this component. + core::Ptr bRepBodies() const; + + /// Returns the parent product this component is owned by. + core::Ptr parentDesign() const; + + /// Finds all the B-Rep entities that are intersected by the specified ray. This can return BRepFace, BrepEdge, + /// and BRepVertex objects. + /// originPoint : Input point that defines the origin of the ray. The search for entities begins at this point. + /// rayDirection : Input vector that defines the direction of the ray. The ray is infinite so the length of the vector is ignored. + /// entityType : The type of B-Rep entity wanted. You can also take advantage of B-Rep topology to infer other intersections. For example, + /// If you get a BRepEdge it implies that the faces the edge connects were also intersected. If a BRepVertex is returned it + /// implies the edges that the vertex connects were intersected and the faces that the edges connect were intersected. + /// proximityTolerance : Optional argument that specifies the tolerance for the search. All entities within this distance from the ray and of the specified type will be returned. If not specified a default small tolerance is used. + /// visibleEntitiesOnly : Optional argument that indicates whether or not invisible entities should be included in the search. Defaults to True indicating that invisible entities will be ignored. + /// hitPoints : An ObjectCollection of Point3D objects that represent the coordinates where the ray hit the found entity. There will be the same number of hit points as returned entities + /// and they will be in the collections in the same order. In other words, hit point 1 corresponds with found entity 1, hit point 2 corresponds with found entity 2, and so on. + /// Because of the proximity tolerance the hitPoint may not actually lie on the entity but will be within the proximity tolerance to it. + /// It's an optional out argument, returns the hit points if an existing ObjectCollection is input. You can create a new ObjectCollection by using + /// the static create method on the ObjectCollection class. + /// Returns an ObjectCollection containing the entities found. The returned collection can be empty indicating nothing was found. The points are returned + /// in an order where they are arranged based on their distance from the origin point where the closest point is first. If an entity is hit more than + /// once, the entity is returned once for the first intersection. + core::Ptr findBRepUsingRay(const core::Ptr& originPoint, const core::Ptr& rayDirection, BRepEntityTypes entityType, double proximityTolerance = -1, bool visibleEntitiesOnly = true, const core::Ptr& hitPoints = NULL); + + /// Finds all the entities of the specified type at the specified location. + /// point : Input coordinate that specifies the component space point at which to find the entities. + /// entityType : The type of B-Rep entity wanted. You can also take advantage of B-Rep topology to infer other that other entities were found. For example, + /// If you get a BRepEdge it implies that the faces the edge connects were also found. If a BRepVertex is returned it + /// implies the edges that the vertex connects were found and the faces that the edges connect were found. + /// proximityTolerance : Specifies the tolerance for the search. All entities within this distance from the search point that match the filter will be returned. If not specified a default tolerance is used. + /// visibleEntitiesOnly : indicates whether or not invisible objects should be included in the search. Defaults to True indicating that invisible objects will be ignored. + /// Returns an ObjectCollection containing the entities found. The returned collection can be empty indicating nothing was found. + core::Ptr findBRepUsingPoint(const core::Ptr& point, BRepEntityTypes entityType, double proximityTolerance = -1, bool visibleEntitiesOnly = true); + + ADSK_FUSION_BASECOMPONENT_API static const char* classType(); + ADSK_FUSION_BASECOMPONENT_API const char* objectType() const override; + ADSK_FUSION_BASECOMPONENT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BASECOMPONENT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual Occurrences* occurrences_raw() const = 0; + virtual OccurrenceList* occurrencesByComponent_raw(Component* component) const = 0; + virtual OccurrenceList* allOccurrences_raw() const = 0; + virtual OccurrenceList* allOccurrencesByComponent_raw(Component* component) const = 0; + virtual ConstructionPlanes* constructionPlanes_raw() const = 0; + virtual ConstructionAxes* constructionAxes_raw() const = 0; + virtual ConstructionPoints* constructionPoints_raw() const = 0; + virtual BRepBodies* bRepBodies_raw() const = 0; + virtual Design* parentDesign_raw() const = 0; + virtual core::ObjectCollection* findBRepUsingRay_raw(core::Point3D* originPoint, core::Vector3D* rayDirection, BRepEntityTypes entityType, double proximityTolerance, bool visibleEntitiesOnly, core::ObjectCollection* hitPoints) = 0; + virtual core::ObjectCollection* findBRepUsingPoint_raw(core::Point3D* point, BRepEntityTypes entityType, double proximityTolerance, bool visibleEntitiesOnly) = 0; + virtual void placeholderBaseComponent0() {} + virtual void placeholderBaseComponent1() {} + virtual void placeholderBaseComponent2() {} + virtual void placeholderBaseComponent3() {} + virtual void placeholderBaseComponent4() {} + virtual void placeholderBaseComponent5() {} + virtual void placeholderBaseComponent6() {} + virtual void placeholderBaseComponent7() {} + virtual void placeholderBaseComponent8() {} + virtual void placeholderBaseComponent9() {} + virtual void placeholderBaseComponent10() {} + virtual void placeholderBaseComponent11() {} + virtual void placeholderBaseComponent12() {} + virtual void placeholderBaseComponent13() {} + virtual void placeholderBaseComponent14() {} + virtual void placeholderBaseComponent15() {} + virtual void placeholderBaseComponent16() {} + virtual void placeholderBaseComponent17() {} + virtual void placeholderBaseComponent18() {} + virtual void placeholderBaseComponent19() {} + virtual void placeholderBaseComponent20() {} + virtual void placeholderBaseComponent21() {} + virtual void placeholderBaseComponent22() {} + virtual void placeholderBaseComponent23() {} + virtual void placeholderBaseComponent24() {} + virtual void placeholderBaseComponent25() {} + virtual void placeholderBaseComponent26() {} + virtual void placeholderBaseComponent27() {} + virtual void placeholderBaseComponent28() {} + virtual void placeholderBaseComponent29() {} + virtual void placeholderBaseComponent30() {} + virtual void placeholderBaseComponent31() {} + virtual void placeholderBaseComponent32() {} + virtual void placeholderBaseComponent33() {} + virtual void placeholderBaseComponent34() {} + virtual void placeholderBaseComponent35() {} + virtual void placeholderBaseComponent36() {} + virtual void placeholderBaseComponent37() {} + virtual void placeholderBaseComponent38() {} + virtual void placeholderBaseComponent39() {} + virtual void placeholderBaseComponent40() {} + virtual void placeholderBaseComponent41() {} + virtual void placeholderBaseComponent42() {} + virtual void placeholderBaseComponent43() {} + virtual void placeholderBaseComponent44() {} + virtual void placeholderBaseComponent45() {} + virtual void placeholderBaseComponent46() {} + virtual void placeholderBaseComponent47() {} + virtual void placeholderBaseComponent48() {} + virtual void placeholderBaseComponent49() {} + virtual void placeholderBaseComponent50() {} +}; + +// Inline wrappers + +inline std::string BaseComponent::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool BaseComponent::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline core::Ptr BaseComponent::occurrences() const +{ + core::Ptr res = occurrences_raw(); + return res; +} + +inline core::Ptr BaseComponent::occurrencesByComponent(const core::Ptr& component) const +{ + core::Ptr res = occurrencesByComponent_raw(component.get()); + return res; +} + +inline core::Ptr BaseComponent::allOccurrences() const +{ + core::Ptr res = allOccurrences_raw(); + return res; +} + +inline core::Ptr BaseComponent::allOccurrencesByComponent(const core::Ptr& component) const +{ + core::Ptr res = allOccurrencesByComponent_raw(component.get()); + return res; +} + +inline core::Ptr BaseComponent::constructionPlanes() const +{ + core::Ptr res = constructionPlanes_raw(); + return res; +} + +inline core::Ptr BaseComponent::constructionAxes() const +{ + core::Ptr res = constructionAxes_raw(); + return res; +} + +inline core::Ptr BaseComponent::constructionPoints() const +{ + core::Ptr res = constructionPoints_raw(); + return res; +} + +inline core::Ptr BaseComponent::bRepBodies() const +{ + core::Ptr res = bRepBodies_raw(); + return res; +} + +inline core::Ptr BaseComponent::parentDesign() const +{ + core::Ptr res = parentDesign_raw(); + return res; +} + +inline core::Ptr BaseComponent::findBRepUsingRay(const core::Ptr& originPoint, const core::Ptr& rayDirection, BRepEntityTypes entityType, double proximityTolerance, bool visibleEntitiesOnly, const core::Ptr& hitPoints) +{ + core::Ptr res = findBRepUsingRay_raw(originPoint.get(), rayDirection.get(), entityType, proximityTolerance, visibleEntitiesOnly, hitPoints.get()); + return res; +} + +inline core::Ptr BaseComponent::findBRepUsingPoint(const core::Ptr& point, BRepEntityTypes entityType, double proximityTolerance, bool visibleEntitiesOnly) +{ + core::Ptr res = findBRepUsingPoint_raw(point.get(), entityType, proximityTolerance, visibleEntitiesOnly); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BASECOMPONENT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/Component.h b/usr/autodesk/CPP/include/Fusion/Components/Component.h new file mode 100644 index 0000000..4af41f2 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/Component.h @@ -0,0 +1,725 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "BaseComponent.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_COMPONENT_CPP__ +# define ADSK_FUSION_COMPONENT_API XI_EXPORT +# else +# define ADSK_FUSION_COMPONENT_API +# endif +#else +# define ADSK_FUSION_COMPONENT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class AsBuiltJoint; + class AsBuiltJoints; + class ConstructionAxis; + class ConstructionPlane; + class ConstructionPoint; + class CustomGraphicsGroups; + class Features; + class Joint; + class JointOrigin; + class JointOrigins; + class Joints; + class MeshBodies; + class ModelParameters; + class Occurrence; + class PhysicalProperties; + class Profile; + class RigidGroup; + class RigidGroups; + class Sketches; +}} +namespace adsk { namespace core { + class Attributes; + class BoundingBox3D; + class DataFileFuture; + class DataFolder; + class Material; + class Matrix3D; +}} + +namespace adsk { namespace fusion { + +/// Represents a component in the data model. +/// A component represents a set of geometry, features, and parameters that make up an item in the design. +/// A component can be referenced multiple times into a design with a Occurrence object. +class Component : public BaseComponent { +public: + + /// Returns the sketches collection associated with this component. + /// This provides access to the existing sketches and supports + /// the creation of new sketches. + core::Ptr sketches() const; + + /// Returns the collection that provides access to all of the features + /// associated with this component. + core::Ptr features() const; + + /// Returns the mesh bodies collection associated with this component. + core::Ptr meshBodies() const; + + /// Returns the collection of model parameters in the Component. + core::Ptr modelParameters() const; + + /// Gets and sets if the light bulb of the origin folder as seen in the browser is on or off. + /// This controls the visibility of the origin construction geometry. + bool isOriginFolderLightBulbOn() const; + bool isOriginFolderLightBulbOn(bool value); + + /// Gets and sets if the light bulb of the construction folder as seen in the browser is on or off. + /// This controls the visibility of the (non-origin) construction geometry + /// (i.e. planes, points, axes). + bool isConstructionFolderLightBulbOn() const; + bool isConstructionFolderLightBulbOn(bool value); + + /// Gets and sets if the light bulb of the sketch folder as seen in the browser is on or off. + /// This controls the visibility of the sketches in this component. + bool isSketchFolderLightBulbOn() const; + bool isSketchFolderLightBulbOn(bool value); + + /// Returns the XY origin construction plane. + core::Ptr xYConstructionPlane() const; + + /// Returns the XZ origin construction plane. + core::Ptr xZConstructionPlane() const; + + /// Returns the YZ origin construction plane. + core::Ptr yZConstructionPlane() const; + + /// Returns the X origin construction axis. + core::Ptr xConstructionAxis() const; + + /// Returns the Y origin construction axis. + core::Ptr yConstructionAxis() const; + + /// Returns the Z origin construction axis. + core::Ptr zConstructionAxis() const; + + /// Returns the origin construction point. + core::Ptr originConstructionPoint() const; + + /// Gets and sets the part number associated with this component. Setting this + /// to an empty string will reset it to be the same as the component name. + std::string partNumber() const; + bool partNumber(const std::string& value); + + /// Gets and sets the description associated with this component. + std::string description() const; + bool description(const std::string& value); + + /// Creates an open profile based on the input curve(s). + /// curves : A SketchCurve or an ObjectCollection containing multiple sketch entities. If a single sketch curve + /// is input the chainCurves argument is checked to determine if connected curves (they do not need to be tangent) + /// should be automatically found. If multiple curves are provided the chainCurves argument is always + /// treated as false so you must provide all of the curves in the object collection that you want included in the profile. + /// The provided curves must all connect together in a single path. + /// The input curves do not need to be in the same sketch, but they do need to geometrically connect for + /// a valid profile to be created. + /// chainCurves : If true, this finds any curves within the same sketch that connect to the single input curve and automatically includes them in the profile. If + /// false, only the curves provided will be used to define the profile. This argument is ignored and treated as false if multiple curves are input. + /// Returns the new Profile object or null in the case of a failure. + core::Ptr createOpenProfile(const core::Ptr& curves, bool chainCurves = true); + + /// Creates a profile based on the outside open edges of a BRepFace. + /// edges : A single BRepEdge object or an ObjectCollection containing multiple BRepEdge objects, or a BRepLoop object. If a single edge + /// is input, the chainEdges argument is checked to determine if connected edges (they do not need to be tangent) + /// should be automatically found. If multiple edges are provided the chainEdges argument is always + /// treated as false so you must provide all of the edges in the object collection that you want included in the profile. + /// and the edges must all connect together in a single path. if a BRepLoop object is provided, all of the edges in the loop + /// are included in the profile and the chainEdges argument is ignored. + /// chainEdges : If true, this finds any edges that connect to the single input edge and automatically includes them in the profile. If + /// false, only the edges provided will be used to define the profile. This argument is ignored and treated as false if multiple edges + /// or a BRepLoop is input. + /// Returns the new Profile object or null in the case of a failure. + core::Ptr createBRepEdgeProfile(const core::Ptr& edges, bool chainEdges = true); + + /// Returns the collection of joints associated with this component. + core::Ptr joints() const; + + /// This property was incorrectly spelled and has been replaced with the JointOrigins property. + /// However, this needs to remain in the implementation to continue to support programs that + /// already used it, but it will be hidden in the documentation. + core::Ptr jointOrgins() const; + + /// Returns the collection of as-built joints associated with this component. + core::Ptr asBuiltJoints() const; + + /// Returns the collection of rigid groups associated with this component. + core::Ptr rigidGroups() const; + + /// Gets and sets the physical material assigned to this component. + core::Ptr material() const; + bool material(const core::Ptr& value); + + /// Returns the PhysicalProperties object that has properties for getting the area, density, mass, volume, moments, etc + /// of this component. Property values will be calculated using the 'LowCalculationAccuracy' setting when using this property + /// to get the PhysicalProperties object. To specify a higher calculation tolerance, use the getPhysicalProperties method instead. + core::Ptr physicalProperties() const; + + /// Performs a Save Copy As on this component. This saves the specified component as a new document + /// in the specified location. + /// name : The name to use for the new document. If this is an empty string, Fusion 360 will use the + /// name of the component being saved. + /// dataFolder : The data folder to save the new document to. + /// description : The description string of the document. This can be an empty string. + /// tag : The tag string of the document. This can be an empty string. + /// Returns a DataFileFuture object that can be used to track the progress of the upload and get the + /// resulting DataFile once it's available on A360. + core::Ptr saveCopyAs(const std::string& name, const core::Ptr& dataFolder, const std::string& description, const std::string& tag) const; + + /// Returns the bounding box of this component. This is always in world space of the component. + core::Ptr boundingBox() const; + + /// Gets and sets if the light bulb of the joints folder as seen in the browser is on or off. + /// This controls the visibility of the joints in this occurrence. The light bulb for the + /// folder is component specific and will turn off the joints for all occurrences referencing + /// the component. + bool isJointsFolderLightBulbOn() const; + bool isJointsFolderLightBulbOn(bool value); + + /// Returns the collection of attributes associated with this face. + core::Ptr attributes() const; + + /// Gets and sets if the light bulb of the bodies folder as seen in the browser is on or off. + /// This controls the visibility of the solid/surface bodies and the mesh bodies in this component. + bool isBodiesFolderLightBulbOn() const; + bool isBodiesFolderLightBulbOn(bool value); + + /// Returns the PhysicalProperties object that has properties for getting the area, density, mass, volume, moments, etc + /// of this component. + /// accuracy : Specifies the desired level of computational accuracy of the property calculations. + /// The default value of 'LowCalculationAccuracy' returns results within a +/- 1% error margin. + core::Ptr getPhysicalProperties(CalculationAccuracy accuracy = adsk::fusion::LowCalculationAccuracy) const; + + /// Transforms a set of occurrences in one step. This provides better performance than transforming them one at a time. + /// This method is only valid when called on the root component because Fusion 360 flattens the entire assembly structure + /// when manipulating the assembly so all transforms are relative to the root component. + /// occurrences : An array of Occurrence objects that you want to transform. These must all be in the context of the root component which + /// means proxies must be used for occurrences that are in sub-components. + /// transforms : An array of Matrix3D objects that defines the transform to apply to each occurrence. This array must be the same size + /// as the array provided for the occurrences argument and the transform will be applied to the occurrence at the same index + /// in the occurrences array. + /// ignoreJoints : Specifies if the joints are to be ignored and the occurrences are to be positioned based on then specified transform or if + /// the joints should be used and the occurrence is transformed the best it can while still honoring the joints. + /// Returns true if the transform was successful. + bool transformOccurrences(const std::vector>& occurrences, const std::vector>& transforms, bool ignoreJoints); + + /// Returns all joints in this component and any sub components. The joints returned are all in the context + /// of this component so any joints in sub components will be proxies. This is primarily useful when used + /// from the root component because Fusion 360 flattens the assembly structure, including joints, when manipulating + /// an assembly. + std::vector> allJoints() const; + + /// Returns all joint origins in this component and any sub components. The joint origins returned are all in the context + /// of this component so any joint origins in sub components will be proxies. This is primarily useful when used + /// from the root component because Fusion 360 flattens the assembly structure, including joint origins, when manipulating + /// an assembly. + std::vector> allAsBuiltJoints() const; + + /// Returns all as-built joints in this component and any sub components. The as-built joints returned are all in the context + /// of this component so any as-built joints in sub components will be proxies. This is primarily useful when used + /// from the root component because Fusion 360 flattens the assembly structure, including as-built joints, when manipulating + /// an assembly. + std::vector> allJointOrigins() const; + + /// Returns all rigid groups in this component and any sub components. The rigid groups returned are all in the context + /// of this component so any rigid groups in sub components will be proxies. This is primarily useful when used + /// from the root component because Fusion 360 flattens the assembly structure, including rigid groups, when manipulating + /// an assembly. + std::vector> allRigidGroups() const; + + /// Gets and sets the opacity override assigned to this component. A value of 1.0 specifies + /// that is it completely opaque and a value of 0.0 specifies that is it completely transparent. + /// This is only applicable for a non-root local component. + /// This value is not necessarily related to what the user sees because the opacity is inherited. + /// For example, if you have TopComponent and it has a component in it called SubComponent and you + /// set the opacity of TopComponent to be 0.5, SubComponent will also be shown as slightly transparent + /// even though the opacity property for it will return 1.0. Because a component can be referenced as + /// an occurrence in other components and they can have different opacity settings, it's possible that + /// different instances of the same component can display using different opacity levels. To get the + /// opacity that it is being displayed with use the Occurrence.visibleOpacity property. + double opacity() const; + bool opacity(double value); + + /// Returns the collection of joint origins associated with this component. + core::Ptr jointOrigins() const; + + /// Returns the customGraphicsGroups object in this component. + core::Ptr customGraphicsGroups() const; + + /// Returns the current revision ID of the component. This ID changes any time the component is modified in any way. By getting + /// and saving the ID when you create any data that is dependent on the component, you can then compare the saved + /// ID with the current ID to determine if the component has changed to know if you should update your data. + std::string revisionId() const; + + /// Returns a token for the Component object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same component. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + /// Returns the persistent ID of the component. This ID is created with the component and does not change. + /// Because this ID does not change, different revisions of the same design or copies of the design asset/file + /// will retain this ID. If components from different designs have the same ID, it indicates they are either + /// different revisions or a copy of the design was made. Therefore, this ID will always be unique within a + /// single design, but may not be unique in an assembly where externally referenced designs include different + /// revisions or copies of a design. + /// The ID is also the same ID used by PIM (Product Information Model). + std::string id() const; + + ADSK_FUSION_COMPONENT_API static const char* classType(); + ADSK_FUSION_COMPONENT_API const char* objectType() const override; + ADSK_FUSION_COMPONENT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_COMPONENT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Sketches* sketches_raw() const = 0; + virtual Features* features_raw() const = 0; + virtual MeshBodies* meshBodies_raw() const = 0; + virtual ModelParameters* modelParameters_raw() const = 0; + virtual bool isOriginFolderLightBulbOn_raw() const = 0; + virtual bool isOriginFolderLightBulbOn_raw(bool value) = 0; + virtual bool isConstructionFolderLightBulbOn_raw() const = 0; + virtual bool isConstructionFolderLightBulbOn_raw(bool value) = 0; + virtual bool isSketchFolderLightBulbOn_raw() const = 0; + virtual bool isSketchFolderLightBulbOn_raw(bool value) = 0; + virtual ConstructionPlane* xYConstructionPlane_raw() const = 0; + virtual ConstructionPlane* xZConstructionPlane_raw() const = 0; + virtual ConstructionPlane* yZConstructionPlane_raw() const = 0; + virtual ConstructionAxis* xConstructionAxis_raw() const = 0; + virtual ConstructionAxis* yConstructionAxis_raw() const = 0; + virtual ConstructionAxis* zConstructionAxis_raw() const = 0; + virtual ConstructionPoint* originConstructionPoint_raw() const = 0; + virtual char* partNumber_raw() const = 0; + virtual bool partNumber_raw(const char * value) = 0; + virtual char* description_raw() const = 0; + virtual bool description_raw(const char * value) = 0; + virtual Profile* createOpenProfile_raw(core::Base* curves, bool chainCurves) = 0; + virtual Profile* createBRepEdgeProfile_raw(core::Base* edges, bool chainEdges) = 0; + virtual Joints* joints_raw() const = 0; + virtual JointOrigins* jointOrgins_raw() const = 0; + virtual AsBuiltJoints* asBuiltJoints_raw() const = 0; + virtual RigidGroups* rigidGroups_raw() const = 0; + virtual core::Material* material_raw() const = 0; + virtual bool material_raw(core::Material* value) = 0; + virtual PhysicalProperties* physicalProperties_raw() const = 0; + virtual core::DataFileFuture* saveCopyAs_raw(const char * name, core::DataFolder* dataFolder, const char * description, const char * tag) const = 0; + virtual core::BoundingBox3D* boundingBox_raw() const = 0; + virtual bool isJointsFolderLightBulbOn_raw() const = 0; + virtual bool isJointsFolderLightBulbOn_raw(bool value) = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual bool isBodiesFolderLightBulbOn_raw() const = 0; + virtual bool isBodiesFolderLightBulbOn_raw(bool value) = 0; + virtual PhysicalProperties* getPhysicalProperties_raw(CalculationAccuracy accuracy) const = 0; + virtual bool transformOccurrences_raw(Occurrence** occurrences, size_t occurrences_size, core::Matrix3D** transforms, size_t transforms_size, bool ignoreJoints) = 0; + virtual Joint** allJoints_raw(size_t& return_size) const = 0; + virtual AsBuiltJoint** allAsBuiltJoints_raw(size_t& return_size) const = 0; + virtual JointOrigin** allJointOrigins_raw(size_t& return_size) const = 0; + virtual RigidGroup** allRigidGroups_raw(size_t& return_size) const = 0; + virtual double opacity_raw() const = 0; + virtual bool opacity_raw(double value) = 0; + virtual JointOrigins* jointOrigins_raw() const = 0; + virtual CustomGraphicsGroups* customGraphicsGroups_raw() const = 0; + virtual char* revisionId_raw() const = 0; + virtual char* entityToken_raw() const = 0; + virtual char* id_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr Component::sketches() const +{ + core::Ptr res = sketches_raw(); + return res; +} + +inline core::Ptr Component::features() const +{ + core::Ptr res = features_raw(); + return res; +} + +inline core::Ptr Component::meshBodies() const +{ + core::Ptr res = meshBodies_raw(); + return res; +} + +inline core::Ptr Component::modelParameters() const +{ + core::Ptr res = modelParameters_raw(); + return res; +} + +inline bool Component::isOriginFolderLightBulbOn() const +{ + bool res = isOriginFolderLightBulbOn_raw(); + return res; +} + +inline bool Component::isOriginFolderLightBulbOn(bool value) +{ + return isOriginFolderLightBulbOn_raw(value); +} + +inline bool Component::isConstructionFolderLightBulbOn() const +{ + bool res = isConstructionFolderLightBulbOn_raw(); + return res; +} + +inline bool Component::isConstructionFolderLightBulbOn(bool value) +{ + return isConstructionFolderLightBulbOn_raw(value); +} + +inline bool Component::isSketchFolderLightBulbOn() const +{ + bool res = isSketchFolderLightBulbOn_raw(); + return res; +} + +inline bool Component::isSketchFolderLightBulbOn(bool value) +{ + return isSketchFolderLightBulbOn_raw(value); +} + +inline core::Ptr Component::xYConstructionPlane() const +{ + core::Ptr res = xYConstructionPlane_raw(); + return res; +} + +inline core::Ptr Component::xZConstructionPlane() const +{ + core::Ptr res = xZConstructionPlane_raw(); + return res; +} + +inline core::Ptr Component::yZConstructionPlane() const +{ + core::Ptr res = yZConstructionPlane_raw(); + return res; +} + +inline core::Ptr Component::xConstructionAxis() const +{ + core::Ptr res = xConstructionAxis_raw(); + return res; +} + +inline core::Ptr Component::yConstructionAxis() const +{ + core::Ptr res = yConstructionAxis_raw(); + return res; +} + +inline core::Ptr Component::zConstructionAxis() const +{ + core::Ptr res = zConstructionAxis_raw(); + return res; +} + +inline core::Ptr Component::originConstructionPoint() const +{ + core::Ptr res = originConstructionPoint_raw(); + return res; +} + +inline std::string Component::partNumber() const +{ + std::string res; + + char* p= partNumber_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool Component::partNumber(const std::string& value) +{ + return partNumber_raw(value.c_str()); +} + +inline std::string Component::description() const +{ + std::string res; + + char* p= description_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool Component::description(const std::string& value) +{ + return description_raw(value.c_str()); +} + +inline core::Ptr Component::createOpenProfile(const core::Ptr& curves, bool chainCurves) +{ + core::Ptr res = createOpenProfile_raw(curves.get(), chainCurves); + return res; +} + +inline core::Ptr Component::createBRepEdgeProfile(const core::Ptr& edges, bool chainEdges) +{ + core::Ptr res = createBRepEdgeProfile_raw(edges.get(), chainEdges); + return res; +} + +inline core::Ptr Component::joints() const +{ + core::Ptr res = joints_raw(); + return res; +} + +inline core::Ptr Component::jointOrgins() const +{ + core::Ptr res = jointOrgins_raw(); + return res; +} + +inline core::Ptr Component::asBuiltJoints() const +{ + core::Ptr res = asBuiltJoints_raw(); + return res; +} + +inline core::Ptr Component::rigidGroups() const +{ + core::Ptr res = rigidGroups_raw(); + return res; +} + +inline core::Ptr Component::material() const +{ + core::Ptr res = material_raw(); + return res; +} + +inline bool Component::material(const core::Ptr& value) +{ + return material_raw(value.get()); +} + +inline core::Ptr Component::physicalProperties() const +{ + core::Ptr res = physicalProperties_raw(); + return res; +} + +inline core::Ptr Component::saveCopyAs(const std::string& name, const core::Ptr& dataFolder, const std::string& description, const std::string& tag) const +{ + core::Ptr res = saveCopyAs_raw(name.c_str(), dataFolder.get(), description.c_str(), tag.c_str()); + return res; +} + +inline core::Ptr Component::boundingBox() const +{ + core::Ptr res = boundingBox_raw(); + return res; +} + +inline bool Component::isJointsFolderLightBulbOn() const +{ + bool res = isJointsFolderLightBulbOn_raw(); + return res; +} + +inline bool Component::isJointsFolderLightBulbOn(bool value) +{ + return isJointsFolderLightBulbOn_raw(value); +} + +inline core::Ptr Component::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline bool Component::isBodiesFolderLightBulbOn() const +{ + bool res = isBodiesFolderLightBulbOn_raw(); + return res; +} + +inline bool Component::isBodiesFolderLightBulbOn(bool value) +{ + return isBodiesFolderLightBulbOn_raw(value); +} + +inline core::Ptr Component::getPhysicalProperties(CalculationAccuracy accuracy) const +{ + core::Ptr res = getPhysicalProperties_raw(accuracy); + return res; +} + +inline bool Component::transformOccurrences(const std::vector>& occurrences, const std::vector>& transforms, bool ignoreJoints) +{ + Occurrence** occurrences_ = new Occurrence*[occurrences.size()]; + for(size_t i=0; i> Component::allJoints() const +{ + std::vector> res; + size_t s; + + Joint** p= allJoints_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> Component::allAsBuiltJoints() const +{ + std::vector> res; + size_t s; + + AsBuiltJoint** p= allAsBuiltJoints_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> Component::allJointOrigins() const +{ + std::vector> res; + size_t s; + + JointOrigin** p= allJointOrigins_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> Component::allRigidGroups() const +{ + std::vector> res; + size_t s; + + RigidGroup** p= allRigidGroups_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline double Component::opacity() const +{ + double res = opacity_raw(); + return res; +} + +inline bool Component::opacity(double value) +{ + return opacity_raw(value); +} + +inline core::Ptr Component::jointOrigins() const +{ + core::Ptr res = jointOrigins_raw(); + return res; +} + +inline core::Ptr Component::customGraphicsGroups() const +{ + core::Ptr res = customGraphicsGroups_raw(); + return res; +} + +inline std::string Component::revisionId() const +{ + std::string res; + + char* p= revisionId_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string Component::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string Component::id() const +{ + std::string res; + + char* p= id_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_COMPONENT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/ComponentList.h b/usr/autodesk/CPP/include/Fusion/Components/ComponentList.h new file mode 100644 index 0000000..094a5ff --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/ComponentList.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_COMPONENTLIST_CPP__ +# define ADSK_FUSION_COMPONENTLIST_API XI_EXPORT +# else +# define ADSK_FUSION_COMPONENTLIST_API +# endif +#else +# define ADSK_FUSION_COMPONENTLIST_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Component; +}} + +namespace adsk { namespace fusion { + +/// Provides a list of components. +class ComponentList : public core::Base { +public: + + /// Function that returns the specified component using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of components in the collection. + size_t count() const; + + typedef Component iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_COMPONENTLIST_API static const char* classType(); + ADSK_FUSION_COMPONENTLIST_API const char* objectType() const override; + ADSK_FUSION_COMPONENTLIST_API void* queryInterface(const char* id) const override; + ADSK_FUSION_COMPONENTLIST_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Component* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ComponentList::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t ComponentList::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void ComponentList::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_COMPONENTLIST_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/Components.h b/usr/autodesk/CPP/include/Fusion/Components/Components.h new file mode 100644 index 0000000..0d034f7 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/Components.h @@ -0,0 +1,112 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_COMPONENTS_CPP__ +# define ADSK_FUSION_COMPONENTS_API XI_EXPORT +# else +# define ADSK_FUSION_COMPONENTS_API +# endif +#else +# define ADSK_FUSION_COMPONENTS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Component; +}} + +namespace adsk { namespace fusion { + +/// The Components collection object provides access to existing components in a design. +class Components : public core::Base { +public: + + /// Function that returns the specified component using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of components in the collection. + size_t count() const; + + /// Function that returns the specified component by name. + /// name : The name of the component within the collection to return. + /// Returns the specified component or null if the name is not found. + core::Ptr itemByName(const std::string& name) const; + + /// Returns the Component that has the specified ID. + /// id : The ID of the Component to get. This is the same id used by PIM (Product Information Model). + /// Returns the specified Component or null in the case where there isn't a Component with the specified ID in this Design. + core::Ptr itemById(const std::string& id) const; + + typedef Component iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_COMPONENTS_API static const char* classType(); + ADSK_FUSION_COMPONENTS_API const char* objectType() const override; + ADSK_FUSION_COMPONENTS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_COMPONENTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Component* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual Component* itemByName_raw(const char * name) const = 0; + virtual Component* itemById_raw(const char * id) const = 0; +}; + +// Inline wrappers + +inline core::Ptr Components::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t Components::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr Components::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline core::Ptr Components::itemById(const std::string& id) const +{ + core::Ptr res = itemById_raw(id.c_str()); + return res; +} + +template inline void Components::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_COMPONENTS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/ContactSet.h b/usr/autodesk/CPP/include/Fusion/Components/ContactSet.h new file mode 100644 index 0000000..637e8f4 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/ContactSet.h @@ -0,0 +1,134 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONTACTSET_CPP__ +# define ADSK_FUSION_CONTACTSET_API XI_EXPORT +# else +# define ADSK_FUSION_CONTACTSET_API +# endif +#else +# define ADSK_FUSION_CONTACTSET_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Represents a contact set in a design. +class ContactSet : public core::Base { +public: + + /// Gets and sets the name of the contact set. + std::string name() const; + bool name(const std::string& value); + + /// Gets and sets the group of Occurrence and/or BRepBody objects that are part of this contact set. + std::vector> occurencesAndBodies() const; + bool occurencesAndBodies(const std::vector>& value); + + /// Deletes this contact set from the design. + /// Returns true if the delete was successful. + bool deleteMe(); + + /// Gets and sets if this contact set is currently suppressed. + bool isSuppressed() const; + bool isSuppressed(bool value); + + ADSK_FUSION_CONTACTSET_API static const char* classType(); + ADSK_FUSION_CONTACTSET_API const char* objectType() const override; + ADSK_FUSION_CONTACTSET_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONTACTSET_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual core::Base** occurencesAndBodies_raw(size_t& return_size) const = 0; + virtual bool occurencesAndBodies_raw(core::Base** value, size_t value_size) = 0; + virtual bool deleteMe_raw() = 0; + virtual bool isSuppressed_raw() const = 0; + virtual bool isSuppressed_raw(bool value) = 0; +}; + +// Inline wrappers + +inline std::string ContactSet::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool ContactSet::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline std::vector> ContactSet::occurencesAndBodies() const +{ + std::vector> res; + size_t s; + + core::Base** p= occurencesAndBodies_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool ContactSet::occurencesAndBodies(const std::vector>& value) +{ + core::Base** value_ = new core::Base*[value.size()]; + for(size_t i=0; i +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONTACTSETS_CPP__ +# define ADSK_FUSION_CONTACTSETS_API XI_EXPORT +# else +# define ADSK_FUSION_CONTACTSETS_API +# endif +#else +# define ADSK_FUSION_CONTACTSETS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ContactSet; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the existing contact sets in a design and supports creating new contact sets. +class ContactSets : public core::Base { +public: + + /// Returns the specified contact set using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// + /// name : + /// + core::Ptr itemByName(const std::string& name) const; + + /// Returns the number of contacts sets in the design. + size_t count() const; + + /// Creates a new contact set for the provided occurrences and/or bodies. + /// occurrencesAndBodies : An array of Occurrence or BRepBody objects that will be included in the contact set. + /// All occurrences and bodies must be in the context of the root component. + /// Returns the newly created ContactSet or null in the case of failure. + core::Ptr add(const std::vector>& occurrencesAndBodies); + + ADSK_FUSION_CONTACTSETS_API static const char* classType(); + ADSK_FUSION_CONTACTSETS_API const char* objectType() const override; + ADSK_FUSION_CONTACTSETS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONTACTSETS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ContactSet* item_raw(size_t index) const = 0; + virtual ContactSet* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual ContactSet* add_raw(core::Base** occurrencesAndBodies, size_t occurrencesAndBodies_size) = 0; +}; + +// Inline wrappers + +inline core::Ptr ContactSets::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr ContactSets::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t ContactSets::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr ContactSets::add(const std::vector>& occurrencesAndBodies) +{ + core::Base** occurrencesAndBodies_ = new core::Base*[occurrencesAndBodies.size()]; + for(size_t i=0; i res = add_raw(occurrencesAndBodies_, occurrencesAndBodies.size()); + delete[] occurrencesAndBodies_; + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONTACTSETS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/CylindricalJointMotion.h b/usr/autodesk/CPP/include/Fusion/Components/CylindricalJointMotion.h new file mode 100644 index 0000000..7469dfe --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/CylindricalJointMotion.h @@ -0,0 +1,173 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "JointMotion.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CYLINDRICALJOINTMOTION_CPP__ +# define ADSK_FUSION_CYLINDRICALJOINTMOTION_API XI_EXPORT +# else +# define ADSK_FUSION_CYLINDRICALJOINTMOTION_API +# endif +#else +# define ADSK_FUSION_CYLINDRICALJOINTMOTION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class JointLimits; +}} +namespace adsk { namespace core { + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// Represents the set of information specific to a cylindrical joint. +class CylindricalJointMotion : public JointMotion { +public: + + /// Gets and sets the direction of the axis of rotation. This can be set to + /// XAxisJointDirection, YAxisJointDirection, or ZAxisJointDirection. It can + /// return those three directions and CustomJointDirection. If this returns + /// CustomJointDirection then the customRotationAxisEntity will return an entity + /// that defines the axis. If there is a custom rotation axis defined and this + /// property is set to one of the three standard axes, the custom rotation will + /// be removed and customRotationAxisEntity will return null. + JointDirections rotationAxis() const; + bool rotationAxis(JointDirections value); + + /// Returns the direction of the rotation axis. This property will return null in the case + /// where the CylindricalJointMotion object was obtained from a JointInput object. + core::Ptr rotationAxisVector() const; + + /// This property can be set using various types of entities that can infer an + /// axis. For example, a linear edge, sketch line, planar face, and cylindrical face. + /// This property is only valid in the case where the rotationAxis property returns + /// CustomJointDirection. Setting this property will automatically set + /// the rotationAxis property to CustomJointDirection. + /// To set this property, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + core::Ptr customRotationAxisEntity() const; + bool customRotationAxisEntity(const core::Ptr& value); + + /// Gets and sets the rotation value. This is in radians. Setting this value is + /// the equivalent of using the Drive Joints command. + double rotationValue() const; + bool rotationValue(double value); + + /// Returns a JointLimits object that defines the rotation limits for this joint. + /// Use the functionality of the returned JointLimits object to get, set, and modify + /// the joint limits. + core::Ptr rotationLimits() const; + + /// Gets and sets the slide value. This is in centimeters. Setting this value is + /// the equivalent of using the Drive Joints command. + double slideValue() const; + bool slideValue(double value); + + /// Returns a JointLimits object that defines the slide limits for this joint. + /// Use the functionality of the returned JointLimits object to get, set, and modify + /// the joint limits. + core::Ptr slideLimits() const; + + ADSK_FUSION_CYLINDRICALJOINTMOTION_API static const char* classType(); + ADSK_FUSION_CYLINDRICALJOINTMOTION_API const char* objectType() const override; + ADSK_FUSION_CYLINDRICALJOINTMOTION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CYLINDRICALJOINTMOTION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual JointDirections rotationAxis_raw() const = 0; + virtual bool rotationAxis_raw(JointDirections value) = 0; + virtual core::Vector3D* rotationAxisVector_raw() const = 0; + virtual core::Base* customRotationAxisEntity_raw() const = 0; + virtual bool customRotationAxisEntity_raw(core::Base* value) = 0; + virtual double rotationValue_raw() const = 0; + virtual bool rotationValue_raw(double value) = 0; + virtual JointLimits* rotationLimits_raw() const = 0; + virtual double slideValue_raw() const = 0; + virtual bool slideValue_raw(double value) = 0; + virtual JointLimits* slideLimits_raw() const = 0; +}; + +// Inline wrappers + +inline JointDirections CylindricalJointMotion::rotationAxis() const +{ + JointDirections res = rotationAxis_raw(); + return res; +} + +inline bool CylindricalJointMotion::rotationAxis(JointDirections value) +{ + return rotationAxis_raw(value); +} + +inline core::Ptr CylindricalJointMotion::rotationAxisVector() const +{ + core::Ptr res = rotationAxisVector_raw(); + return res; +} + +inline core::Ptr CylindricalJointMotion::customRotationAxisEntity() const +{ + core::Ptr res = customRotationAxisEntity_raw(); + return res; +} + +inline bool CylindricalJointMotion::customRotationAxisEntity(const core::Ptr& value) +{ + return customRotationAxisEntity_raw(value.get()); +} + +inline double CylindricalJointMotion::rotationValue() const +{ + double res = rotationValue_raw(); + return res; +} + +inline bool CylindricalJointMotion::rotationValue(double value) +{ + return rotationValue_raw(value); +} + +inline core::Ptr CylindricalJointMotion::rotationLimits() const +{ + core::Ptr res = rotationLimits_raw(); + return res; +} + +inline double CylindricalJointMotion::slideValue() const +{ + double res = slideValue_raw(); + return res; +} + +inline bool CylindricalJointMotion::slideValue(double value) +{ + return slideValue_raw(value); +} + +inline core::Ptr CylindricalJointMotion::slideLimits() const +{ + core::Ptr res = slideLimits_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CYLINDRICALJOINTMOTION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/Joint.h b/usr/autodesk/CPP/include/Fusion/Components/Joint.h new file mode 100644 index 0000000..20fcf79 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/Joint.h @@ -0,0 +1,528 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_JOINT_CPP__ +# define ADSK_FUSION_JOINT_API XI_EXPORT +# else +# define ADSK_FUSION_JOINT_API +# endif +#else +# define ADSK_FUSION_JOINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Component; + class JointMotion; + class ModelParameter; + class Occurrence; + class TimelineObject; +}} +namespace adsk { namespace core { + class Attributes; +}} + +namespace adsk { namespace fusion { + +/// A joint in a design. +class Joint : public core::Base { +public: + + /// Returns the parent component that owns this joint. + core::Ptr parentComponent() const; + + /// Gets and sets the name of the joint. + std::string name() const; + bool name(const std::string& value); + + /// Gets and sets the first JointGeometry or JointOrigin for this joint. + /// To set this property, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + core::Ptr geometryOrOriginOne() const; + bool geometryOrOriginOne(const core::Ptr& value); + + /// Gets and sets the second JointGeometry or JointOrigin for this joint. + /// To set this property, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + core::Ptr geometryOrOriginTwo() const; + bool geometryOrOriginTwo(const core::Ptr& value); + + /// Returns the parameter controlling the angle between the two input geometries. This is effectively the + /// angle between the two primary axes of the two joint geometries. + core::Ptr angle() const; + + /// Returns the parameter controlling the offset between the two input geometries. This is effectively the + /// offset distance between the two planes defined by the primary and secondary axes + /// of the input geometries or the offset along the tertiary axis (z axis) of the joint. + core::Ptr offset() const; + + /// Gets and sets if the joint direction is flipped or not. This is effectively + /// specifying if the third axis of the two input geometries is facing (false) or + /// opposed (true). + /// To set this property, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + bool isFlipped() const; + bool isFlipped(bool value); + + /// Returns a JointMotion object that defines the motion relationship between the two geometries. + core::Ptr jointMotion() const; + + /// Deletes this joint. + /// Returns true if the delete is successful. + bool deleteMe(); + + /// Returns the timeline object associated with this joint. + core::Ptr timelineObject() const; + + /// Redefines the relationship between the two joint geometries as a rigid joint. + /// To use this method, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + /// Returns true if successful. + bool setAsRigidJointMotion(); + + /// Redefines the relationship between the two joint geometries as a revolute joint. + /// To use this method, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + /// rotationAxis : Specifies which axis the rotation is around. If this is set to CustomJointDirection then the + /// customRotationAxisEntity argument must also be provided. + /// customRotationAxisEntity : If the rotationAxis is customAxisEntity this argument is used to specify the entity that defines + /// the custom axis of rotation. This can be several types of entities that an axis can be derived + /// from. + /// Returns true if the operation was successful. + bool setAsRevoluteJointMotion(JointDirections rotationAxis, const core::Ptr& customRotationAxisEntity = NULL); + + /// Redefines the relationship between the two joint geometries as a slider joint. + /// To use this method, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + /// sliderDirection : Specifies which axis the slide direction is along. If this is set to CustomJointDirection then the + /// customSliderDirectionEntity argument must also be provided. + /// customSliderDirectionEntity : If the sliderDirection is CustomJointDirection this argument is used to specify the entity that defines + /// the custom slider direction. This can be several types of entities that can define a direction. + /// Returns true if the operation was successful. + bool setAsSliderJointMotion(JointDirections sliderDirection, const core::Ptr& customSliderDirectionEntity = NULL); + + /// Redefines the relationship between the two joint geometries as a cylindrical joint. + /// To use this method, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + /// rotationAxis : Specifies which axis the rotation is around. If this is set to CustomJointDirection then the + /// customRotationAxisEntity argument must also be provided. + /// customRotationAxisEntity : If the rotationAxis is customAxisEntity this argument is used to specify the entity that defines + /// the custom axis of rotation. This can be several types of entities that an axis can be derived + /// from. + /// Returns true if the operation was successful. + bool setAsCylindricalJointMotion(JointDirections rotationAxis, const core::Ptr& customRotationAxisEntity = NULL); + + /// Redefines the relationship between the two joint geometries as a pin-slot joint. + /// To use this method, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + /// rotationAxis : Specifies which axis the rotation is around. If this is set to CustomJointDirection then the + /// customRotationAxisEntity argument must also be provided. + /// slideDirection : Specifies which axis the slide direction is along. If this is set to CustomJointDirection then the + /// customSlideDirectionEntity argument must also be provided. + /// customRotationAxisEntity : If the rotationAxis is customAxisEntity this argument is used to specify the entity that defines + /// the custom axis of rotation. This can be several types of entities that an axis can be derived + /// customSlideDirectionEntity : If the slideDirection is CustomJointDirection this argument is used to specify the entity that defines + /// the custom slide direction. This can be several types of entities that can define a direction. + /// Returns true if the operation was successful. + bool setAsPinSlotJointMotion(JointDirections rotationAxis, JointDirections slideDirection, const core::Ptr& customRotationAxisEntity = NULL, const core::Ptr& customSlideDirectionEntity = NULL); + + /// Redefines the relationship between the two joint geometries as a planar joint. + /// To use this method, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + /// normalDirection : Defines the direction of the normal of the single degree of rotation. + /// This can be set to XAxisJointDirection, YAxisJointDirection, ZAxisJointDirection, + /// or CustomJointDirection. If set to CustomJointDirection then the customNormalDirectionEntity + /// argument must also be provided. + /// customNormalDirectionEntity : If the normalDirection is CustomJointDirection this argument is used to specify the entity that defines + /// the direction of the normal. This can be several types of entities that can define a direction. + /// customPrimarySlideDirection : This arguments defines the direction of the primary slide direction. A default primary slide direction + /// is automatically chosen and will be used if this argument is not provided or is null. The secondary slide + /// direction is automatically inferred from the normal and primary slide directions. + /// Returns true if the operation was successful. + bool setAsPlanarJointMotion(JointDirections normalDirection, const core::Ptr& customNormalDirectionEntity = NULL, const core::Ptr& customPrimarySlideDirection = NULL); + + /// Redefines the relationship between the two joint geometries as a ball joint. + /// To use this method, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + /// pitchDirection : Defines the direction the pitch angle is measured from. This can be ZAxisJointDirection or CustomJointDirection. If + /// CustomJointDirection is specified then you must also provide a value for the customPitchDirection argument. + /// yawDirection : Defines the direction the yaw is measured from. This can be XAxisJointDirection or CustomJointDirection. If + /// CustomJointDirection is specified then you must also provide a value for the customYawDirection argument. + /// customPitchDirection : If the pitchDirection argument is customPitchDirection this argument is used to define the direction the pitch + /// angel is measured from. This can be several types of entities that can define a direction. + /// customYawDirection : If the yawDirection argument is customPitchDirection this argument is used to define the direction the yaw + /// angel is measured from. This can be several types of entities that can define a direction. + /// Returns true if the operation was successful. + bool setAsBallJointMotion(JointDirections pitchDirection, JointDirections yawDirection, const core::Ptr& customPitchDirection = NULL, const core::Ptr& customYawDirection = NULL); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this object + /// in an assembly. This is only valid in the case where this is acting + /// as a proxy in an assembly. Returns null in the case where the object + /// is not in the context of an assembly but is already the native object. + core::Ptr assemblyContext() const; + + /// Gets and sets if this joint is suppressed. + bool isSuppressed() const; + bool isSuppressed(bool value); + + /// Gets and sets if the light bulb of this joint as displayed in the browser is on or off. + /// A joint will only be visible if the light bulb is switched on. However, + /// the light bulb can be on and the joint still invisible if a higher level occurrence + /// in the assembly context is not visible because its light bulb is off or the joints folder + /// is light bulb is off. + bool isLightBulbOn() const; + bool isLightBulbOn(bool value); + + /// Gets whether the joint is visible. To change the visibility see the isLightBulbOn property. + /// This property is affected by the assembly context. + bool isVisible() const; + + /// Returns the collection of attributes associated with this joint. + core::Ptr attributes() const; + + /// Returns the current health state of the joint. + FeatureHealthStates healthState() const; + + /// Returns the error or warning message in the case where the healthState property returns either + /// WarningFeatureHealthState or ErrorFeatureHealthState. Otherwise this property returns an empty string. + std::string errorOrWarningMessage() const; + + /// Returns the first of two occurrences that this joint defines a relationship between. This is the occurrence + /// that can also be found through the geometryOrOriginOne property. + core::Ptr occurrenceOne() const; + + /// Returns the first of two occurrences that this joint defines a relationship between. This is the occurrence + /// that can also be found through the geometryOrOriginTwo property. + core::Ptr occurrenceTwo() const; + + /// Gets and sets if the joint is locked. + bool isLocked() const; + bool isLocked(bool value); + + /// Returns a token for the Joint object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same joint. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + ADSK_FUSION_JOINT_API static const char* classType(); + ADSK_FUSION_JOINT_API const char* objectType() const override; + ADSK_FUSION_JOINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_JOINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Component* parentComponent_raw() const = 0; + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual core::Base* geometryOrOriginOne_raw() const = 0; + virtual bool geometryOrOriginOne_raw(core::Base* value) = 0; + virtual core::Base* geometryOrOriginTwo_raw() const = 0; + virtual bool geometryOrOriginTwo_raw(core::Base* value) = 0; + virtual ModelParameter* angle_raw() const = 0; + virtual ModelParameter* offset_raw() const = 0; + virtual bool isFlipped_raw() const = 0; + virtual bool isFlipped_raw(bool value) = 0; + virtual JointMotion* jointMotion_raw() const = 0; + virtual bool deleteMe_raw() = 0; + virtual TimelineObject* timelineObject_raw() const = 0; + virtual bool setAsRigidJointMotion_raw() = 0; + virtual bool setAsRevoluteJointMotion_raw(JointDirections rotationAxis, core::Base* customRotationAxisEntity) = 0; + virtual bool setAsSliderJointMotion_raw(JointDirections sliderDirection, core::Base* customSliderDirectionEntity) = 0; + virtual bool setAsCylindricalJointMotion_raw(JointDirections rotationAxis, core::Base* customRotationAxisEntity) = 0; + virtual bool setAsPinSlotJointMotion_raw(JointDirections rotationAxis, JointDirections slideDirection, core::Base* customRotationAxisEntity, core::Base* customSlideDirectionEntity) = 0; + virtual bool setAsPlanarJointMotion_raw(JointDirections normalDirection, core::Base* customNormalDirectionEntity, core::Base* customPrimarySlideDirection) = 0; + virtual bool setAsBallJointMotion_raw(JointDirections pitchDirection, JointDirections yawDirection, core::Base* customPitchDirection, core::Base* customYawDirection) = 0; + virtual Joint* nativeObject_raw() const = 0; + virtual Joint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual bool isSuppressed_raw() const = 0; + virtual bool isSuppressed_raw(bool value) = 0; + virtual bool isLightBulbOn_raw() const = 0; + virtual bool isLightBulbOn_raw(bool value) = 0; + virtual bool isVisible_raw() const = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual FeatureHealthStates healthState_raw() const = 0; + virtual char* errorOrWarningMessage_raw() const = 0; + virtual Occurrence* occurrenceOne_raw() const = 0; + virtual Occurrence* occurrenceTwo_raw() const = 0; + virtual bool isLocked_raw() const = 0; + virtual bool isLocked_raw(bool value) = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr Joint::parentComponent() const +{ + core::Ptr res = parentComponent_raw(); + return res; +} + +inline std::string Joint::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool Joint::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline core::Ptr Joint::geometryOrOriginOne() const +{ + core::Ptr res = geometryOrOriginOne_raw(); + return res; +} + +inline bool Joint::geometryOrOriginOne(const core::Ptr& value) +{ + return geometryOrOriginOne_raw(value.get()); +} + +inline core::Ptr Joint::geometryOrOriginTwo() const +{ + core::Ptr res = geometryOrOriginTwo_raw(); + return res; +} + +inline bool Joint::geometryOrOriginTwo(const core::Ptr& value) +{ + return geometryOrOriginTwo_raw(value.get()); +} + +inline core::Ptr Joint::angle() const +{ + core::Ptr res = angle_raw(); + return res; +} + +inline core::Ptr Joint::offset() const +{ + core::Ptr res = offset_raw(); + return res; +} + +inline bool Joint::isFlipped() const +{ + bool res = isFlipped_raw(); + return res; +} + +inline bool Joint::isFlipped(bool value) +{ + return isFlipped_raw(value); +} + +inline core::Ptr Joint::jointMotion() const +{ + core::Ptr res = jointMotion_raw(); + return res; +} + +inline bool Joint::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline core::Ptr Joint::timelineObject() const +{ + core::Ptr res = timelineObject_raw(); + return res; +} + +inline bool Joint::setAsRigidJointMotion() +{ + bool res = setAsRigidJointMotion_raw(); + return res; +} + +inline bool Joint::setAsRevoluteJointMotion(JointDirections rotationAxis, const core::Ptr& customRotationAxisEntity) +{ + bool res = setAsRevoluteJointMotion_raw(rotationAxis, customRotationAxisEntity.get()); + return res; +} + +inline bool Joint::setAsSliderJointMotion(JointDirections sliderDirection, const core::Ptr& customSliderDirectionEntity) +{ + bool res = setAsSliderJointMotion_raw(sliderDirection, customSliderDirectionEntity.get()); + return res; +} + +inline bool Joint::setAsCylindricalJointMotion(JointDirections rotationAxis, const core::Ptr& customRotationAxisEntity) +{ + bool res = setAsCylindricalJointMotion_raw(rotationAxis, customRotationAxisEntity.get()); + return res; +} + +inline bool Joint::setAsPinSlotJointMotion(JointDirections rotationAxis, JointDirections slideDirection, const core::Ptr& customRotationAxisEntity, const core::Ptr& customSlideDirectionEntity) +{ + bool res = setAsPinSlotJointMotion_raw(rotationAxis, slideDirection, customRotationAxisEntity.get(), customSlideDirectionEntity.get()); + return res; +} + +inline bool Joint::setAsPlanarJointMotion(JointDirections normalDirection, const core::Ptr& customNormalDirectionEntity, const core::Ptr& customPrimarySlideDirection) +{ + bool res = setAsPlanarJointMotion_raw(normalDirection, customNormalDirectionEntity.get(), customPrimarySlideDirection.get()); + return res; +} + +inline bool Joint::setAsBallJointMotion(JointDirections pitchDirection, JointDirections yawDirection, const core::Ptr& customPitchDirection, const core::Ptr& customYawDirection) +{ + bool res = setAsBallJointMotion_raw(pitchDirection, yawDirection, customPitchDirection.get(), customYawDirection.get()); + return res; +} + +inline core::Ptr Joint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr Joint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr Joint::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline bool Joint::isSuppressed() const +{ + bool res = isSuppressed_raw(); + return res; +} + +inline bool Joint::isSuppressed(bool value) +{ + return isSuppressed_raw(value); +} + +inline bool Joint::isLightBulbOn() const +{ + bool res = isLightBulbOn_raw(); + return res; +} + +inline bool Joint::isLightBulbOn(bool value) +{ + return isLightBulbOn_raw(value); +} + +inline bool Joint::isVisible() const +{ + bool res = isVisible_raw(); + return res; +} + +inline core::Ptr Joint::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline FeatureHealthStates Joint::healthState() const +{ + FeatureHealthStates res = healthState_raw(); + return res; +} + +inline std::string Joint::errorOrWarningMessage() const +{ + std::string res; + + char* p= errorOrWarningMessage_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline core::Ptr Joint::occurrenceOne() const +{ + core::Ptr res = occurrenceOne_raw(); + return res; +} + +inline core::Ptr Joint::occurrenceTwo() const +{ + core::Ptr res = occurrenceTwo_raw(); + return res; +} + +inline bool Joint::isLocked() const +{ + bool res = isLocked_raw(); + return res; +} + +inline bool Joint::isLocked(bool value) +{ + return isLocked_raw(value); +} + +inline std::string Joint::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_JOINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/JointGeometry.h b/usr/autodesk/CPP/include/Fusion/Components/JointGeometry.h new file mode 100644 index 0000000..7a82b07 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/JointGeometry.h @@ -0,0 +1,291 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_JOINTGEOMETRY_CPP__ +# define ADSK_FUSION_JOINTGEOMETRY_API XI_EXPORT +# else +# define ADSK_FUSION_JOINTGEOMETRY_API +# endif +#else +# define ADSK_FUSION_JOINTGEOMETRY_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepEdge; + class BRepFace; + class Profile; + class SketchCurve; +}} +namespace adsk { namespace core { + class Point3D; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// A transient object used to define and query the geometric input of a joint and the resulting coordinate +/// system it defines. New JointGeometry objects are created using its various static create methods and +/// are then used as input to the Joints.createInput method. +class JointGeometry : public core::Base { +public: + + /// Creates a new transient JointGeometry object based on a planar BRepFace object. A JointGeometry + /// object can be used to create a joint or joint origin. + /// face : The planar BRepFace object + /// edge : A BRepEdge edge object that is one of the edges of the specified face. This argument can be + /// null in the case where the keyPointType is CenterKeypoint indicating the center of the face + /// is to be used. When an edge is used, the keyPointType specifies the position along the edge + /// for the keypoint. + /// keyPointType : Specifies the position along the edge where the joint keypoint will be located. For open edges + /// this can be StartKeyPoint, MiddleKeyPoint, or EndKeyPoint. For closed edges (i.e. circles), it + /// must be CenterKeyPoint. When no edge is specified, it must be CenterKeyPoint indicating the center + /// of area of the face is to be used. + /// Returns the transient JointGeometry object that can be used to create a joint or joint origin or null in case of a failure. + static core::Ptr createByPlanarFace(const core::Ptr& face, const core::Ptr& edge, JointKeyPointTypes keyPointType); + + /// Creates a new transient JointGeometry object based on a non-planar analytical BRepFace object. This is limited + /// to cylinders, cones, spheres, and tori. A JointGeometry object can be used to create a joint or joint origin. + /// face : The cylindrical, conical, spherical, or toroidal BRepFace object. + /// keyPointType : Specifies the position relative to the input face where joint keypoint will be located. For cylinders + /// and cones this can be StartKeyPoint, MiddleKeyPoint, or EndKeyPoint. For spheres and tori this must be + /// CenterKeyPoint. + /// Returns the transient JointGeometry object that can be used to create a joint or joint origin or null in case of a failure. + static core::Ptr createByNonPlanarFace(const core::Ptr& face, JointKeyPointTypes keyPointType); + + /// Creates a new transient JointGeometry object based on a planar BRepFace object. A JointGeometry + /// object can be used to create a joint or joint origin. + /// profile : The Profile object. + /// sketchCurve : A sketch curve that is part of the input profile. This argument can be + /// null in the case where the keyPointType is CenterKeypoint indicating the center of the profile + /// is to be used. When a curve is used, the keyPointType specifies the position along the curve + /// for the keypoint. + /// keyPointType : Specifies the position along the curve where the joint keypoint will be located. For open curves (lines, arcs, elliptical arcs, and open splines) + /// this can be StartKeyPoint, MiddleKeyPoint, or EndKeyPoint. For closed analytic (circles and ellipses), it + /// must be CenterKeyPoint. When no curve is specified, it must be CenterKeyPoint indicating the center + /// of area of the profile is to be used. + /// Returns the transient JointGeometry object that can be used to create a joint or joint origin or null in case of a failure. + static core::Ptr createByProfile(const core::Ptr& profile, const core::Ptr& sketchCurve, JointKeyPointTypes keyPointType); + + /// Creates a new transient JointGeometry object using a BRepEdge or SketchCurve as input. A JointGeometry + /// object can be used to create a joint or joint origin. + /// curve : Input BRepEdge or SketchCurve. + /// keyPointType : The position on the curve where to position the joint coordinate system. For any open curves + /// the valid types are StartKeyPoint, MiddleKeyPoint, CenterKeyPoint and EndKeyPoint. For circular and elliptical + /// shaped curves the option is CenterKeyPoint. For closed spline curves either StartKeyPoint or + /// EndKeyPoint can be used and the result is the same. + /// Returns the transient JointGeometry object that can be used to create a joint or joint origin or null in case of a failure. + static core::Ptr createByCurve(const core::Ptr& curve, JointKeyPointTypes keyPointType); + + /// Creates a new transient JointGeometry object using a ConstructionPoint, SketchPoint or BRepVertex as input. + /// A JointGeometry object can be used to create a joint or joint origin. + /// point : The ConstructionPoint, SketchPoint or BRepVertex object. + /// Returns the transient JointGeometry object that can be used to create a joint or joint origin or null in case of a failure. + static core::Ptr createByPoint(const core::Ptr& point); + + /// Returns the type of geometry this JointGeometry object represents. + JointGeometryTypes geometryType() const; + + /// Returns the keypoint type this JointGeometry is using. + JointKeyPointTypes keyPointType() const; + + /// The first entity that's defining this joint geometry. This can be various types of geometry depending + /// on how this joint geometry is defined. The geometryType property indicates how this joint geometry is + /// defined a provides a clue about the type of geometry to expect back from this property. + core::Ptr entityOne() const; + + /// This is the second entity that defines this joint geometry. This isn't used for all joint geometry types + /// and will return null in the cases where it's not used. A second geometry is used in the case where the geometryType + /// property returns JointProfileGeometry, JointPlanarBRepFaceGeometry, JointBetweenTwoFacesGeometry or JointByTwoEdgeIntersectionGeometry. + core::Ptr entityTwo() const; + + /// Returns the origin point that's been calculated for this joint geometry. + core::Ptr origin() const; + + /// Returns the direction of the primary axis that's been calculated for this joint geometry. + /// Conceptually, this is the X-axis of the computed coordinate system. + core::Ptr primaryAxisVector() const; + + /// Returns the direction of the secondary axis that's been calculated for this joint geometry. + /// Conceptually, this is the Y-axis of the computed coordinate system. + core::Ptr secondaryAxisVector() const; + + /// Returns the direction of the third axis that's been calculated for this joint geometry. + /// Conceptually, this is the Z-axis of the computed coordinate system. + core::Ptr thirdAxisVector() const; + + /// Creates a new transient JointGeometry object based on a plane bisecting the two input planes. + /// planeOne : The first planar entity that the joint origin will be created between. This can be a planar BRepFace + /// or a ConstructionPlane object. + /// planeTwo : The second planar entity that the joint origin will be created between. This can be a planar BRepFace + /// or a ConstructionPlane object. + /// entityOne : Specifies the entity that is used to define the keypoint. This can be many types of geometry including + /// edges, planar and non-planar faces, profiles, and sketch geometry. + /// entityTwo : If the entityOne argument is a planar BRepFace or a Profile, then this argument specifies either + /// an edge on the face or a sketch curve on the profile. For a planar face this argument is optional in the + /// case where the keyPointType argument is CenterKeyPoint indicating the center of area of the face is to be used. + /// keyPointType : Specifies the position on the keyPointGeometry where the keypoint will be defined. This keypoint is then + /// projected onto the plane to define the position of the joint geometry. + /// The values that are valid for this argument depend on the type of geometry specified for the geometry and edgeOrCurve + /// arguments. + /// If the geometry argument is a planar face and the edgeOrCurve argument is an open BRepEdge object + /// then this can be StartKeyPoint, MiddleKeyPoint, or EndKeyPoint. If the geometry argument is a planar face and the edgeOrCurve argument + /// is a closed BRepEdge object (i.e. circles), it must be CenterKeyPoint. If the geometry argument is a planar face and + /// the edgeOrCurve argument is null, then this must be CenterKeyPoint indicating the center of area of the face. + /// If the geometry argument is a non-planar face (cylinder, cone, sphere, or torus) this can be StartKeyPoint, MiddleKeyPoint, or EndKeyPoint + /// for cylinders and cones but must be CenterKeyPoint for spheres and tori. The edgeOrCurve argument is ignored in this case. + /// If the geometry argument is a profile and the edgeOrCurve argument is null this can be CenterKeyPoint indicating the center of area + /// of the profile. If the geometry argument is a profile and the edgeOrCurve argument is an open sketch curve on the profile + /// then this can be StartKeyPoint, MiddleKeyPoint, or EndKeyPoint. If the geometry argument is a profile and the edgeOrCurve argument + /// is a closed sketch curve (i.e. circles), it must be CenterKeyPoint. + /// Returns the transient JointGeometry object that can be used to create a joint or joint origin or null in case of a failure. + static core::Ptr createByBetweenTwoPlanes(const core::Ptr& planeOne, const core::Ptr& planeTwo, const core::Ptr& entityOne, const core::Ptr& entityTwo, JointKeyPointTypes keyPointType); + + /// Returns the first plane for joint geometry that is defined between two planes. Returns null in all other cases. + core::Ptr planeOne() const; + + /// Returns the second plane for joint geometry that is defined between two planes. Returns null in all other cases. + core::Ptr planeTwo() const; + + ADSK_FUSION_JOINTGEOMETRY_API static const char* classType(); + ADSK_FUSION_JOINTGEOMETRY_API const char* objectType() const override; + ADSK_FUSION_JOINTGEOMETRY_API void* queryInterface(const char* id) const override; + ADSK_FUSION_JOINTGEOMETRY_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_JOINTGEOMETRY_API static JointGeometry* createByPlanarFace_raw(BRepFace* face, BRepEdge* edge, JointKeyPointTypes keyPointType); + ADSK_FUSION_JOINTGEOMETRY_API static JointGeometry* createByNonPlanarFace_raw(BRepFace* face, JointKeyPointTypes keyPointType); + ADSK_FUSION_JOINTGEOMETRY_API static JointGeometry* createByProfile_raw(Profile* profile, SketchCurve* sketchCurve, JointKeyPointTypes keyPointType); + ADSK_FUSION_JOINTGEOMETRY_API static JointGeometry* createByCurve_raw(core::Base* curve, JointKeyPointTypes keyPointType); + ADSK_FUSION_JOINTGEOMETRY_API static JointGeometry* createByPoint_raw(core::Base* point); + virtual JointGeometryTypes geometryType_raw() const = 0; + virtual JointKeyPointTypes keyPointType_raw() const = 0; + virtual core::Base* entityOne_raw() const = 0; + virtual core::Base* entityTwo_raw() const = 0; + virtual core::Point3D* origin_raw() const = 0; + virtual core::Vector3D* primaryAxisVector_raw() const = 0; + virtual core::Vector3D* secondaryAxisVector_raw() const = 0; + virtual core::Vector3D* thirdAxisVector_raw() const = 0; + ADSK_FUSION_JOINTGEOMETRY_API static JointGeometry* createByBetweenTwoPlanes_raw(core::Base* planeOne, core::Base* planeTwo, core::Base* entityOne, core::Base* entityTwo, JointKeyPointTypes keyPointType); + virtual core::Base* planeOne_raw() const = 0; + virtual core::Base* planeTwo_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr JointGeometry::createByPlanarFace(const core::Ptr& face, const core::Ptr& edge, JointKeyPointTypes keyPointType) +{ + core::Ptr res = createByPlanarFace_raw(face.get(), edge.get(), keyPointType); + return res; +} + +inline core::Ptr JointGeometry::createByNonPlanarFace(const core::Ptr& face, JointKeyPointTypes keyPointType) +{ + core::Ptr res = createByNonPlanarFace_raw(face.get(), keyPointType); + return res; +} + +inline core::Ptr JointGeometry::createByProfile(const core::Ptr& profile, const core::Ptr& sketchCurve, JointKeyPointTypes keyPointType) +{ + core::Ptr res = createByProfile_raw(profile.get(), sketchCurve.get(), keyPointType); + return res; +} + +inline core::Ptr JointGeometry::createByCurve(const core::Ptr& curve, JointKeyPointTypes keyPointType) +{ + core::Ptr res = createByCurve_raw(curve.get(), keyPointType); + return res; +} + +inline core::Ptr JointGeometry::createByPoint(const core::Ptr& point) +{ + core::Ptr res = createByPoint_raw(point.get()); + return res; +} + +inline JointGeometryTypes JointGeometry::geometryType() const +{ + JointGeometryTypes res = geometryType_raw(); + return res; +} + +inline JointKeyPointTypes JointGeometry::keyPointType() const +{ + JointKeyPointTypes res = keyPointType_raw(); + return res; +} + +inline core::Ptr JointGeometry::entityOne() const +{ + core::Ptr res = entityOne_raw(); + return res; +} + +inline core::Ptr JointGeometry::entityTwo() const +{ + core::Ptr res = entityTwo_raw(); + return res; +} + +inline core::Ptr JointGeometry::origin() const +{ + core::Ptr res = origin_raw(); + return res; +} + +inline core::Ptr JointGeometry::primaryAxisVector() const +{ + core::Ptr res = primaryAxisVector_raw(); + return res; +} + +inline core::Ptr JointGeometry::secondaryAxisVector() const +{ + core::Ptr res = secondaryAxisVector_raw(); + return res; +} + +inline core::Ptr JointGeometry::thirdAxisVector() const +{ + core::Ptr res = thirdAxisVector_raw(); + return res; +} + +inline core::Ptr JointGeometry::createByBetweenTwoPlanes(const core::Ptr& planeOne, const core::Ptr& planeTwo, const core::Ptr& entityOne, const core::Ptr& entityTwo, JointKeyPointTypes keyPointType) +{ + core::Ptr res = createByBetweenTwoPlanes_raw(planeOne.get(), planeTwo.get(), entityOne.get(), entityTwo.get(), keyPointType); + return res; +} + +inline core::Ptr JointGeometry::planeOne() const +{ + core::Ptr res = planeOne_raw(); + return res; +} + +inline core::Ptr JointGeometry::planeTwo() const +{ + core::Ptr res = planeTwo_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_JOINTGEOMETRY_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/JointInput.h b/usr/autodesk/CPP/include/Fusion/Components/JointInput.h new file mode 100644 index 0000000..bfc46f5 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/JointInput.h @@ -0,0 +1,281 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_JOINTINPUT_CPP__ +# define ADSK_FUSION_JOINTINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_JOINTINPUT_API +# endif +#else +# define ADSK_FUSION_JOINTINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class JointMotion; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Defines all of the information required to create a new joint. This object provides +/// equivalent functionality to the Joint command dialog in that it gathers the required +/// information to create a joint. +class JointInput : public core::Base { +public: + + /// Gets and sets the first JointGeometry or JointOrigin for this joint. + core::Ptr geometryOrOriginOne() const; + bool geometryOrOriginOne(const core::Ptr& value); + + /// Gets and sets the second JointGeometry or JointOrigin for this joint. + core::Ptr geometryOrOriginTwo() const; + bool geometryOrOriginTwo(const core::Ptr& value); + + /// Specifies the angle between two input geometries. This is effectively the + /// angle between the two primary axes of the input geometries. When a new + /// JointInput object is created, this value defaults to zero. When the joint + /// is created this will become the value of the parameter that controls the joint angle. + /// When using a real value to define the angle, the value is in radians. When + /// using a string the expression is evaluated using the document default units for angles. + core::Ptr angle() const; + bool angle(const core::Ptr& value); + + /// Specifies the offset between two input geometries. This is effectively the + /// offset distance between the two planes defined by the primary and secondary axes + /// of the input geometries. When a new JointInput object is created, this value defaults to zero. + /// When the joint is created this will become the value of the parameter that controls the joint offset. + /// When using a real value to define the offset, the value is in centimeters. When + /// using a string the expression is evaluated using the document default units for distance. + core::Ptr offset() const; + bool offset(const core::Ptr& value); + + /// Gets and sets if the joint direction is flipped or not. This is effectively + /// specifying if the third axis of the two input geometries is facing (false) or + /// opposed (true). + bool isFlipped() const; + bool isFlipped(bool value); + + /// Defines the relationship between the two joint geometries as a rigid joint. + /// Returns true if successful. + bool setAsRigidJointMotion(); + + /// Defines the relationship between the two joint geometries as a revolute joint. + /// rotationAxis : Specifies which axis the rotation is around. If this is set to CustomJointDirection then the + /// customRotationAxisEntity argument must also be provided. + /// customRotationAxisEntity : If the rotationAxis is customAxisEntity this argument is used to specify the entity that defines + /// the custom axis of rotation. This can be several types of entities that an axis can be derived + /// from. + /// Returns true if the operation was successful. + bool setAsRevoluteJointMotion(JointDirections rotationAxis, const core::Ptr& customRotationAxisEntity = NULL); + + /// Defines the relationship between the two joint geometries as a slider joint. + /// sliderDirection : Specifies which axis the slide direction is along. If this is set to CustomJointDirection then the + /// customSliderDirectionEntity argument must also be provided. + /// customSliderDirectionEntity : If the sliderDirection is CustomJointDirection this argument is used to specify the entity that defines + /// the custom slider direction. This can be several types of entities that can define a direction. + /// Returns true if the operation was successful. + bool setAsSliderJointMotion(JointDirections sliderDirection, const core::Ptr& customSliderDirectionEntity = NULL); + + /// Defines the relationship between the two joint geometries as a cylindrical joint. + /// rotationAxis : Specifies which axis the rotation is around. If this is set to CustomJointDirection then the + /// customRotationAxisEntity argument must also be provided. + /// customRotationAxisEntity : If the rotationAxis is customAxisEntity this argument is used to specify the entity that defines + /// the custom axis of rotation. This can be several types of entities that an axis can be derived + /// from. + /// Returns true if the operation was successful. + bool setAsCylindricalJointMotion(JointDirections rotationAxis, const core::Ptr& customRotationAxisEntity = NULL); + + /// Defines the relationship between the two joint geometries as a pin-slot joint. + /// rotationAxis : Specifies which axis the rotation is around. If this is set to CustomJointDirection then the + /// customRotationAxisEntity argument must also be provided. + /// slideDirection : Specifies which axis the slide direction is along. If this is set to CustomJointDirection then the + /// customSlideDirectionEntity argument must also be provided. + /// customRotationAxisEntity : If the rotationAxis is customAxisEntity this argument is used to specify the entity that defines + /// the custom axis of rotation. This can be several types of entities that an axis can be derived + /// customSlideDirectionEntity : If the slideDirection is CustomJointDirection this argument is used to specify the entity that defines + /// the custom slide direction. This can be several types of entities that can define a direction. + /// Returns true if the operation was successful. + bool setAsPinSlotJointMotion(JointDirections rotationAxis, JointDirections slideDirection, const core::Ptr& customRotationAxisEntity = NULL, const core::Ptr& customSlideDirectionEntity = NULL); + + /// Defines the relationship between the two joint geometries as a planar joint. + /// normalDirection : Defines the direction of the normal of the single degree of rotation. + /// This can be set to XAxisJointDirection, YAxisJointDirection, ZAxisJointDirection, + /// or CustomJointDirection. If set to CustomJointDirection then the customNormalDirectionEntity + /// argument must also be provided. + /// customNormalDirectionEntity : If the normalDirection is CustomJointDirection this argument is used to specify the entity that defines + /// the direction of the normal. This can be several types of entities that can define a direction. + /// customPrimarySlideDirection : This arguments defines the direction of the primary slide direction. A default primary slide direction + /// is automatically chosen and will be used if this argument is not provided or is null. The secondary slide + /// direction is automatically inferred from the normal and primary slide directions. + /// Returns true if the operation was successful. + bool setAsPlanarJointMotion(JointDirections normalDirection, const core::Ptr& customNormalDirectionEntity = NULL, const core::Ptr& customPrimarySlideDirection = NULL); + + /// Defines the relationship between the two joint geometries as a ball joint. + /// pitchDirection : Defines the direction the pitch angle is measured from. This can be ZAxisJointDirection or CustomJointDirection. If + /// CustomJointDirection is specified then you must also provide a value for the customPitchDirection argument. + /// yawDirection : Defines the direction the yaw is measured from. This can be XAxisJointDirection or CustomJointDirection. If + /// CustomJointDirection is specified then you must also provide a value for the customYawDirection argument. + /// customPitchDirection : If the pitchDirection argument is customPitchDirection this argument is used to define the direction the pitch + /// angel is measured from. This can be several types of entities that can define a direction. + /// customYawDirection : If the yawDirection argument is customPitchDirection this argument is used to define the direction the yaw + /// angel is measured from. This can be several types of entities that can define a direction. + /// Returns true if the operation was successful. + bool setAsBallJointMotion(JointDirections pitchDirection, JointDirections yawDirection, const core::Ptr& customPitchDirection = NULL, const core::Ptr& customYawDirection = NULL); + + /// Returns an object derived from JointMotion that defines how the motion between the two joint geometries is defined. + core::Ptr jointMotion() const; + + ADSK_FUSION_JOINTINPUT_API static const char* classType(); + ADSK_FUSION_JOINTINPUT_API const char* objectType() const override; + ADSK_FUSION_JOINTINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_JOINTINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* geometryOrOriginOne_raw() const = 0; + virtual bool geometryOrOriginOne_raw(core::Base* value) = 0; + virtual core::Base* geometryOrOriginTwo_raw() const = 0; + virtual bool geometryOrOriginTwo_raw(core::Base* value) = 0; + virtual core::ValueInput* angle_raw() const = 0; + virtual bool angle_raw(core::ValueInput* value) = 0; + virtual core::ValueInput* offset_raw() const = 0; + virtual bool offset_raw(core::ValueInput* value) = 0; + virtual bool isFlipped_raw() const = 0; + virtual bool isFlipped_raw(bool value) = 0; + virtual bool setAsRigidJointMotion_raw() = 0; + virtual bool setAsRevoluteJointMotion_raw(JointDirections rotationAxis, core::Base* customRotationAxisEntity) = 0; + virtual bool setAsSliderJointMotion_raw(JointDirections sliderDirection, core::Base* customSliderDirectionEntity) = 0; + virtual bool setAsCylindricalJointMotion_raw(JointDirections rotationAxis, core::Base* customRotationAxisEntity) = 0; + virtual bool setAsPinSlotJointMotion_raw(JointDirections rotationAxis, JointDirections slideDirection, core::Base* customRotationAxisEntity, core::Base* customSlideDirectionEntity) = 0; + virtual bool setAsPlanarJointMotion_raw(JointDirections normalDirection, core::Base* customNormalDirectionEntity, core::Base* customPrimarySlideDirection) = 0; + virtual bool setAsBallJointMotion_raw(JointDirections pitchDirection, JointDirections yawDirection, core::Base* customPitchDirection, core::Base* customYawDirection) = 0; + virtual JointMotion* jointMotion_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr JointInput::geometryOrOriginOne() const +{ + core::Ptr res = geometryOrOriginOne_raw(); + return res; +} + +inline bool JointInput::geometryOrOriginOne(const core::Ptr& value) +{ + return geometryOrOriginOne_raw(value.get()); +} + +inline core::Ptr JointInput::geometryOrOriginTwo() const +{ + core::Ptr res = geometryOrOriginTwo_raw(); + return res; +} + +inline bool JointInput::geometryOrOriginTwo(const core::Ptr& value) +{ + return geometryOrOriginTwo_raw(value.get()); +} + +inline core::Ptr JointInput::angle() const +{ + core::Ptr res = angle_raw(); + return res; +} + +inline bool JointInput::angle(const core::Ptr& value) +{ + return angle_raw(value.get()); +} + +inline core::Ptr JointInput::offset() const +{ + core::Ptr res = offset_raw(); + return res; +} + +inline bool JointInput::offset(const core::Ptr& value) +{ + return offset_raw(value.get()); +} + +inline bool JointInput::isFlipped() const +{ + bool res = isFlipped_raw(); + return res; +} + +inline bool JointInput::isFlipped(bool value) +{ + return isFlipped_raw(value); +} + +inline bool JointInput::setAsRigidJointMotion() +{ + bool res = setAsRigidJointMotion_raw(); + return res; +} + +inline bool JointInput::setAsRevoluteJointMotion(JointDirections rotationAxis, const core::Ptr& customRotationAxisEntity) +{ + bool res = setAsRevoluteJointMotion_raw(rotationAxis, customRotationAxisEntity.get()); + return res; +} + +inline bool JointInput::setAsSliderJointMotion(JointDirections sliderDirection, const core::Ptr& customSliderDirectionEntity) +{ + bool res = setAsSliderJointMotion_raw(sliderDirection, customSliderDirectionEntity.get()); + return res; +} + +inline bool JointInput::setAsCylindricalJointMotion(JointDirections rotationAxis, const core::Ptr& customRotationAxisEntity) +{ + bool res = setAsCylindricalJointMotion_raw(rotationAxis, customRotationAxisEntity.get()); + return res; +} + +inline bool JointInput::setAsPinSlotJointMotion(JointDirections rotationAxis, JointDirections slideDirection, const core::Ptr& customRotationAxisEntity, const core::Ptr& customSlideDirectionEntity) +{ + bool res = setAsPinSlotJointMotion_raw(rotationAxis, slideDirection, customRotationAxisEntity.get(), customSlideDirectionEntity.get()); + return res; +} + +inline bool JointInput::setAsPlanarJointMotion(JointDirections normalDirection, const core::Ptr& customNormalDirectionEntity, const core::Ptr& customPrimarySlideDirection) +{ + bool res = setAsPlanarJointMotion_raw(normalDirection, customNormalDirectionEntity.get(), customPrimarySlideDirection.get()); + return res; +} + +inline bool JointInput::setAsBallJointMotion(JointDirections pitchDirection, JointDirections yawDirection, const core::Ptr& customPitchDirection, const core::Ptr& customYawDirection) +{ + bool res = setAsBallJointMotion_raw(pitchDirection, yawDirection, customPitchDirection.get(), customYawDirection.get()); + return res; +} + +inline core::Ptr JointInput::jointMotion() const +{ + core::Ptr res = jointMotion_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_JOINTINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/JointLimits.h b/usr/autodesk/CPP/include/Fusion/Components/JointLimits.h new file mode 100644 index 0000000..82254d5 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/JointLimits.h @@ -0,0 +1,157 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_JOINTLIMITS_CPP__ +# define ADSK_FUSION_JOINTLIMITS_API XI_EXPORT +# else +# define ADSK_FUSION_JOINTLIMITS_API +# endif +#else +# define ADSK_FUSION_JOINTLIMITS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Used to define limits for the range of motion of a joint. +class JointLimits : public core::Base { +public: + + /// The minimum value of the value. This is in either centimeters + /// or radians depending on if the joint value this is associated with + /// defines a distance or an angle. + double minimumValue() const; + bool minimumValue(double value); + + /// The maximum value of the value. This is in either centimeters + /// or radians depending on if the joint value this is associated with + /// defines a distance or an angle. + double maximumValue() const; + bool maximumValue(double value); + + /// The resting state value. This is in either centimeters + /// or radians depending on if the joint value this is associated with + /// defines a distance or an angle. + double restValue() const; + bool restValue(double value); + + /// Gets and sets whether the minimum joint limit is enabled or not. + bool isMinimumValueEnabled() const; + bool isMinimumValueEnabled(bool value); + + /// Gets and sets whether the maximum joint limit is enabled or not. + bool isMaximumValueEnabled() const; + bool isMaximumValueEnabled(bool value); + + /// Gets and sets whether the resting joint value is enabled or not. + bool isRestValueEnabled() const; + bool isRestValueEnabled(bool value); + + ADSK_FUSION_JOINTLIMITS_API static const char* classType(); + ADSK_FUSION_JOINTLIMITS_API const char* objectType() const override; + ADSK_FUSION_JOINTLIMITS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_JOINTLIMITS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual double minimumValue_raw() const = 0; + virtual bool minimumValue_raw(double value) = 0; + virtual double maximumValue_raw() const = 0; + virtual bool maximumValue_raw(double value) = 0; + virtual double restValue_raw() const = 0; + virtual bool restValue_raw(double value) = 0; + virtual bool isMinimumValueEnabled_raw() const = 0; + virtual bool isMinimumValueEnabled_raw(bool value) = 0; + virtual bool isMaximumValueEnabled_raw() const = 0; + virtual bool isMaximumValueEnabled_raw(bool value) = 0; + virtual bool isRestValueEnabled_raw() const = 0; + virtual bool isRestValueEnabled_raw(bool value) = 0; +}; + +// Inline wrappers + +inline double JointLimits::minimumValue() const +{ + double res = minimumValue_raw(); + return res; +} + +inline bool JointLimits::minimumValue(double value) +{ + return minimumValue_raw(value); +} + +inline double JointLimits::maximumValue() const +{ + double res = maximumValue_raw(); + return res; +} + +inline bool JointLimits::maximumValue(double value) +{ + return maximumValue_raw(value); +} + +inline double JointLimits::restValue() const +{ + double res = restValue_raw(); + return res; +} + +inline bool JointLimits::restValue(double value) +{ + return restValue_raw(value); +} + +inline bool JointLimits::isMinimumValueEnabled() const +{ + bool res = isMinimumValueEnabled_raw(); + return res; +} + +inline bool JointLimits::isMinimumValueEnabled(bool value) +{ + return isMinimumValueEnabled_raw(value); +} + +inline bool JointLimits::isMaximumValueEnabled() const +{ + bool res = isMaximumValueEnabled_raw(); + return res; +} + +inline bool JointLimits::isMaximumValueEnabled(bool value) +{ + return isMaximumValueEnabled_raw(value); +} + +inline bool JointLimits::isRestValueEnabled() const +{ + bool res = isRestValueEnabled_raw(); + return res; +} + +inline bool JointLimits::isRestValueEnabled(bool value) +{ + return isRestValueEnabled_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_JOINTLIMITS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/JointList.h b/usr/autodesk/CPP/include/Fusion/Components/JointList.h new file mode 100644 index 0000000..77f3c4e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/JointList.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_JOINTLIST_CPP__ +# define ADSK_FUSION_JOINTLIST_API XI_EXPORT +# else +# define ADSK_FUSION_JOINTLIST_API +# endif +#else +# define ADSK_FUSION_JOINTLIST_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Joint; +}} + +namespace adsk { namespace fusion { + +/// A list of joints. +class JointList : public core::Base { +public: + + /// Function that returns the specified joint using an index into the list. + /// index : The index of the item within the list to return. The first item in the list has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified joint using a name. + /// name : The name of the item within the list to return. + /// Returns the specified item or null if an invalid name was specified. + core::Ptr itemByName(const std::string& name) const; + + /// Returns number of joints in the list. + size_t count() const; + + typedef Joint iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_JOINTLIST_API static const char* classType(); + ADSK_FUSION_JOINTLIST_API const char* objectType() const override; + ADSK_FUSION_JOINTLIST_API void* queryInterface(const char* id) const override; + ADSK_FUSION_JOINTLIST_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Joint* item_raw(size_t index) const = 0; + virtual Joint* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr JointList::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr JointList::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t JointList::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void JointList::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_JOINTLIST_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/JointMotion.h b/usr/autodesk/CPP/include/Fusion/Components/JointMotion.h new file mode 100644 index 0000000..f2e1bc3 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/JointMotion.h @@ -0,0 +1,75 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_JOINTMOTION_CPP__ +# define ADSK_FUSION_JOINTMOTION_API XI_EXPORT +# else +# define ADSK_FUSION_JOINTMOTION_API +# endif +#else +# define ADSK_FUSION_JOINTMOTION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// The base class for the classes that represent all of the +/// various joint types. +class JointMotion : public core::Base { +public: + + /// Returns an enum value indicating the type of joint this joint represents. + JointTypes jointType() const; + + ADSK_FUSION_JOINTMOTION_API static const char* classType(); + ADSK_FUSION_JOINTMOTION_API const char* objectType() const override; + ADSK_FUSION_JOINTMOTION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_JOINTMOTION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual JointTypes jointType_raw() const = 0; + virtual void placeholderJointMotion0() {} + virtual void placeholderJointMotion1() {} + virtual void placeholderJointMotion2() {} + virtual void placeholderJointMotion3() {} + virtual void placeholderJointMotion4() {} + virtual void placeholderJointMotion5() {} + virtual void placeholderJointMotion6() {} + virtual void placeholderJointMotion7() {} + virtual void placeholderJointMotion8() {} + virtual void placeholderJointMotion9() {} + virtual void placeholderJointMotion10() {} + virtual void placeholderJointMotion11() {} + virtual void placeholderJointMotion12() {} + virtual void placeholderJointMotion13() {} + virtual void placeholderJointMotion14() {} +}; + +// Inline wrappers + +inline JointTypes JointMotion::jointType() const +{ + JointTypes res = jointType_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_JOINTMOTION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/JointOrigin.h b/usr/autodesk/CPP/include/Fusion/Components/JointOrigin.h new file mode 100644 index 0000000..1734a93 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/JointOrigin.h @@ -0,0 +1,344 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_JOINTORIGIN_CPP__ +# define ADSK_FUSION_JOINTORIGIN_API XI_EXPORT +# else +# define ADSK_FUSION_JOINTORIGIN_API +# endif +#else +# define ADSK_FUSION_JOINTORIGIN_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Component; + class JointGeometry; + class ModelParameter; + class Occurrence; + class TimelineObject; +}} +namespace adsk { namespace core { + class Attributes; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// Represents an existing joint origin in a design. +class JointOrigin : public core::Base { +public: + + /// Returns the parent component that owns this joint origin. + core::Ptr parentComponent() const; + + /// Gets and sets the name of this joint origin. This is the name seen by the user in the timeline. + std::string name() const; + bool name(const std::string& value); + + /// Gets and sets the joint geometry for this joint origin input. This + /// defines the location of the joint origin. + /// To set this property, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: joint.timelineObject.rollTo(True) + core::Ptr geometry() const; + bool geometry(const core::Ptr& value); + + /// Gets the parameter that controls the angle. The value can be changed + /// using the functionality of the returned ModelParameter object. + core::Ptr angle() const; + + /// Gets the parameter that controls the X offset direction. The value can be changed + /// using the functionality of the returned ModelParameter object. + core::Ptr offsetX() const; + + /// Gets the parameter that controls the Y offset direction. The value can be changed + /// using the functionality of the returned ModelParameter object. + core::Ptr offsetY() const; + + /// Gets the parameter that controls the Z offset direction. The value can be changed + /// using the functionality of the returned ModelParameter object. + core::Ptr offsetZ() const; + + /// Gets and sets if the joint origin direction is flipped or not. + /// To set this property, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: joint.timelineObject.rollTo(True) + bool isFlipped() const; + bool isFlipped(bool value); + + /// Gets and sets the entity that defines the X axis direction. This defaults + /// to null meaning the X axis is inferred from the input geometry. + /// To set this property, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: joint.timelineObject.rollTo(True) + core::Ptr xAxisEntity() const; + bool xAxisEntity(const core::Ptr& value); + + /// Gets and sets the entity that defines the Z axis direction. This defaults + /// to null meaning the Z axis is inferred from the input geometry. + /// To set this property, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: joint.timelineObject.rollTo(True) + core::Ptr zAxisEntity() const; + bool zAxisEntity(const core::Ptr& value); + + /// Returns the direction of the primary axis that's been calculated for this joint origin. + core::Ptr primaryAxisVector() const; + + /// Returns the direction of the secondary axis that's been calculated for this joint origin. + core::Ptr secondaryAxisVector() const; + + /// Returns the direction of the third axis that's been calculated for this joint origin. + core::Ptr thirdAxisVector() const; + + /// Deletes this joint origin. + /// Returns true if successful. + bool deleteMe(); + + /// Returns the timeline object associated with this joint origin. + core::Ptr timelineObject() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this object + /// in an assembly. This is only valid in the case where this is acting + /// as a proxy in an assembly. Returns null in the case where the object + /// is not in the context of an assembly but is already the native object. + core::Ptr assemblyContext() const; + + /// Returns the collection of attributes associated with this joint origin. + core::Ptr attributes() const; + + /// Returns a token for the JointOrigin object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same joint origin. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + ADSK_FUSION_JOINTORIGIN_API static const char* classType(); + ADSK_FUSION_JOINTORIGIN_API const char* objectType() const override; + ADSK_FUSION_JOINTORIGIN_API void* queryInterface(const char* id) const override; + ADSK_FUSION_JOINTORIGIN_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Component* parentComponent_raw() const = 0; + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual JointGeometry* geometry_raw() const = 0; + virtual bool geometry_raw(JointGeometry* value) = 0; + virtual ModelParameter* angle_raw() const = 0; + virtual ModelParameter* offsetX_raw() const = 0; + virtual ModelParameter* offsetY_raw() const = 0; + virtual ModelParameter* offsetZ_raw() const = 0; + virtual bool isFlipped_raw() const = 0; + virtual bool isFlipped_raw(bool value) = 0; + virtual core::Base* xAxisEntity_raw() const = 0; + virtual bool xAxisEntity_raw(core::Base* value) = 0; + virtual core::Base* zAxisEntity_raw() const = 0; + virtual bool zAxisEntity_raw(core::Base* value) = 0; + virtual core::Vector3D* primaryAxisVector_raw() const = 0; + virtual core::Vector3D* secondaryAxisVector_raw() const = 0; + virtual core::Vector3D* thirdAxisVector_raw() const = 0; + virtual bool deleteMe_raw() = 0; + virtual TimelineObject* timelineObject_raw() const = 0; + virtual JointOrigin* nativeObject_raw() const = 0; + virtual JointOrigin* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr JointOrigin::parentComponent() const +{ + core::Ptr res = parentComponent_raw(); + return res; +} + +inline std::string JointOrigin::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool JointOrigin::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline core::Ptr JointOrigin::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline bool JointOrigin::geometry(const core::Ptr& value) +{ + return geometry_raw(value.get()); +} + +inline core::Ptr JointOrigin::angle() const +{ + core::Ptr res = angle_raw(); + return res; +} + +inline core::Ptr JointOrigin::offsetX() const +{ + core::Ptr res = offsetX_raw(); + return res; +} + +inline core::Ptr JointOrigin::offsetY() const +{ + core::Ptr res = offsetY_raw(); + return res; +} + +inline core::Ptr JointOrigin::offsetZ() const +{ + core::Ptr res = offsetZ_raw(); + return res; +} + +inline bool JointOrigin::isFlipped() const +{ + bool res = isFlipped_raw(); + return res; +} + +inline bool JointOrigin::isFlipped(bool value) +{ + return isFlipped_raw(value); +} + +inline core::Ptr JointOrigin::xAxisEntity() const +{ + core::Ptr res = xAxisEntity_raw(); + return res; +} + +inline bool JointOrigin::xAxisEntity(const core::Ptr& value) +{ + return xAxisEntity_raw(value.get()); +} + +inline core::Ptr JointOrigin::zAxisEntity() const +{ + core::Ptr res = zAxisEntity_raw(); + return res; +} + +inline bool JointOrigin::zAxisEntity(const core::Ptr& value) +{ + return zAxisEntity_raw(value.get()); +} + +inline core::Ptr JointOrigin::primaryAxisVector() const +{ + core::Ptr res = primaryAxisVector_raw(); + return res; +} + +inline core::Ptr JointOrigin::secondaryAxisVector() const +{ + core::Ptr res = secondaryAxisVector_raw(); + return res; +} + +inline core::Ptr JointOrigin::thirdAxisVector() const +{ + core::Ptr res = thirdAxisVector_raw(); + return res; +} + +inline bool JointOrigin::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline core::Ptr JointOrigin::timelineObject() const +{ + core::Ptr res = timelineObject_raw(); + return res; +} + +inline core::Ptr JointOrigin::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr JointOrigin::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr JointOrigin::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr JointOrigin::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline std::string JointOrigin::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_JOINTORIGIN_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/JointOriginInput.h b/usr/autodesk/CPP/include/Fusion/Components/JointOriginInput.h new file mode 100644 index 0000000..1f625f6 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/JointOriginInput.h @@ -0,0 +1,236 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_JOINTORIGININPUT_CPP__ +# define ADSK_FUSION_JOINTORIGININPUT_API XI_EXPORT +# else +# define ADSK_FUSION_JOINTORIGININPUT_API +# endif +#else +# define ADSK_FUSION_JOINTORIGININPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class JointGeometry; +}} +namespace adsk { namespace core { + class ValueInput; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// Defines all of the information required to create a new joint origin. This object provides +/// equivalent functionality to the Joint Origin command dialog in that it gathers the required +/// information to create a joint origin. +class JointOriginInput : public core::Base { +public: + + /// Gets and sets the joint geometry for this joint origin input. This + /// defines the location of the joint origin. + core::Ptr geometry() const; + bool geometry(const core::Ptr& value); + + /// Gets and sets the value that defines the angle for the joint origin. This defaults to zero + /// if it's not specified. The value defines an angle and if the ValueInput is defined using + /// the createByReal method the value is assumed to be radians. + core::Ptr angle() const; + bool angle(const core::Ptr& value); + + /// Gets and sets the value that defines the X offset direction. This defaults to zero + /// if it's not specified. The value defines a distance and if the ValueInput is defined using + /// the createByReal method the value is assumed to be centimeters. + core::Ptr offsetX() const; + bool offsetX(const core::Ptr& value); + + /// Gets and sets the value that defines the Y offset direction. This defaults to zero + /// if it's not specified. The value defines a distance and if the ValueInput is defined using + /// the createByReal method the value is assumed to be centimeters. + core::Ptr offsetY() const; + bool offsetY(const core::Ptr& value); + + /// Gets and sets the value that defines the Z offset direction. This defaults to zero + /// if it's not specified. The value defines a distance and if the ValueInput is defined using + /// the createByReal method the value is assumed to be centimeters. + core::Ptr offsetZ() const; + bool offsetZ(const core::Ptr& value); + + /// Gets and sets if the joint origin direction is flipped or not. + bool isFlipped() const; + bool isFlipped(bool value); + + /// Gets and sets the entity that defines the X axis direction. This defaults + /// to null meaning the X axis is inferred from the input geometry. + core::Ptr xAxisEntity() const; + bool xAxisEntity(const core::Ptr& value); + + /// Gets and sets the entity that defines the Z axis direction. This defaults + /// to null meaning the Z axis is inferred from the input geometry. + core::Ptr zAxisEntity() const; + bool zAxisEntity(const core::Ptr& value); + + /// Returns the direction of the primary axis that's been calculated for this joint origin. + core::Ptr primaryAxisVector() const; + + /// Returns the direction of the secondary axis that's been calculated for this joint origin. + core::Ptr secondaryAxisVector() const; + + /// Returns the direction of the third axis that's been calculated for this joint origin. + core::Ptr thirdAxisVector() const; + + ADSK_FUSION_JOINTORIGININPUT_API static const char* classType(); + ADSK_FUSION_JOINTORIGININPUT_API const char* objectType() const override; + ADSK_FUSION_JOINTORIGININPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_JOINTORIGININPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual JointGeometry* geometry_raw() const = 0; + virtual bool geometry_raw(JointGeometry* value) = 0; + virtual core::ValueInput* angle_raw() const = 0; + virtual bool angle_raw(core::ValueInput* value) = 0; + virtual core::ValueInput* offsetX_raw() const = 0; + virtual bool offsetX_raw(core::ValueInput* value) = 0; + virtual core::ValueInput* offsetY_raw() const = 0; + virtual bool offsetY_raw(core::ValueInput* value) = 0; + virtual core::ValueInput* offsetZ_raw() const = 0; + virtual bool offsetZ_raw(core::ValueInput* value) = 0; + virtual bool isFlipped_raw() const = 0; + virtual bool isFlipped_raw(bool value) = 0; + virtual core::Base* xAxisEntity_raw() const = 0; + virtual bool xAxisEntity_raw(core::Base* value) = 0; + virtual core::Base* zAxisEntity_raw() const = 0; + virtual bool zAxisEntity_raw(core::Base* value) = 0; + virtual core::Vector3D* primaryAxisVector_raw() const = 0; + virtual core::Vector3D* secondaryAxisVector_raw() const = 0; + virtual core::Vector3D* thirdAxisVector_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr JointOriginInput::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline bool JointOriginInput::geometry(const core::Ptr& value) +{ + return geometry_raw(value.get()); +} + +inline core::Ptr JointOriginInput::angle() const +{ + core::Ptr res = angle_raw(); + return res; +} + +inline bool JointOriginInput::angle(const core::Ptr& value) +{ + return angle_raw(value.get()); +} + +inline core::Ptr JointOriginInput::offsetX() const +{ + core::Ptr res = offsetX_raw(); + return res; +} + +inline bool JointOriginInput::offsetX(const core::Ptr& value) +{ + return offsetX_raw(value.get()); +} + +inline core::Ptr JointOriginInput::offsetY() const +{ + core::Ptr res = offsetY_raw(); + return res; +} + +inline bool JointOriginInput::offsetY(const core::Ptr& value) +{ + return offsetY_raw(value.get()); +} + +inline core::Ptr JointOriginInput::offsetZ() const +{ + core::Ptr res = offsetZ_raw(); + return res; +} + +inline bool JointOriginInput::offsetZ(const core::Ptr& value) +{ + return offsetZ_raw(value.get()); +} + +inline bool JointOriginInput::isFlipped() const +{ + bool res = isFlipped_raw(); + return res; +} + +inline bool JointOriginInput::isFlipped(bool value) +{ + return isFlipped_raw(value); +} + +inline core::Ptr JointOriginInput::xAxisEntity() const +{ + core::Ptr res = xAxisEntity_raw(); + return res; +} + +inline bool JointOriginInput::xAxisEntity(const core::Ptr& value) +{ + return xAxisEntity_raw(value.get()); +} + +inline core::Ptr JointOriginInput::zAxisEntity() const +{ + core::Ptr res = zAxisEntity_raw(); + return res; +} + +inline bool JointOriginInput::zAxisEntity(const core::Ptr& value) +{ + return zAxisEntity_raw(value.get()); +} + +inline core::Ptr JointOriginInput::primaryAxisVector() const +{ + core::Ptr res = primaryAxisVector_raw(); + return res; +} + +inline core::Ptr JointOriginInput::secondaryAxisVector() const +{ + core::Ptr res = secondaryAxisVector_raw(); + return res; +} + +inline core::Ptr JointOriginInput::thirdAxisVector() const +{ + core::Ptr res = thirdAxisVector_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_JOINTORIGININPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/JointOriginList.h b/usr/autodesk/CPP/include/Fusion/Components/JointOriginList.h new file mode 100644 index 0000000..6f6fb42 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/JointOriginList.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_JOINTORIGINLIST_CPP__ +# define ADSK_FUSION_JOINTORIGINLIST_API XI_EXPORT +# else +# define ADSK_FUSION_JOINTORIGINLIST_API +# endif +#else +# define ADSK_FUSION_JOINTORIGINLIST_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class JointOrigin; +}} + +namespace adsk { namespace fusion { + +/// A list of joint origins. +class JointOriginList : public core::Base { +public: + + /// Function that returns the specified joint origin using an index into the list. + /// index : The index of the item within the list to return. The first item in the list has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified joint origin using a name. + /// name : The name of the item within the list to return. + /// Returns the specified item or null if an invalid name was specified. + core::Ptr itemByName(const std::string& name) const; + + /// Returns number of joint origins in the list. + size_t count() const; + + typedef JointOrigin iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_JOINTORIGINLIST_API static const char* classType(); + ADSK_FUSION_JOINTORIGINLIST_API const char* objectType() const override; + ADSK_FUSION_JOINTORIGINLIST_API void* queryInterface(const char* id) const override; + ADSK_FUSION_JOINTORIGINLIST_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual JointOrigin* item_raw(size_t index) const = 0; + virtual JointOrigin* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr JointOriginList::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr JointOriginList::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t JointOriginList::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void JointOriginList::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_JOINTORIGINLIST_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/JointOrigins.h b/usr/autodesk/CPP/include/Fusion/Components/JointOrigins.h new file mode 100644 index 0000000..e542cc6 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/JointOrigins.h @@ -0,0 +1,132 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_JOINTORIGINS_CPP__ +# define ADSK_FUSION_JOINTORIGINS_API XI_EXPORT +# else +# define ADSK_FUSION_JOINTORIGINS_API +# endif +#else +# define ADSK_FUSION_JOINTORIGINS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class JointGeometry; + class JointOrigin; + class JointOriginInput; +}} + +namespace adsk { namespace fusion { + +/// The collection of joint origins in this component. This provides access to all existing +/// joint origins and supports the ability to create new joint origins. +class JointOrigins : public core::Base { +public: + + /// Function that returns the specified joint origin using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified joint origin using a name. + /// name : The name of the item within the collection to return. + /// Returns the specified item or null if an invalid name was specified. + core::Ptr itemByName(const std::string& name) const; + + /// Returns number of joint origins in the collection. + size_t count() const; + + /// Creates a JointOriginInput object which is used to collect all of the information + /// needed to create a simple joint origin. The creation of the input object takes the required + /// input as the geometry argument and you can optionally use methods and properties on the created + /// JointOriginInput to set other optional settings. The JointOrigin is created by calling the add + /// method of the JointOrigins object and passing it the JointOriginInput object. + /// geometry : A JointGeometry object that defines the geometry the joint origin will be created on. + /// Returns a JointOriginInput object if successfully created and null if it fails. + core::Ptr createInput(const core::Ptr& geometry); + + /// Create a new joint origin. + /// input : A JointOriginInput object that full defines all of the information needed to create a joint origin. + /// You create a JointOriginInput by using the createInput method of the JointOrigins object. + /// Returns a JointOrigin object if successfully created and null if it fails. + core::Ptr add(const core::Ptr& input); + + typedef JointOrigin iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_JOINTORIGINS_API static const char* classType(); + ADSK_FUSION_JOINTORIGINS_API const char* objectType() const override; + ADSK_FUSION_JOINTORIGINS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_JOINTORIGINS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual JointOrigin* item_raw(size_t index) const = 0; + virtual JointOrigin* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual JointOriginInput* createInput_raw(JointGeometry* geometry) = 0; + virtual JointOrigin* add_raw(JointOriginInput* input) = 0; +}; + +// Inline wrappers + +inline core::Ptr JointOrigins::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr JointOrigins::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t JointOrigins::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr JointOrigins::createInput(const core::Ptr& geometry) +{ + core::Ptr res = createInput_raw(geometry.get()); + return res; +} + +inline core::Ptr JointOrigins::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +template inline void JointOrigins::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_JOINTORIGINS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/Joints.h b/usr/autodesk/CPP/include/Fusion/Components/Joints.h new file mode 100644 index 0000000..3b28fc3 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/Joints.h @@ -0,0 +1,135 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_JOINTS_CPP__ +# define ADSK_FUSION_JOINTS_API XI_EXPORT +# else +# define ADSK_FUSION_JOINTS_API +# endif +#else +# define ADSK_FUSION_JOINTS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Joint; + class JointInput; +}} + +namespace adsk { namespace fusion { + +/// The collection of joints in this component. This provides access to all existing joints +/// and supports the ability to create new joints. +class Joints : public core::Base { +public: + + /// Function that returns the specified joint using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Creates a JointInput object, which is the API equivalent to the Joint command dialog. You + /// you use methods and properties on the returned class to set the desired options, similar to + /// providing input and setting options in the Joint command dialog. Once the settings are defined + /// you call the Joints.add method passing in the JointInput object to create the actual joint. + /// geometryOrOriginOne : A JointGeometry or JointOrigin object that defines the first set of geometry of the joint. + /// JointGeometry objects are created by using the various static methods on the JointGeometry class + /// and JointOrigin objects are created through the JointOrigins object. + /// geometryOrOriginTwo : A JointGeometry or JointOrigin object that defines the second set of geometry of the joint. + /// JointGeometry objects are created by using the various static methods on the JointGeometry class + /// and JointOrigin objects are created through the JointOrigins object. + /// Returns the JointInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& geometryOrOriginOne, const core::Ptr& geometryOrOriginTwo); + + /// Creates a new joint. + /// input : The JointInput object that defines the geometry and various inputs that fully define a joint. + /// A JointInput object is created using the Joints.createInput method. + /// Returns the newly created Joint or null in the case of failure. + core::Ptr add(const core::Ptr& input); + + /// Returns number of joints in the collection. + size_t count() const; + + /// Function that returns the specified joint using a name. + /// name : The name of the item within the collection to return. + /// Returns the specified item or null if an invalid name was specified. + core::Ptr itemByName(const std::string& name) const; + + typedef Joint iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_JOINTS_API static const char* classType(); + ADSK_FUSION_JOINTS_API const char* objectType() const override; + ADSK_FUSION_JOINTS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_JOINTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Joint* item_raw(size_t index) const = 0; + virtual JointInput* createInput_raw(core::Base* geometryOrOriginOne, core::Base* geometryOrOriginTwo) = 0; + virtual Joint* add_raw(JointInput* input) = 0; + virtual size_t count_raw() const = 0; + virtual Joint* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr Joints::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr Joints::createInput(const core::Ptr& geometryOrOriginOne, const core::Ptr& geometryOrOriginTwo) +{ + core::Ptr res = createInput_raw(geometryOrOriginOne.get(), geometryOrOriginTwo.get()); + return res; +} + +inline core::Ptr Joints::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline size_t Joints::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr Joints::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void Joints::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_JOINTS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/Occurrence.h b/usr/autodesk/CPP/include/Fusion/Components/Occurrence.h new file mode 100644 index 0000000..08200ea --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/Occurrence.h @@ -0,0 +1,519 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_OCCURRENCE_CPP__ +# define ADSK_FUSION_OCCURRENCE_API XI_EXPORT +# else +# define ADSK_FUSION_OCCURRENCE_API +# endif +#else +# define ADSK_FUSION_OCCURRENCE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class AsBuiltJointList; + class BRepBodies; + class Component; + class JointList; + class OccurrenceList; + class PhysicalProperties; + class RigidGroupList; + class TimelineObject; +}} +namespace adsk { namespace core { + class Appearance; + class Attributes; + class BoundingBox3D; + class Matrix3D; +}} + +namespace adsk { namespace fusion { + +/// Represents an occurrence of a component at any level within a subassembly. +class Occurrence : public core::Base { +public: + + /// This is the sourceComponent for the occurrence and is affected + /// by the assembly context. + /// This is the top-level component where the path begins. + core::Ptr sourceComponent() const; + + /// Returns a read only list of child occurrences where only the occurrences + /// in this occurrence's AssemblyContext are returned . + core::Ptr childOccurrences() const; + + /// The component this occurrence references. + core::Ptr component() const; + + /// The name of the occurrence. This is the name as seen in the browser. It is a reflection + /// of the component name with an added counter suffix (i.e. 'OccurrenceName:1'). + std::string name() const; + + /// The name of the occurrence, including the full path of occurrences as seen in the browser. + /// The top-level component will depend on the context but will typically be the root component + /// of the design. A name for an occurrence that is at the third level of an assembly could be + /// "Sub1:1+Sub2:1+PartA:1". + std::string fullPathName() const; + + /// Read-write property that gets and sets the appearance override for this occurrence. + /// This property can return null indicating there is no override appearance and that the + /// contents of the occurrence are displayed using there defined appearance. + /// Setting the property to null will remove any override appearance for this occurrence. + core::Ptr appearance() const; + bool appearance(const core::Ptr& value); + + /// Gets and sets if the light bulb of this occurrence as displayed in the browser is on or off. + /// An occurrence will only be visible if the light bulb is switched on. However, + /// the light bulb can be on and the occurrence still invisible if a higher level occurrence + /// in the assembly context is not visible because its light bulb is off. + bool isLightBulbOn() const; + bool isLightBulbOn(bool value); + + /// Gets whether the occurrence is visible. + /// This property is affected by the assembly context. + bool isVisible() const; + + /// Gets and sets the 3d matrix data that defines this occurrences orientation and + /// position in its assembly context + core::Ptr transform() const; + bool transform(const core::Ptr& value); + + /// Deletes the occurrence from the design. If this is the last occurrence + /// referencing a specific Component, the component is also deleted. + /// Returns true if the delete was successful. + bool deleteMe(); + + /// Returns the timeline object associated with the creation of this occurrence. + core::Ptr timelineObject() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this + /// object in an assembly. This is only valid in the case where this + /// references the component the object is defined within. + /// Returns null in the case where the object is not in the context of an assembly + /// but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + /// The return type is strongly typed for each object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// Fails if this object is not the NativeObject. + /// occurrence : The occurrence that represents the context you want to create this proxy in. + /// Returns the proxy for the occurrence in the context of the specified occurrence. + /// Returns null if it failed. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Gets and sets whether this occurrence is grounded or not. + bool isGrounded() const; + bool isGrounded(bool value); + + /// Gets and sets whether this occurrence is selectable or not. + bool isSelectable() const; + bool isSelectable(bool value); + + /// Gets and sets whether this occurrence is isolated in the UI. When an occurrence + /// is isolated it is the only one visible in the user-interface. Only one occurrence + /// can be isolated at a time so setting this property to true will un-isolate an occurrence + /// that is currently isolated. Setting this property to false for an occurrence that is + /// current isolated will un-isolate it so that no occurrence will be isolated. + bool isIsolated() const; + bool isIsolated(bool value); + + /// Gets whether this occurrence is the active edit target in the user interface. + /// This is the same as checking the state of the radio button next to the occurrence in the browser. + /// To activate the occurrence use the Activate method. + bool isActive() const; + + /// Makes the occurrence the active edit target in the user interface. This is the same + /// as enabling the radio button next to the occurrence in the browser. + /// Returns true if the activation was successful. + bool activate(); + + /// Moves this occurrence from it's current component into the component owned by the specified occurrence. + /// This occurrence and the target occurrence must be in the same context. + /// targetOccurrence : The target occurrence defines both the component and the transform to apply when moving the occurrence. The + /// occurrence will be copied into the parent component of the target occurrence and the target occurrence also defines + /// the transform of how the occurrence will be copied so that the occurrence maintains it's same position in model space. + /// Returns the moved Occurrence or null in the case the move failed. + core::Ptr moveToComponent(const core::Ptr& targetOccurrence); + + /// Returns the PhysicalProperties object that has properties for getting the area, density, mass, volume, moments, etc + /// of this occurrence. Property values will be calculated using the 'LowCalculationAccuracy' setting when using this property + /// to get the PhysicalProperties object. To specify a higher calculation tolerance, use the getPhysicalProperties method instead. + core::Ptr physicalProperties() const; + + /// Gets if this occurrence is referencing an external component. + bool isReferencedComponent() const; + + /// Returns the bounding box of this occurrence. + core::Ptr boundingBox() const; + + /// Returns the joints that affect the position of this occurrence. For example, if a joint has + /// been created between this occurrence and another occurrence, this property will return that + /// joint. If the occurrence is a proxy, the joints returned will also be proxies in the same + /// context as the occurrence. + core::Ptr joints() const; + + /// Returns the rigid groups that this occurrence is a member of. If the occurrence is a proxy, + /// the joints returned will also be proxies in the same context as the occurrence. + core::Ptr rigidGroups() const; + + /// Returns the as-built joints that affect the position of this occurrence. If the occurrence is a proxy, + /// the as-built joints returned will also be proxies in the same context as the occurrence. + core::Ptr asBuiltJoints() const; + + /// Returns the collection of attributes associated with this face. + core::Ptr attributes() const; + + /// Returns the body proxies for the B-Rep bodies in the component referenced by this occurrence. + /// For example if you get the occurrences from the root component and then use this property to + /// get the bodies from those occurrences, the bodies returned will return information in the context of the root + /// component, not the component they actually exist in. + core::Ptr bRepBodies() const; + + /// Returns the PhysicalProperties object that has properties for getting the area, density, mass, volume, moments, etc + /// of this occurrence. + /// accuracy : Specifies the desired level of computational accuracy of the property calculations. + /// The default value of 'LowCalculationAccuracy' returns results within a +/- 1% error margin. + core::Ptr getPhysicalProperties(CalculationAccuracy accuracy = adsk::fusion::LowCalculationAccuracy) const; + + /// The user can set an override opacity for components and these opacity overrides combine if + /// children and parent components have overrides. This property returns the actual opacity that is + /// being used to render the occurrence. To set the opacity use the opacity property of the Component object. + double visibleOpacity() const; + + /// When the component this occurrence references is an external reference (the isReferencedComponent property returns true), + /// this will break the link and create a local Component that this occurrence will reference. The new local Component can + /// be accessed through the Occurrence using the component property. + /// This method will fail if the occurrence is not referencing an external component. + /// Returns true if the break link was successful. + bool breakLink(); + + /// Returns a token for the Occurrence object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same occurrence. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + ADSK_FUSION_OCCURRENCE_API static const char* classType(); + ADSK_FUSION_OCCURRENCE_API const char* objectType() const override; + ADSK_FUSION_OCCURRENCE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_OCCURRENCE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Component* sourceComponent_raw() const = 0; + virtual OccurrenceList* childOccurrences_raw() const = 0; + virtual Component* component_raw() const = 0; + virtual char* name_raw() const = 0; + virtual char* fullPathName_raw() const = 0; + virtual core::Appearance* appearance_raw() const = 0; + virtual bool appearance_raw(core::Appearance* value) = 0; + virtual bool isLightBulbOn_raw() const = 0; + virtual bool isLightBulbOn_raw(bool value) = 0; + virtual bool isVisible_raw() const = 0; + virtual core::Matrix3D* transform_raw() const = 0; + virtual bool transform_raw(core::Matrix3D* value) = 0; + virtual bool deleteMe_raw() = 0; + virtual TimelineObject* timelineObject_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual Occurrence* nativeObject_raw() const = 0; + virtual Occurrence* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual bool isGrounded_raw() const = 0; + virtual bool isGrounded_raw(bool value) = 0; + virtual bool isSelectable_raw() const = 0; + virtual bool isSelectable_raw(bool value) = 0; + virtual bool isIsolated_raw() const = 0; + virtual bool isIsolated_raw(bool value) = 0; + virtual bool isActive_raw() const = 0; + virtual bool activate_raw() = 0; + virtual Occurrence* moveToComponent_raw(Occurrence* targetOccurrence) = 0; + virtual PhysicalProperties* physicalProperties_raw() const = 0; + virtual bool isReferencedComponent_raw() const = 0; + virtual core::BoundingBox3D* boundingBox_raw() const = 0; + virtual JointList* joints_raw() const = 0; + virtual RigidGroupList* rigidGroups_raw() const = 0; + virtual AsBuiltJointList* asBuiltJoints_raw() const = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual BRepBodies* bRepBodies_raw() const = 0; + virtual PhysicalProperties* getPhysicalProperties_raw(CalculationAccuracy accuracy) const = 0; + virtual double visibleOpacity_raw() const = 0; + virtual bool breakLink_raw() = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr Occurrence::sourceComponent() const +{ + core::Ptr res = sourceComponent_raw(); + return res; +} + +inline core::Ptr Occurrence::childOccurrences() const +{ + core::Ptr res = childOccurrences_raw(); + return res; +} + +inline core::Ptr Occurrence::component() const +{ + core::Ptr res = component_raw(); + return res; +} + +inline std::string Occurrence::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string Occurrence::fullPathName() const +{ + std::string res; + + char* p= fullPathName_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline core::Ptr Occurrence::appearance() const +{ + core::Ptr res = appearance_raw(); + return res; +} + +inline bool Occurrence::appearance(const core::Ptr& value) +{ + return appearance_raw(value.get()); +} + +inline bool Occurrence::isLightBulbOn() const +{ + bool res = isLightBulbOn_raw(); + return res; +} + +inline bool Occurrence::isLightBulbOn(bool value) +{ + return isLightBulbOn_raw(value); +} + +inline bool Occurrence::isVisible() const +{ + bool res = isVisible_raw(); + return res; +} + +inline core::Ptr Occurrence::transform() const +{ + core::Ptr res = transform_raw(); + return res; +} + +inline bool Occurrence::transform(const core::Ptr& value) +{ + return transform_raw(value.get()); +} + +inline bool Occurrence::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline core::Ptr Occurrence::timelineObject() const +{ + core::Ptr res = timelineObject_raw(); + return res; +} + +inline core::Ptr Occurrence::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr Occurrence::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr Occurrence::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline bool Occurrence::isGrounded() const +{ + bool res = isGrounded_raw(); + return res; +} + +inline bool Occurrence::isGrounded(bool value) +{ + return isGrounded_raw(value); +} + +inline bool Occurrence::isSelectable() const +{ + bool res = isSelectable_raw(); + return res; +} + +inline bool Occurrence::isSelectable(bool value) +{ + return isSelectable_raw(value); +} + +inline bool Occurrence::isIsolated() const +{ + bool res = isIsolated_raw(); + return res; +} + +inline bool Occurrence::isIsolated(bool value) +{ + return isIsolated_raw(value); +} + +inline bool Occurrence::isActive() const +{ + bool res = isActive_raw(); + return res; +} + +inline bool Occurrence::activate() +{ + bool res = activate_raw(); + return res; +} + +inline core::Ptr Occurrence::moveToComponent(const core::Ptr& targetOccurrence) +{ + core::Ptr res = moveToComponent_raw(targetOccurrence.get()); + return res; +} + +inline core::Ptr Occurrence::physicalProperties() const +{ + core::Ptr res = physicalProperties_raw(); + return res; +} + +inline bool Occurrence::isReferencedComponent() const +{ + bool res = isReferencedComponent_raw(); + return res; +} + +inline core::Ptr Occurrence::boundingBox() const +{ + core::Ptr res = boundingBox_raw(); + return res; +} + +inline core::Ptr Occurrence::joints() const +{ + core::Ptr res = joints_raw(); + return res; +} + +inline core::Ptr Occurrence::rigidGroups() const +{ + core::Ptr res = rigidGroups_raw(); + return res; +} + +inline core::Ptr Occurrence::asBuiltJoints() const +{ + core::Ptr res = asBuiltJoints_raw(); + return res; +} + +inline core::Ptr Occurrence::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline core::Ptr Occurrence::bRepBodies() const +{ + core::Ptr res = bRepBodies_raw(); + return res; +} + +inline core::Ptr Occurrence::getPhysicalProperties(CalculationAccuracy accuracy) const +{ + core::Ptr res = getPhysicalProperties_raw(accuracy); + return res; +} + +inline double Occurrence::visibleOpacity() const +{ + double res = visibleOpacity_raw(); + return res; +} + +inline bool Occurrence::breakLink() +{ + bool res = breakLink_raw(); + return res; +} + +inline std::string Occurrence::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_OCCURRENCE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/OccurrenceList.h b/usr/autodesk/CPP/include/Fusion/Components/OccurrenceList.h new file mode 100644 index 0000000..05743f2 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/OccurrenceList.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_OCCURRENCELIST_CPP__ +# define ADSK_FUSION_OCCURRENCELIST_API XI_EXPORT +# else +# define ADSK_FUSION_OCCURRENCELIST_API +# endif +#else +# define ADSK_FUSION_OCCURRENCELIST_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// Provides a list of occurrences. +class OccurrenceList : public core::Base { +public: + + /// Returns the specified occurrence using an index into the collection. + /// index : The index of the occurrence within the collection to return. The first item has an index of 0. + /// Returns the specified occurrence or null in the case of an invalid index. + core::Ptr item(size_t index) const; + + /// Returns the number of occurrences in the collection. + size_t count() const; + + /// Returns the specified occurrence using the name of the occurrence. + /// name : The name of the occurrence to return. + /// Returns the occurrence or null if an invalid name was specified + core::Ptr itemByName(const std::string& name) const; + + typedef Occurrence iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_OCCURRENCELIST_API static const char* classType(); + ADSK_FUSION_OCCURRENCELIST_API const char* objectType() const override; + ADSK_FUSION_OCCURRENCELIST_API void* queryInterface(const char* id) const override; + ADSK_FUSION_OCCURRENCELIST_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Occurrence* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual Occurrence* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr OccurrenceList::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t OccurrenceList::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr OccurrenceList::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void OccurrenceList::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_OCCURRENCELIST_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/Occurrences.h b/usr/autodesk/CPP/include/Fusion/Components/Occurrences.h new file mode 100644 index 0000000..a0b60d6 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/Occurrences.h @@ -0,0 +1,150 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_OCCURRENCES_CPP__ +# define ADSK_FUSION_OCCURRENCES_API XI_EXPORT +# else +# define ADSK_FUSION_OCCURRENCES_API +# endif +#else +# define ADSK_FUSION_OCCURRENCES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Component; + class Occurrence; + class OccurrenceList; +}} +namespace adsk { namespace core { + class DataFile; + class Matrix3D; +}} + +namespace adsk { namespace fusion { + +/// Provides access to occurrences within a component and provides +/// methods to create new occurrences. +class Occurrences : public core::Base { +public: + + /// Function that returns the specified occurrence using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of occurrences in the collection. + size_t count() const; + + /// Returns the specified occurrence using the name of the occurrence. + /// name : The name of the occurrence to return. + /// Returns the occurrence or null if an invalid name was specified + core::Ptr itemByName(const std::string& name) const; + + /// Method that creates a new occurrence using an existing component. This is the equivalent + /// of copying and pasting an occurrence in the user interface. + /// component : The existing component to create a new occurrence of. + /// transform : A transform that defines the location for the new occurrence + /// Returns the newly created occurrence or null if the creation failed. + core::Ptr addExistingComponent(const core::Ptr& component, const core::Ptr& transform); + + /// Method that creates a new component and an occurrence that references it. + /// transform : A transform that defines the location for the new occurrence. + /// Returns the newly created occurrence or null if the creation failed. + core::Ptr addNewComponent(const core::Ptr& transform); + + /// Returns the contents of this collection as an OccurrencesList object. This + /// is useful when writing a function that traverses an assembly. + core::Ptr asList() const; + + /// Method that inserts an existing file. + /// dataFile : The dataFile to insert. + /// transform : A transform that defines the location for the new occurrence. + /// isReferencedComponent : Indicates if the insert is to be an external reference or embedded within this document. + /// This method will fail if the dataFile being inserted is not from the same project as the document + /// it is being inserted into while isReferencedComponent is True. + /// Returns the newly created occurrence or null if the insert failed. + /// Insert will fail if the dataFile being inserted is not from the same project as the document + /// it is being inserted into while isReferencedComponent is True. + core::Ptr addByInsert(const core::Ptr& dataFile, const core::Ptr& transform, bool isReferencedComponent); + + ADSK_FUSION_OCCURRENCES_API static const char* classType(); + ADSK_FUSION_OCCURRENCES_API const char* objectType() const override; + ADSK_FUSION_OCCURRENCES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_OCCURRENCES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Occurrence* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual Occurrence* itemByName_raw(const char * name) const = 0; + virtual Occurrence* addExistingComponent_raw(Component* component, core::Matrix3D* transform) = 0; + virtual Occurrence* addNewComponent_raw(core::Matrix3D* transform) = 0; + virtual OccurrenceList* asList_raw() const = 0; + virtual Occurrence* addByInsert_raw(core::DataFile* dataFile, core::Matrix3D* transform, bool isReferencedComponent) = 0; +}; + +// Inline wrappers + +inline core::Ptr Occurrences::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t Occurrences::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr Occurrences::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline core::Ptr Occurrences::addExistingComponent(const core::Ptr& component, const core::Ptr& transform) +{ + core::Ptr res = addExistingComponent_raw(component.get(), transform.get()); + return res; +} + +inline core::Ptr Occurrences::addNewComponent(const core::Ptr& transform) +{ + core::Ptr res = addNewComponent_raw(transform.get()); + return res; +} + +inline core::Ptr Occurrences::asList() const +{ + core::Ptr res = asList_raw(); + return res; +} + +inline core::Ptr Occurrences::addByInsert(const core::Ptr& dataFile, const core::Ptr& transform, bool isReferencedComponent) +{ + core::Ptr res = addByInsert_raw(dataFile.get(), transform.get(), isReferencedComponent); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_OCCURRENCES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/PinSlotJointMotion.h b/usr/autodesk/CPP/include/Fusion/Components/PinSlotJointMotion.h new file mode 100644 index 0000000..2e1fa22 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/PinSlotJointMotion.h @@ -0,0 +1,230 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "JointMotion.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PINSLOTJOINTMOTION_CPP__ +# define ADSK_FUSION_PINSLOTJOINTMOTION_API XI_EXPORT +# else +# define ADSK_FUSION_PINSLOTJOINTMOTION_API +# endif +#else +# define ADSK_FUSION_PINSLOTJOINTMOTION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class JointLimits; +}} +namespace adsk { namespace core { + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// Represents the set of information specific to a pin slot joint. +class PinSlotJointMotion : public JointMotion { +public: + + /// Gets and sets the direction of the axis of rotation. This can be set to + /// XAxisJointDirection, YAxisJointDirection, or ZAxisJointDirection. It can + /// return those three directions and CustomJointDirection. If this returns + /// CustomJointDirection then the customRotationAxisEntity will return an entity + /// that defines the axis. If there is a custom rotation axis defined and this + /// property is set to one of the three standard axes, the custom rotation will + /// be removed and customRotationAxisEntity will return null. + JointDirections rotationAxis() const; + bool rotationAxis(JointDirections value); + + /// Returns the direction of the rotation axis. This property will return null in the case + /// where the PinSlotJointMotion object was obtained from a JointInput object. + core::Ptr rotationAxisVector() const; + + /// This property can be set using various types of entities that can infer an + /// axis. For example, a linear edge, sketch line, planar face, and cylindrical face. + /// This property is only valid in the case where the rotationAxis property returns + /// CustomJointDirection. Setting this property will automatically set + /// the rotationAxis property to CustomJointDirection. + /// To set this property, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + core::Ptr customRotationAxisEntity() const; + bool customRotationAxisEntity(const core::Ptr& value); + + /// Gets and sets the rotation value. This is in radians. Setting this value is + /// the equivalent of using the Drive Joints command. + double rotationValue() const; + bool rotationValue(double value); + + /// Returns a JointLimits object that defines the rotation limits for this joint. + /// Use the functionality of the returned JointLimits object to get, set, and modify + /// the joint limits. + core::Ptr rotationLimits() const; + + /// Gets and sets the direction of the slide motion in the slot. This can be set to + /// XAxisJointDirection, YAxisJointDirection, or ZAxisJointDirection. It can + /// return those three directions and CustomJointDirection. If this returns + /// CustomJointDirection then the customSlideDirectionEntity will return an entity + /// that defines the direction. If there is a custom direction defined and this + /// property is set to one of the three standard axes, the custom direction will + /// be removed and customSlideDirectionEntity will return null. + JointDirections slideDirection() const; + bool slideDirection(JointDirections value); + + /// Returns the direction of the primary slide direction. This property will return null in the case + /// where the PinSlotJointMotion object was obtained from a JointInput object. + core::Ptr slideDirectionVector() const; + + /// This property can be set using various types of entities that can infer a + /// direction. For example, a linear edge, sketch line, planar face, and cylindrical face. + /// This property is only valid in the case where the slideDirection property returns + /// CustomJointDirection. Setting this property will automatically set + /// the slideDirection property to CustomJointDirection. + /// To set this property, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + core::Ptr customSlideDirectionEntity() const; + bool customSlideDirectionEntity(const core::Ptr& value); + + /// Gets and sets the slide value. This is in centimeters. Setting this value is + /// the equivalent of using the Drive Joints command. + double slideValue() const; + bool slideValue(double value); + + /// Returns a JointLimits object that defines the slide limits for this joint. + /// Use the functionality of the returned JointLimits object to get, set, and modify + /// the joint limits. + core::Ptr slideLimits() const; + + ADSK_FUSION_PINSLOTJOINTMOTION_API static const char* classType(); + ADSK_FUSION_PINSLOTJOINTMOTION_API const char* objectType() const override; + ADSK_FUSION_PINSLOTJOINTMOTION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PINSLOTJOINTMOTION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual JointDirections rotationAxis_raw() const = 0; + virtual bool rotationAxis_raw(JointDirections value) = 0; + virtual core::Vector3D* rotationAxisVector_raw() const = 0; + virtual core::Base* customRotationAxisEntity_raw() const = 0; + virtual bool customRotationAxisEntity_raw(core::Base* value) = 0; + virtual double rotationValue_raw() const = 0; + virtual bool rotationValue_raw(double value) = 0; + virtual JointLimits* rotationLimits_raw() const = 0; + virtual JointDirections slideDirection_raw() const = 0; + virtual bool slideDirection_raw(JointDirections value) = 0; + virtual core::Vector3D* slideDirectionVector_raw() const = 0; + virtual core::Base* customSlideDirectionEntity_raw() const = 0; + virtual bool customSlideDirectionEntity_raw(core::Base* value) = 0; + virtual double slideValue_raw() const = 0; + virtual bool slideValue_raw(double value) = 0; + virtual JointLimits* slideLimits_raw() const = 0; +}; + +// Inline wrappers + +inline JointDirections PinSlotJointMotion::rotationAxis() const +{ + JointDirections res = rotationAxis_raw(); + return res; +} + +inline bool PinSlotJointMotion::rotationAxis(JointDirections value) +{ + return rotationAxis_raw(value); +} + +inline core::Ptr PinSlotJointMotion::rotationAxisVector() const +{ + core::Ptr res = rotationAxisVector_raw(); + return res; +} + +inline core::Ptr PinSlotJointMotion::customRotationAxisEntity() const +{ + core::Ptr res = customRotationAxisEntity_raw(); + return res; +} + +inline bool PinSlotJointMotion::customRotationAxisEntity(const core::Ptr& value) +{ + return customRotationAxisEntity_raw(value.get()); +} + +inline double PinSlotJointMotion::rotationValue() const +{ + double res = rotationValue_raw(); + return res; +} + +inline bool PinSlotJointMotion::rotationValue(double value) +{ + return rotationValue_raw(value); +} + +inline core::Ptr PinSlotJointMotion::rotationLimits() const +{ + core::Ptr res = rotationLimits_raw(); + return res; +} + +inline JointDirections PinSlotJointMotion::slideDirection() const +{ + JointDirections res = slideDirection_raw(); + return res; +} + +inline bool PinSlotJointMotion::slideDirection(JointDirections value) +{ + return slideDirection_raw(value); +} + +inline core::Ptr PinSlotJointMotion::slideDirectionVector() const +{ + core::Ptr res = slideDirectionVector_raw(); + return res; +} + +inline core::Ptr PinSlotJointMotion::customSlideDirectionEntity() const +{ + core::Ptr res = customSlideDirectionEntity_raw(); + return res; +} + +inline bool PinSlotJointMotion::customSlideDirectionEntity(const core::Ptr& value) +{ + return customSlideDirectionEntity_raw(value.get()); +} + +inline double PinSlotJointMotion::slideValue() const +{ + double res = slideValue_raw(); + return res; +} + +inline bool PinSlotJointMotion::slideValue(double value) +{ + return slideValue_raw(value); +} + +inline core::Ptr PinSlotJointMotion::slideLimits() const +{ + core::Ptr res = slideLimits_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PINSLOTJOINTMOTION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/PlanarJointMotion.h b/usr/autodesk/CPP/include/Fusion/Components/PlanarJointMotion.h new file mode 100644 index 0000000..904d252 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/PlanarJointMotion.h @@ -0,0 +1,263 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "JointMotion.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PLANARJOINTMOTION_CPP__ +# define ADSK_FUSION_PLANARJOINTMOTION_API XI_EXPORT +# else +# define ADSK_FUSION_PLANARJOINTMOTION_API +# endif +#else +# define ADSK_FUSION_PLANARJOINTMOTION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class JointLimits; +}} +namespace adsk { namespace core { + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// Represents the set of information specific to a planar joint. +class PlanarJointMotion : public JointMotion { +public: + + /// Gets and sets the direction of the normal of the single degree of rotation. + /// This can be set to XAxisJointDirection, YAxisJointDirection, or ZAxisJointDirection. + /// It can return those three directions and CustomJointDirection. If this returns + /// CustomJointDirection then the customNormalDirectionEntity will return an entity + /// that defines the direction. If there is a custom direction defined and this + /// property is set to one of the three standard axes, the custom direction will + /// be removed and customNormalDirectionEntity will return null. + JointDirections normalDirection() const; + bool normalDirection(JointDirections value); + + /// Returns the direction of the normal direction. This property will return null in the case + /// where the PlanarJointMotion object was obtained from a JointInput object. + core::Ptr normalDirectionVector() const; + + /// This property defines a custom normal direction and can be set using various types + /// of entities that can infer a direction. For example, a linear edge, sketch line, + /// planar face, and cylindrical face.This property is only valid in the case where the + /// normalDirection property returns CustomJointDirection. Setting this property will + /// automatically set the normalDirection property to CustomJointDirection. + /// To set this property, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + core::Ptr customNormalDirectionEntity() const; + bool customNormalDirectionEntity(const core::Ptr& value); + + /// Gets the direction used as the primary direction for the two translational degrees of + /// freedom. The value of this property is automatically set when setting the normalDirection. + /// When reading this value it can return XAxisJointDirection, YAxisJointDirection, ZAxisJointDirection, + /// or CustomJointDirection. If it's CustomJointDirection then the direction the direction can be + /// determined using the primarySlideDirectionVector and the entity controlling the direction can + /// be get and set using the customPrimarySlideDirectionEntity. + JointDirections primarySlideDirection() const; + + /// Returns the direction of the primary slide direction. This property will return null in the case + /// where the PlanarJointMotion object was obtained from a JointInput object. + core::Ptr primarySlideDirectionVector() const; + + /// This property can be set using various types of entities that can infer a + /// direction. For example, a linear edge, sketch line, planar face, and cylindrical face. + /// When reading this property, it is only valid in the case where the primarySlideDirection property returns + /// CustomJointDirection. Setting this property will automatically set the primarySlideDirection property to + /// CustomJointDirection. The entity defining the custom direction by be perpendicular to the normal direction. + /// To set this property, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + core::Ptr customPrimarySlideDirectionEntity() const; + bool customPrimarySlideDirectionEntity(const core::Ptr& value); + + /// Returns the direction of the secondary slide direction. This property will return null in the case + /// where the PlanarJointMotion object was obtained from a JointInput object. + core::Ptr secondarySlideDirectionVector() const; + + /// Gets and sets the rotation value. This is in radians. Setting this value is + /// the equivalent of using the Drive Joints command. + double rotationValue() const; + bool rotationValue(double value); + + /// Returns a JointLimits object that defines the limits of rotation for this joint. + /// Use the functionality of the returned JointLimits object to get, set, and modify + /// the joint limits. + core::Ptr rotationLimits() const; + + /// Gets and sets the offset value in the primary direction. This is in centimeters. + /// Setting this value is the equivalent of using the Drive Joints command. + double primarySlideValue() const; + bool primarySlideValue(double value); + + /// Returns a JointLimits object that defines the limits in the primary direction for this joint. + /// Use the functionality of the returned JointLimits object to get, set, and modify + /// the joint limits. + core::Ptr primarySlideLimits() const; + + /// Gets and sets the offset value in the secondary direction. This is in centimeters. + /// Setting this value is the equivalent of using the Drive Joints command. + double secondarySlideValue() const; + bool secondarySlideValue(double value); + + /// Returns a JointLimits object that defines the limits in the secondary direction for this joint. + /// Use the functionality of the returned JointLimits object to get, set, and modify + /// the joint limits. + core::Ptr secondarySlideLimits() const; + + ADSK_FUSION_PLANARJOINTMOTION_API static const char* classType(); + ADSK_FUSION_PLANARJOINTMOTION_API const char* objectType() const override; + ADSK_FUSION_PLANARJOINTMOTION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PLANARJOINTMOTION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual JointDirections normalDirection_raw() const = 0; + virtual bool normalDirection_raw(JointDirections value) = 0; + virtual core::Vector3D* normalDirectionVector_raw() const = 0; + virtual core::Base* customNormalDirectionEntity_raw() const = 0; + virtual bool customNormalDirectionEntity_raw(core::Base* value) = 0; + virtual JointDirections primarySlideDirection_raw() const = 0; + virtual core::Vector3D* primarySlideDirectionVector_raw() const = 0; + virtual core::Base* customPrimarySlideDirectionEntity_raw() const = 0; + virtual bool customPrimarySlideDirectionEntity_raw(core::Base* value) = 0; + virtual core::Vector3D* secondarySlideDirectionVector_raw() const = 0; + virtual double rotationValue_raw() const = 0; + virtual bool rotationValue_raw(double value) = 0; + virtual JointLimits* rotationLimits_raw() const = 0; + virtual double primarySlideValue_raw() const = 0; + virtual bool primarySlideValue_raw(double value) = 0; + virtual JointLimits* primarySlideLimits_raw() const = 0; + virtual double secondarySlideValue_raw() const = 0; + virtual bool secondarySlideValue_raw(double value) = 0; + virtual JointLimits* secondarySlideLimits_raw() const = 0; +}; + +// Inline wrappers + +inline JointDirections PlanarJointMotion::normalDirection() const +{ + JointDirections res = normalDirection_raw(); + return res; +} + +inline bool PlanarJointMotion::normalDirection(JointDirections value) +{ + return normalDirection_raw(value); +} + +inline core::Ptr PlanarJointMotion::normalDirectionVector() const +{ + core::Ptr res = normalDirectionVector_raw(); + return res; +} + +inline core::Ptr PlanarJointMotion::customNormalDirectionEntity() const +{ + core::Ptr res = customNormalDirectionEntity_raw(); + return res; +} + +inline bool PlanarJointMotion::customNormalDirectionEntity(const core::Ptr& value) +{ + return customNormalDirectionEntity_raw(value.get()); +} + +inline JointDirections PlanarJointMotion::primarySlideDirection() const +{ + JointDirections res = primarySlideDirection_raw(); + return res; +} + +inline core::Ptr PlanarJointMotion::primarySlideDirectionVector() const +{ + core::Ptr res = primarySlideDirectionVector_raw(); + return res; +} + +inline core::Ptr PlanarJointMotion::customPrimarySlideDirectionEntity() const +{ + core::Ptr res = customPrimarySlideDirectionEntity_raw(); + return res; +} + +inline bool PlanarJointMotion::customPrimarySlideDirectionEntity(const core::Ptr& value) +{ + return customPrimarySlideDirectionEntity_raw(value.get()); +} + +inline core::Ptr PlanarJointMotion::secondarySlideDirectionVector() const +{ + core::Ptr res = secondarySlideDirectionVector_raw(); + return res; +} + +inline double PlanarJointMotion::rotationValue() const +{ + double res = rotationValue_raw(); + return res; +} + +inline bool PlanarJointMotion::rotationValue(double value) +{ + return rotationValue_raw(value); +} + +inline core::Ptr PlanarJointMotion::rotationLimits() const +{ + core::Ptr res = rotationLimits_raw(); + return res; +} + +inline double PlanarJointMotion::primarySlideValue() const +{ + double res = primarySlideValue_raw(); + return res; +} + +inline bool PlanarJointMotion::primarySlideValue(double value) +{ + return primarySlideValue_raw(value); +} + +inline core::Ptr PlanarJointMotion::primarySlideLimits() const +{ + core::Ptr res = primarySlideLimits_raw(); + return res; +} + +inline double PlanarJointMotion::secondarySlideValue() const +{ + double res = secondarySlideValue_raw(); + return res; +} + +inline bool PlanarJointMotion::secondarySlideValue(double value) +{ + return secondarySlideValue_raw(value); +} + +inline core::Ptr PlanarJointMotion::secondarySlideLimits() const +{ + core::Ptr res = secondarySlideLimits_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PLANARJOINTMOTION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/RevoluteJointMotion.h b/usr/autodesk/CPP/include/Fusion/Components/RevoluteJointMotion.h new file mode 100644 index 0000000..7ce44ef --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/RevoluteJointMotion.h @@ -0,0 +1,141 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "JointMotion.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_REVOLUTEJOINTMOTION_CPP__ +# define ADSK_FUSION_REVOLUTEJOINTMOTION_API XI_EXPORT +# else +# define ADSK_FUSION_REVOLUTEJOINTMOTION_API +# endif +#else +# define ADSK_FUSION_REVOLUTEJOINTMOTION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class JointLimits; +}} +namespace adsk { namespace core { + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// Represents the set of information specific to a revolute joint. +class RevoluteJointMotion : public JointMotion { +public: + + /// Gets and sets the direction of the axis of rotation. This can be set to + /// XAxisJointDirection, YAxisJointDirection, or ZAxisJointDirection. It can + /// return those three directions and CustomJointDirection. If this returns + /// CustomJointDirection then the customRotationAxisEntity will return an entity + /// that defines the axis. If there is a custom rotation axis defined and this + /// property is set to one of the three standard axes, the custom rotation will + /// be removed and customRotationAxisEntity will return null. + JointDirections rotationAxis() const; + bool rotationAxis(JointDirections value); + + /// Returns the direction of the rotation axis. This property will return null in the case + /// where the RevolutionJointMotion object was obtained from a JointInput object. + core::Ptr rotationAxisVector() const; + + /// This property can be set using various types of entities that can infer an + /// axis. For example, a linear edge, sketch line, planar face, and cylindrical face. + /// This property is only valid in the case where the rotationAxis property returns + /// CustomJointDirection. Setting this property will automatically set + /// the rotationAxis property to CustomJointDirection. + core::Ptr customRotationAxisEntity() const; + bool customRotationAxisEntity(const core::Ptr& value); + + /// Gets and sets the rotation value. This is in radians. Setting this value is + /// the equivalent of using the Drive Joints command. + double rotationValue() const; + bool rotationValue(double value); + + /// Returns a JointLimits object that defines the rotation limits for this joint. + /// Use the functionality of the returned JointLimits object to get, set, and modify + /// the joint limits. + core::Ptr rotationLimits() const; + + ADSK_FUSION_REVOLUTEJOINTMOTION_API static const char* classType(); + ADSK_FUSION_REVOLUTEJOINTMOTION_API const char* objectType() const override; + ADSK_FUSION_REVOLUTEJOINTMOTION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_REVOLUTEJOINTMOTION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual JointDirections rotationAxis_raw() const = 0; + virtual bool rotationAxis_raw(JointDirections value) = 0; + virtual core::Vector3D* rotationAxisVector_raw() const = 0; + virtual core::Base* customRotationAxisEntity_raw() const = 0; + virtual bool customRotationAxisEntity_raw(core::Base* value) = 0; + virtual double rotationValue_raw() const = 0; + virtual bool rotationValue_raw(double value) = 0; + virtual JointLimits* rotationLimits_raw() const = 0; +}; + +// Inline wrappers + +inline JointDirections RevoluteJointMotion::rotationAxis() const +{ + JointDirections res = rotationAxis_raw(); + return res; +} + +inline bool RevoluteJointMotion::rotationAxis(JointDirections value) +{ + return rotationAxis_raw(value); +} + +inline core::Ptr RevoluteJointMotion::rotationAxisVector() const +{ + core::Ptr res = rotationAxisVector_raw(); + return res; +} + +inline core::Ptr RevoluteJointMotion::customRotationAxisEntity() const +{ + core::Ptr res = customRotationAxisEntity_raw(); + return res; +} + +inline bool RevoluteJointMotion::customRotationAxisEntity(const core::Ptr& value) +{ + return customRotationAxisEntity_raw(value.get()); +} + +inline double RevoluteJointMotion::rotationValue() const +{ + double res = rotationValue_raw(); + return res; +} + +inline bool RevoluteJointMotion::rotationValue(double value) +{ + return rotationValue_raw(value); +} + +inline core::Ptr RevoluteJointMotion::rotationLimits() const +{ + core::Ptr res = rotationLimits_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_REVOLUTEJOINTMOTION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/RigidGroup.h b/usr/autodesk/CPP/include/Fusion/Components/RigidGroup.h new file mode 100644 index 0000000..a71f8f2 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/RigidGroup.h @@ -0,0 +1,232 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_RIGIDGROUP_CPP__ +# define ADSK_FUSION_RIGIDGROUP_API XI_EXPORT +# else +# define ADSK_FUSION_RIGIDGROUP_API +# endif +#else +# define ADSK_FUSION_RIGIDGROUP_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Component; + class Occurrence; + class OccurrenceList; + class TimelineObject; +}} +namespace adsk { namespace core { + class Attributes; + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Represents a rigid group within an assembly. +class RigidGroup : public core::Base { +public: + + /// Returns the parent component that owns this rigid group. + core::Ptr parentComponent() const; + + /// Gets and sets the name of the rigid group as seen in the timeline. + std::string name() const; + bool name(const std::string& value); + + /// Deletes this rigid group. + /// Returns True if the delete was successful. + bool deleteMe(); + + /// Returns the list of occurrences that are part of the rigid group. + core::Ptr occurrences() const; + + /// Sets which occurrences are to be part of this rigid group. + /// To use this method, you need to position the timeline marker to immediately before this group. + /// This can be accomplished using the following code: group.timelineObject.rollTo(True) + /// occurrences : An ObjectCollection containing the occurrences to use in creating the rigid group. + /// includeChildren : Boolean indicating if the children of the input occurrences should be included in the rigid group. + /// Returns true if successful. + bool setOccurrences(const core::Ptr& occurrences, bool includeChildren); + + /// Returns the timeline object associated with this rigid group. + core::Ptr timelineObject() const; + + /// Gets and sets if this rigid group is suppressed. + bool isSuppressed() const; + bool isSuppressed(bool value); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this object + /// in an assembly. This is only valid in the case where this is acting + /// as a proxy in an assembly. Returns null in the case where the object + /// is not in the context of an assembly but is already the native object. + core::Ptr assemblyContext() const; + + /// Returns the collection of attributes associated with this rigid group. + core::Ptr attributes() const; + + /// Returns a token for the RigidGroup object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same rigid group. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + ADSK_FUSION_RIGIDGROUP_API static const char* classType(); + ADSK_FUSION_RIGIDGROUP_API const char* objectType() const override; + ADSK_FUSION_RIGIDGROUP_API void* queryInterface(const char* id) const override; + ADSK_FUSION_RIGIDGROUP_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Component* parentComponent_raw() const = 0; + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual bool deleteMe_raw() = 0; + virtual OccurrenceList* occurrences_raw() const = 0; + virtual bool setOccurrences_raw(core::ObjectCollection* occurrences, bool includeChildren) = 0; + virtual TimelineObject* timelineObject_raw() const = 0; + virtual bool isSuppressed_raw() const = 0; + virtual bool isSuppressed_raw(bool value) = 0; + virtual RigidGroup* nativeObject_raw() const = 0; + virtual RigidGroup* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr RigidGroup::parentComponent() const +{ + core::Ptr res = parentComponent_raw(); + return res; +} + +inline std::string RigidGroup::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool RigidGroup::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline bool RigidGroup::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline core::Ptr RigidGroup::occurrences() const +{ + core::Ptr res = occurrences_raw(); + return res; +} + +inline bool RigidGroup::setOccurrences(const core::Ptr& occurrences, bool includeChildren) +{ + bool res = setOccurrences_raw(occurrences.get(), includeChildren); + return res; +} + +inline core::Ptr RigidGroup::timelineObject() const +{ + core::Ptr res = timelineObject_raw(); + return res; +} + +inline bool RigidGroup::isSuppressed() const +{ + bool res = isSuppressed_raw(); + return res; +} + +inline bool RigidGroup::isSuppressed(bool value) +{ + return isSuppressed_raw(value); +} + +inline core::Ptr RigidGroup::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr RigidGroup::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr RigidGroup::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr RigidGroup::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline std::string RigidGroup::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_RIGIDGROUP_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/RigidGroupList.h b/usr/autodesk/CPP/include/Fusion/Components/RigidGroupList.h new file mode 100644 index 0000000..70aa83b --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/RigidGroupList.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_RIGIDGROUPLIST_CPP__ +# define ADSK_FUSION_RIGIDGROUPLIST_API XI_EXPORT +# else +# define ADSK_FUSION_RIGIDGROUPLIST_API +# endif +#else +# define ADSK_FUSION_RIGIDGROUPLIST_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class RigidGroup; +}} + +namespace adsk { namespace fusion { + +/// A list of rigid groups. +class RigidGroupList : public core::Base { +public: + + /// Function that returns the specified rigid group using an index into the list. + /// index : The index of the item within the list to return. The first item in the list has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified rigid group using a name. + /// name : The name of the item within the list to return. + /// Returns the specified item or null if an invalid name was specified. + core::Ptr itemByName(const std::string& name) const; + + /// Returns number of rigid groups in the list. + size_t count() const; + + typedef RigidGroup iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_RIGIDGROUPLIST_API static const char* classType(); + ADSK_FUSION_RIGIDGROUPLIST_API const char* objectType() const override; + ADSK_FUSION_RIGIDGROUPLIST_API void* queryInterface(const char* id) const override; + ADSK_FUSION_RIGIDGROUPLIST_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual RigidGroup* item_raw(size_t index) const = 0; + virtual RigidGroup* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr RigidGroupList::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr RigidGroupList::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t RigidGroupList::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void RigidGroupList::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_RIGIDGROUPLIST_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/RigidGroups.h b/usr/autodesk/CPP/include/Fusion/Components/RigidGroups.h new file mode 100644 index 0000000..d8b13b0 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/RigidGroups.h @@ -0,0 +1,117 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_RIGIDGROUPS_CPP__ +# define ADSK_FUSION_RIGIDGROUPS_API XI_EXPORT +# else +# define ADSK_FUSION_RIGIDGROUPS_API +# endif +#else +# define ADSK_FUSION_RIGIDGROUPS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class RigidGroup; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// The collection of rigid groups in this component. This provides access to all existing +/// rigid groups and supports the ability to create new rigid groups. +class RigidGroups : public core::Base { +public: + + /// Function that returns the specified rigid group using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified rigid group using a name. + /// name : The name of the item within the collection to return. + /// Returns the specified item or null if an invalid name was specified. + core::Ptr itemByName(const std::string& name) const; + + /// Returns number of joint origins in the collection. + size_t count() const; + + /// Creates a new rigid group. + /// occurrences : An ObjectCollection containing the occurrences to use in creating the rigid group. + /// includeChildren : Boolean indicating if the children of the input occurrences should be included in the rigid group. + /// Returns the new RigidGroup object or null in the case of failure. + core::Ptr add(const core::Ptr& occurrences, bool includeChildren); + + typedef RigidGroup iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_RIGIDGROUPS_API static const char* classType(); + ADSK_FUSION_RIGIDGROUPS_API const char* objectType() const override; + ADSK_FUSION_RIGIDGROUPS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_RIGIDGROUPS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual RigidGroup* item_raw(size_t index) const = 0; + virtual RigidGroup* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual RigidGroup* add_raw(core::ObjectCollection* occurrences, bool includeChildren) = 0; +}; + +// Inline wrappers + +inline core::Ptr RigidGroups::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr RigidGroups::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t RigidGroups::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr RigidGroups::add(const core::Ptr& occurrences, bool includeChildren) +{ + core::Ptr res = add_raw(occurrences.get(), includeChildren); + return res; +} + +template inline void RigidGroups::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_RIGIDGROUPS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/RigidJointMotion.h b/usr/autodesk/CPP/include/Fusion/Components/RigidJointMotion.h new file mode 100644 index 0000000..5413a90 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/RigidJointMotion.h @@ -0,0 +1,50 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "JointMotion.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_RIGIDJOINTMOTION_CPP__ +# define ADSK_FUSION_RIGIDJOINTMOTION_API XI_EXPORT +# else +# define ADSK_FUSION_RIGIDJOINTMOTION_API +# endif +#else +# define ADSK_FUSION_RIGIDJOINTMOTION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Represents the set of information specific to a rigid joint. A +/// rigid joint doesn't support any additional information beyond +/// getting the joint type which it derives from JointMotion. +class RigidJointMotion : public JointMotion { +public: + + ADSK_FUSION_RIGIDJOINTMOTION_API static const char* classType(); + ADSK_FUSION_RIGIDJOINTMOTION_API const char* objectType() const override; + ADSK_FUSION_RIGIDJOINTMOTION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_RIGIDJOINTMOTION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_RIGIDJOINTMOTION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Components/SliderJointMotion.h b/usr/autodesk/CPP/include/Fusion/Components/SliderJointMotion.h new file mode 100644 index 0000000..f5e6800 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Components/SliderJointMotion.h @@ -0,0 +1,143 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "JointMotion.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SLIDERJOINTMOTION_CPP__ +# define ADSK_FUSION_SLIDERJOINTMOTION_API XI_EXPORT +# else +# define ADSK_FUSION_SLIDERJOINTMOTION_API +# endif +#else +# define ADSK_FUSION_SLIDERJOINTMOTION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class JointLimits; +}} +namespace adsk { namespace core { + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// Represents the set of information specific to a slider joint. +class SliderJointMotion : public JointMotion { +public: + + /// Gets and sets the direction of the slide. This can be set to + /// XAxisJointDirection, YAxisJointDirection, or ZAxisJointDirection. It can + /// return those three directions and CustomJointDirection. If this returns + /// CustomJointDirection then the customSlideDirectionEntity will return an entity + /// that defines the direction. If there is a custom direction defined and this + /// property is set to one of the three standard axes, the custom direction will + /// be removed and customSlideDirectionEntity will return null. + JointDirections slideDirection() const; + bool slideDirection(JointDirections value); + + /// Returns the direction of the slide. This property will return null in the case + /// where the SliderJointMotion object was obtained from a JointInput object. + core::Ptr slideDirectionVector() const; + + /// This property can be set using various types of entities that can infer a + /// direction. For example, a linear edge, sketch line, planar face, and cylindrical face. + /// This property is only valid in the case where the slideDirection property returns + /// CustomJointDirection. Setting this property will automatically set + /// the slideDirection property to CustomJointDirection. + /// To set this property, you need to position the timeline marker to immediately before this joint. + /// This can be accomplished using the following code: thisJoint.timelineObject.rollTo(True) + core::Ptr customSlideDirectionEntity() const; + bool customSlideDirectionEntity(const core::Ptr& value); + + /// Gets and sets the slide value. This is in centimeters. Setting this value is + /// the equivalent of using the Drive Joints command. + double slideValue() const; + bool slideValue(double value); + + /// Returns a JointLimits object that defines the slide limits for this joint. + /// Use the functionality of the returned JointLimits object to get, set, and modify + /// the joint limits. + core::Ptr slideLimits() const; + + ADSK_FUSION_SLIDERJOINTMOTION_API static const char* classType(); + ADSK_FUSION_SLIDERJOINTMOTION_API const char* objectType() const override; + ADSK_FUSION_SLIDERJOINTMOTION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SLIDERJOINTMOTION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual JointDirections slideDirection_raw() const = 0; + virtual bool slideDirection_raw(JointDirections value) = 0; + virtual core::Vector3D* slideDirectionVector_raw() const = 0; + virtual core::Base* customSlideDirectionEntity_raw() const = 0; + virtual bool customSlideDirectionEntity_raw(core::Base* value) = 0; + virtual double slideValue_raw() const = 0; + virtual bool slideValue_raw(double value) = 0; + virtual JointLimits* slideLimits_raw() const = 0; +}; + +// Inline wrappers + +inline JointDirections SliderJointMotion::slideDirection() const +{ + JointDirections res = slideDirection_raw(); + return res; +} + +inline bool SliderJointMotion::slideDirection(JointDirections value) +{ + return slideDirection_raw(value); +} + +inline core::Ptr SliderJointMotion::slideDirectionVector() const +{ + core::Ptr res = slideDirectionVector_raw(); + return res; +} + +inline core::Ptr SliderJointMotion::customSlideDirectionEntity() const +{ + core::Ptr res = customSlideDirectionEntity_raw(); + return res; +} + +inline bool SliderJointMotion::customSlideDirectionEntity(const core::Ptr& value) +{ + return customSlideDirectionEntity_raw(value.get()); +} + +inline double SliderJointMotion::slideValue() const +{ + double res = slideValue_raw(); + return res; +} + +inline bool SliderJointMotion::slideValue(double value) +{ + return slideValue_raw(value); +} + +inline core::Ptr SliderJointMotion::slideLimits() const +{ + core::Ptr res = slideLimits_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SLIDERJOINTMOTION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxes.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxes.h new file mode 100644 index 0000000..f2fd6b3 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxes.h @@ -0,0 +1,143 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONAXES_CPP__ +# define ADSK_FUSION_CONSTRUCTIONAXES_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONAXES_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONAXES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Component; + class ConstructionAxis; + class ConstructionAxisInput; + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the construction axes within a component and provides +/// methods to create new construction axes. +class ConstructionAxes : public core::Base { +public: + + /// Function that returns the specified construction axis using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the specified construction axis using the name of the construction + /// axis as it is displayed in the browser. + /// name : The name of the axis as it is displayed in the browser + /// Returns the specified item or null if an invalid name was specified. + core::Ptr itemByName(const std::string& name) const; + + /// The number of construction axes in the collection. + size_t count() const; + + /// Create a ConstructionAxisInput object that is in turn used to create a ConstructionAxis. + /// occurrenceForCreation : A creation occurrence is needed if the input is in another component AND the + /// construction axis is not in the root component. The occurrenceForCreation is analogous + /// to the active occurrence in the UI. + /// Returns a ConstructionAxisInput object + core::Ptr createInput(const core::Ptr& occurrenceForCreation = NULL) const; + + /// Creates and adds a new ConstructionAxis using the creation parameters in the ConstructionAxisInput. + /// If the ConstructionAxisInput was defined using the setByLine method then + /// the add will only work in a direct edit model (do not capture design history) and will fail in a parametric model. + /// input : A ConstructionAxisInput object + /// Returns the newly created construction axis or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// The component that owns this collection. + core::Ptr component() const; + + typedef ConstructionAxis iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_CONSTRUCTIONAXES_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONAXES_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONAXES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONAXES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ConstructionAxis* item_raw(size_t index) const = 0; + virtual ConstructionAxis* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual ConstructionAxisInput* createInput_raw(Occurrence* occurrenceForCreation) const = 0; + virtual ConstructionAxis* add_raw(ConstructionAxisInput* input) = 0; + virtual Component* component_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionAxes::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr ConstructionAxes::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t ConstructionAxes::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr ConstructionAxes::createInput(const core::Ptr& occurrenceForCreation) const +{ + core::Ptr res = createInput_raw(occurrenceForCreation.get()); + return res; +} + +inline core::Ptr ConstructionAxes::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr ConstructionAxes::component() const +{ + core::Ptr res = component_raw(); + return res; +} + +template inline void ConstructionAxes::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONAXES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxis.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxis.h new file mode 100644 index 0000000..c87fa67 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxis.h @@ -0,0 +1,317 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONAXIS_CPP__ +# define ADSK_FUSION_CONSTRUCTIONAXIS_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONAXIS_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONAXIS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class Component; + class ConstructionAxisDefinition; + class Occurrence; + class TimelineObject; +}} +namespace adsk { namespace core { + class Attributes; + class InfiniteLine3D; +}} + +namespace adsk { namespace fusion { + +/// ConstructionAxis Object +class ConstructionAxis : public core::Base { +public: + + /// Returns an infinite line that represents the position and orientation of the + /// construction axis. This geometry is defined in the AssemblyContext of this + /// ConstructionAxis. + core::Ptr geometry() const; + + /// The name of the construction axis as it is shown in the browser. + std::string name() const; + bool name(const std::string& value); + + /// Returns the construction axis definition object which provides access to the information + /// defining the construction axis. + core::Ptr definition() const; + + /// Deletes the construction axis. + /// Returns a bool indicating if the delete was successful or not. + bool deleteMe(); + + /// Indicates if this construction axis is parametric or not. + bool isParametric() const; + + /// Indicates if this construction axis can be deleted. Base + /// construction axes can not be deleted. + bool isDeletable() const; + + /// Indicates if the light bulb (as displayed in the browser) is on. + /// A construction axis will only be visible if it's light bulb, and that of it's + /// containing folder and parent component/s are also on. + bool isLightBulbOn() const; + bool isLightBulbOn(bool value); + + /// Gets if the construction plane is visible. + /// This property is affected by the AssemblyContext of the construction axis. + bool isVisible() const; + + /// Returns the parent component or base feature. If both the design and the construction + /// axis are parametric, the parent will be a component. If the design is parametric and + /// the construction axis is not, the parent will be a base feature. If + /// the design is not parametric the parent will be a component. + core::Ptr parent() const; + + /// Returns the component this construction plane belongs to. + core::Ptr component() const; + + /// Returns the timeline object associated with this construction axis. + core::Ptr timelineObject() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this object + /// in an assembly. This is only valid in the case where this is acting + /// as a proxy in an assembly. Returns null in the case where the object + /// is not in the context of an assembly but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// If this construction axis is associated with a base feature, this property will return that base feature. + /// If it's not associated with a base feature, this property will return null. + core::Ptr baseFeature() const; + + /// Returns the collection of attributes associated with this construction axis. + core::Ptr attributes() const; + + /// Returns the current health state of this construction axis. + FeatureHealthStates healthState() const; + + /// Returns the error or warning message in the case where the healthState property returns either + /// WarningFeatureHealthState or ErrorFeatureHealthState. Otherwise this property returns an empty string. + std::string errorOrWarningMessage() const; + + /// Returns a token for the ConstructionAxis object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same construction axis. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + ADSK_FUSION_CONSTRUCTIONAXIS_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONAXIS_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONAXIS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONAXIS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::InfiniteLine3D* geometry_raw() const = 0; + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual ConstructionAxisDefinition* definition_raw() const = 0; + virtual bool deleteMe_raw() = 0; + virtual bool isParametric_raw() const = 0; + virtual bool isDeletable_raw() const = 0; + virtual bool isLightBulbOn_raw() const = 0; + virtual bool isLightBulbOn_raw(bool value) = 0; + virtual bool isVisible_raw() const = 0; + virtual core::Base* parent_raw() const = 0; + virtual Component* component_raw() const = 0; + virtual TimelineObject* timelineObject_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual ConstructionAxis* nativeObject_raw() const = 0; + virtual ConstructionAxis* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual BaseFeature* baseFeature_raw() const = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual FeatureHealthStates healthState_raw() const = 0; + virtual char* errorOrWarningMessage_raw() const = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionAxis::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline std::string ConstructionAxis::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool ConstructionAxis::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline core::Ptr ConstructionAxis::definition() const +{ + core::Ptr res = definition_raw(); + return res; +} + +inline bool ConstructionAxis::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline bool ConstructionAxis::isParametric() const +{ + bool res = isParametric_raw(); + return res; +} + +inline bool ConstructionAxis::isDeletable() const +{ + bool res = isDeletable_raw(); + return res; +} + +inline bool ConstructionAxis::isLightBulbOn() const +{ + bool res = isLightBulbOn_raw(); + return res; +} + +inline bool ConstructionAxis::isLightBulbOn(bool value) +{ + return isLightBulbOn_raw(value); +} + +inline bool ConstructionAxis::isVisible() const +{ + bool res = isVisible_raw(); + return res; +} + +inline core::Ptr ConstructionAxis::parent() const +{ + core::Ptr res = parent_raw(); + return res; +} + +inline core::Ptr ConstructionAxis::component() const +{ + core::Ptr res = component_raw(); + return res; +} + +inline core::Ptr ConstructionAxis::timelineObject() const +{ + core::Ptr res = timelineObject_raw(); + return res; +} + +inline core::Ptr ConstructionAxis::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr ConstructionAxis::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr ConstructionAxis::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr ConstructionAxis::baseFeature() const +{ + core::Ptr res = baseFeature_raw(); + return res; +} + +inline core::Ptr ConstructionAxis::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline FeatureHealthStates ConstructionAxis::healthState() const +{ + FeatureHealthStates res = healthState_raw(); + return res; +} + +inline std::string ConstructionAxis::errorOrWarningMessage() const +{ + std::string res; + + char* p= errorOrWarningMessage_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string ConstructionAxis::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONAXIS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisByLineDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisByLineDefinition.h new file mode 100644 index 0000000..db912d1 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisByLineDefinition.h @@ -0,0 +1,71 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionAxisDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONAXISBYLINEDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONAXISBYLINEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONAXISBYLINEDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONAXISBYLINEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class InfiniteLine3D; +}} + +namespace adsk { namespace fusion { + +/// The definition for a non-parametric construction axis. In a non-parametric design +/// all construction planes will return this type of definition regardless of how they +/// were initially created. +class ConstructionAxisByLineDefinition : public ConstructionAxisDefinition { +public: + + /// Gets and sets the infinite line that defines the position and direction of the axis + core::Ptr axis() const; + bool axis(const core::Ptr& value); + + ADSK_FUSION_CONSTRUCTIONAXISBYLINEDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONAXISBYLINEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONAXISBYLINEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONAXISBYLINEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::InfiniteLine3D* axis_raw() const = 0; + virtual bool axis_raw(core::InfiniteLine3D* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionAxisByLineDefinition::axis() const +{ + core::Ptr res = axis_raw(); + return res; +} + +inline bool ConstructionAxisByLineDefinition::axis(const core::Ptr& value) +{ + return axis_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONAXISBYLINEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisCircularFaceDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisCircularFaceDefinition.h new file mode 100644 index 0000000..d1f90ad --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisCircularFaceDefinition.h @@ -0,0 +1,70 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionAxisDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONAXISCIRCULARFACEDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONAXISCIRCULARFACEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONAXISCIRCULARFACEDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONAXISCIRCULARFACEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepFace; +}} + +namespace adsk { namespace fusion { + +/// The definition for a parametric construction axis created using the SetbyCircularFace method +class ConstructionAxisCircularFaceDefinition : public ConstructionAxisDefinition { +public: + + /// Gets and sets the cylinder, cone, or torus this work axis + /// is parametrically dependent on. + core::Ptr circularFace() const; + bool circularFace(const core::Ptr& value); + + ADSK_FUSION_CONSTRUCTIONAXISCIRCULARFACEDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONAXISCIRCULARFACEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONAXISCIRCULARFACEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONAXISCIRCULARFACEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepFace* circularFace_raw() const = 0; + virtual bool circularFace_raw(BRepFace* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionAxisCircularFaceDefinition::circularFace() const +{ + core::Ptr res = circularFace_raw(); + return res; +} + +inline bool ConstructionAxisCircularFaceDefinition::circularFace(const core::Ptr& value) +{ + return circularFace_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONAXISCIRCULARFACEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisDefinition.h new file mode 100644 index 0000000..17b5b92 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisDefinition.h @@ -0,0 +1,95 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONAXISDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONAXISDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONAXISDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONAXISDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ConstructionAxis; +}} + +namespace adsk { namespace fusion { + +/// A Base class to return the information (possibly parametric) used to +/// define a ConstructionAxis. +class ConstructionAxisDefinition : public core::Base { +public: + + /// Returns the ConstructionAxis object + core::Ptr parentConstructionAxis() const; + + ADSK_FUSION_CONSTRUCTIONAXISDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONAXISDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONAXISDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONAXISDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ConstructionAxis* parentConstructionAxis_raw() const = 0; + virtual void placeholderConstructionAxisDefinition0() {} + virtual void placeholderConstructionAxisDefinition1() {} + virtual void placeholderConstructionAxisDefinition2() {} + virtual void placeholderConstructionAxisDefinition3() {} + virtual void placeholderConstructionAxisDefinition4() {} + virtual void placeholderConstructionAxisDefinition5() {} + virtual void placeholderConstructionAxisDefinition6() {} + virtual void placeholderConstructionAxisDefinition7() {} + virtual void placeholderConstructionAxisDefinition8() {} + virtual void placeholderConstructionAxisDefinition9() {} + virtual void placeholderConstructionAxisDefinition10() {} + virtual void placeholderConstructionAxisDefinition11() {} + virtual void placeholderConstructionAxisDefinition12() {} + virtual void placeholderConstructionAxisDefinition13() {} + virtual void placeholderConstructionAxisDefinition14() {} + virtual void placeholderConstructionAxisDefinition15() {} + virtual void placeholderConstructionAxisDefinition16() {} + virtual void placeholderConstructionAxisDefinition17() {} + virtual void placeholderConstructionAxisDefinition18() {} + virtual void placeholderConstructionAxisDefinition19() {} + virtual void placeholderConstructionAxisDefinition20() {} + virtual void placeholderConstructionAxisDefinition21() {} + virtual void placeholderConstructionAxisDefinition22() {} + virtual void placeholderConstructionAxisDefinition23() {} + virtual void placeholderConstructionAxisDefinition24() {} + virtual void placeholderConstructionAxisDefinition25() {} + virtual void placeholderConstructionAxisDefinition26() {} + virtual void placeholderConstructionAxisDefinition27() {} + virtual void placeholderConstructionAxisDefinition28() {} + virtual void placeholderConstructionAxisDefinition29() {} + virtual void placeholderConstructionAxisDefinition30() {} +}; + +// Inline wrappers + +inline core::Ptr ConstructionAxisDefinition::parentConstructionAxis() const +{ + core::Ptr res = parentConstructionAxis_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONAXISDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisEdgeDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisEdgeDefinition.h new file mode 100644 index 0000000..838a152 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisEdgeDefinition.h @@ -0,0 +1,66 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionAxisDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONAXISEDGEDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONAXISEDGEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONAXISEDGEDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONAXISEDGEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// The definition for a parametric construction axis created using the SetbyEdge method +class ConstructionAxisEdgeDefinition : public ConstructionAxisDefinition { +public: + + /// Gets and sets the linear edge, construction line, or sketch line that defines + /// the construction axis. + core::Ptr edgeEntity() const; + bool edgeEntity(const core::Ptr& value); + + ADSK_FUSION_CONSTRUCTIONAXISEDGEDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONAXISEDGEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONAXISEDGEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONAXISEDGEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* edgeEntity_raw() const = 0; + virtual bool edgeEntity_raw(core::Base* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionAxisEdgeDefinition::edgeEntity() const +{ + core::Ptr res = edgeEntity_raw(); + return res; +} + +inline bool ConstructionAxisEdgeDefinition::edgeEntity(const core::Ptr& value) +{ + return edgeEntity_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONAXISEDGEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisInput.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisInput.h new file mode 100644 index 0000000..4157103 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisInput.h @@ -0,0 +1,215 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONAXISINPUT_CPP__ +# define ADSK_FUSION_CONSTRUCTIONAXISINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONAXISINPUT_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONAXISINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepFace; + class Occurrence; +}} +namespace adsk { namespace core { + class InfiniteLine3D; +}} + +namespace adsk { namespace fusion { + +/// A ConstructionAxisInput is a throwaway object used to create a ConstructionAxis +/// The usage pattern is: +/// a. create a ConstructionAxisInput (ConstructionAxes.CreateInput) +/// b. call one of the member functions to specify how the ConstructionAxis is created +/// c. create the ConstructionAxis (call ConstructionAxes.Add) +/// d. stop referencing the ConstructionAxisInput (so it gets deleted). +class ConstructionAxisInput : public core::Base { +public: + + /// This input method is for creating a non-parametric construction axis whose position + /// in space is defined by an InfiniteLine3D object. + /// This method of defining a construction axis is only valid when working in a direct edit model (do not capture design history). + /// This is not valid when working in a parametric model and will fail. + /// line : An InFiniteLine3D object + /// Returns true if the creation of the ConstructionAxisInput is successful. + bool setByLine(const core::Ptr& line); + + /// This input method is for creating an axis coincident with the axis of a + /// cylindrical, conical or torus face. + /// This can result in a parametric or non-parametric construction axis depending + /// on whether the parent component is parametric or is a direct edit component. + /// circularFace : The face from a cylinder, cone, or torus. + /// Returns true if the creation of the ConstructionAxisInput is successful. + bool setByCircularFace(const core::Ptr& circularFace); + + /// This input method is for creating an axis that is normal to a face + /// at a specified point. + /// face : A face (BRepFace object) to create the axis normal to. + /// pointEntity : A construction point, sketch point or vertex the axis is to pass through. + /// Returns true if the creation of the ConstructionAxisInput is successful. + bool setByPerpendicularAtPoint(const core::Ptr& face, const core::Ptr& pointEntity); + + /// This input method is for creating a construction axis coincident with the + /// intersection of two planes or planar faces. + /// This will fail if the two planes are parallel. + /// This can result in a parametric or non-parametric construction axis depending + /// on whether the parent component is parametric or is a direct edit component. + /// planarEntityOne : The first planar face or construction plane to intersect + /// planarEntityTwo : The second planar face or construction plane to intersect + /// Returns true if the creation of the ConstructionAxisInput is successful. + bool setByTwoPlanes(const core::Ptr& planarEntityOne, const core::Ptr& planarEntityTwo); + + /// This input method is for creating a construction axis that passes through the two points + /// (work points, sketch points or vertices). + /// This will fail if the two points are coincident. + /// This can result in a parametric or non-parametric construction axis depending + /// on whether the parent component is parametric or is a direct edit component. + /// pointEntityOne : The first construction point, sketch point or vertex the axis passes through + /// pointEntityTwo : The second construction point, sketch point or vertex the axis passes through + /// Returns true if the creation of the ConstructionAxisInput is successful. + bool setByTwoPoints(const core::Ptr& pointEntityOne, const core::Ptr& pointEntityTwo); + + /// This input method is for creating a construction axis from a specified linear/circular edge + /// or sketch curve. + /// This can result in a parametric or non-parametric construction axis depending + /// on whether the parent component is parametric or is a direct edit component. + /// edgeEntity : A linear/circular edge, construction line, or sketch line + /// Returns true if the creation of the ConstructionAxisInput is successful. + bool setByEdge(const core::Ptr& edgeEntity); + + /// This input method if for creating a construction axis normal to a specified face + /// or sketch profile and that passes through a specified point. + /// This can result in a parametric or non-parametric construction axis depending + /// on whether the parent component is parametric or is a direct edit component. + /// face : The face (BRepFace object) to create the axis normal to. + /// pointEntity : A construction point, sketch point or vertex the axis passes through. + /// This point does not have to lie on the face. + /// Returns true if the creation of the ConstructionAxisInput is successful. + bool setByNormalToFaceAtPoint(const core::Ptr& face, const core::Ptr& pointEntity); + + /// In order for geometry to be transformed correctly, an Occurrence for creation needs + /// to be specified when the ConstructionAxis is created based on geometry + /// (e.g. a straight edge) in another component AND (the ConstructionAxis) is not in the + /// root component. The CreationOccurrence is analogous to the active occurrence in the UI + core::Ptr creationOccurrence() const; + bool creationOccurrence(const core::Ptr& value); + + /// When creating a construction axis that is owned by a base or form feature, set this property to the + /// base or form feature you want to associate the new construction plane with. By default, this is null, + /// meaning it will not be associated with a base or form feature. + /// Because of a current limitation, if you want to create a construction axis associated with a base + /// or form feature, you must set this property AND call the edit method of the base or form feature, + /// create the feature, and then call the finishEdit method of the base or form feature. The base or form + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseOrFormFeature() const; + bool targetBaseOrFormFeature(const core::Ptr& value); + + ADSK_FUSION_CONSTRUCTIONAXISINPUT_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONAXISINPUT_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONAXISINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONAXISINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool setByLine_raw(core::InfiniteLine3D* line) = 0; + virtual bool setByCircularFace_raw(BRepFace* circularFace) = 0; + virtual bool setByPerpendicularAtPoint_raw(BRepFace* face, core::Base* pointEntity) = 0; + virtual bool setByTwoPlanes_raw(core::Base* planarEntityOne, core::Base* planarEntityTwo) = 0; + virtual bool setByTwoPoints_raw(core::Base* pointEntityOne, core::Base* pointEntityTwo) = 0; + virtual bool setByEdge_raw(core::Base* edgeEntity) = 0; + virtual bool setByNormalToFaceAtPoint_raw(BRepFace* face, core::Base* pointEntity) = 0; + virtual Occurrence* creationOccurrence_raw() const = 0; + virtual bool creationOccurrence_raw(Occurrence* value) = 0; + virtual core::Base* targetBaseOrFormFeature_raw() const = 0; + virtual bool targetBaseOrFormFeature_raw(core::Base* value) = 0; +}; + +// Inline wrappers + +inline bool ConstructionAxisInput::setByLine(const core::Ptr& line) +{ + bool res = setByLine_raw(line.get()); + return res; +} + +inline bool ConstructionAxisInput::setByCircularFace(const core::Ptr& circularFace) +{ + bool res = setByCircularFace_raw(circularFace.get()); + return res; +} + +inline bool ConstructionAxisInput::setByPerpendicularAtPoint(const core::Ptr& face, const core::Ptr& pointEntity) +{ + bool res = setByPerpendicularAtPoint_raw(face.get(), pointEntity.get()); + return res; +} + +inline bool ConstructionAxisInput::setByTwoPlanes(const core::Ptr& planarEntityOne, const core::Ptr& planarEntityTwo) +{ + bool res = setByTwoPlanes_raw(planarEntityOne.get(), planarEntityTwo.get()); + return res; +} + +inline bool ConstructionAxisInput::setByTwoPoints(const core::Ptr& pointEntityOne, const core::Ptr& pointEntityTwo) +{ + bool res = setByTwoPoints_raw(pointEntityOne.get(), pointEntityTwo.get()); + return res; +} + +inline bool ConstructionAxisInput::setByEdge(const core::Ptr& edgeEntity) +{ + bool res = setByEdge_raw(edgeEntity.get()); + return res; +} + +inline bool ConstructionAxisInput::setByNormalToFaceAtPoint(const core::Ptr& face, const core::Ptr& pointEntity) +{ + bool res = setByNormalToFaceAtPoint_raw(face.get(), pointEntity.get()); + return res; +} + +inline core::Ptr ConstructionAxisInput::creationOccurrence() const +{ + core::Ptr res = creationOccurrence_raw(); + return res; +} + +inline bool ConstructionAxisInput::creationOccurrence(const core::Ptr& value) +{ + return creationOccurrence_raw(value.get()); +} + +inline core::Ptr ConstructionAxisInput::targetBaseOrFormFeature() const +{ + core::Ptr res = targetBaseOrFormFeature_raw(); + return res; +} + +inline bool ConstructionAxisInput::targetBaseOrFormFeature(const core::Ptr& value) +{ + return targetBaseOrFormFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONAXISINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisNormalToFaceAtPointDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisNormalToFaceAtPointDefinition.h new file mode 100644 index 0000000..9842b79 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisNormalToFaceAtPointDefinition.h @@ -0,0 +1,82 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionAxisDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONAXISNORMALTOFACEATPOINTDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONAXISNORMALTOFACEATPOINTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONAXISNORMALTOFACEATPOINTDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONAXISNORMALTOFACEATPOINTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// The definition for a parametric construction axis created using the +/// SetByNormalToFaceAtPoint method +class ConstructionAxisNormalToFaceAtPointDefinition : public ConstructionAxisDefinition { +public: + + /// Gets the face the axis is normal to + core::Ptr face() const; + + /// Gets the point that positions the axis + core::Ptr pointEntity() const; + + /// Redefines the input geometry of the construction axis. + /// face : The face the axis is normal to + /// pointEntity : The point that positions the axis + /// Returns true if the redefinition of the construction axis is successful. + bool redefine(const core::Ptr& face, const core::Ptr& pointEntity); + + ADSK_FUSION_CONSTRUCTIONAXISNORMALTOFACEATPOINTDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONAXISNORMALTOFACEATPOINTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONAXISNORMALTOFACEATPOINTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONAXISNORMALTOFACEATPOINTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* face_raw() const = 0; + virtual core::Base* pointEntity_raw() const = 0; + virtual bool redefine_raw(core::Base* face, core::Base* pointEntity) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionAxisNormalToFaceAtPointDefinition::face() const +{ + core::Ptr res = face_raw(); + return res; +} + +inline core::Ptr ConstructionAxisNormalToFaceAtPointDefinition::pointEntity() const +{ + core::Ptr res = pointEntity_raw(); + return res; +} + +inline bool ConstructionAxisNormalToFaceAtPointDefinition::redefine(const core::Ptr& face, const core::Ptr& pointEntity) +{ + bool res = redefine_raw(face.get(), pointEntity.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONAXISNORMALTOFACEATPOINTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisPerpendicularAtPointDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisPerpendicularAtPointDefinition.h new file mode 100644 index 0000000..8213955 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisPerpendicularAtPointDefinition.h @@ -0,0 +1,86 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionAxisDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONAXISPERPENDICULARATPOINTDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONAXISPERPENDICULARATPOINTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONAXISPERPENDICULARATPOINTDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONAXISPERPENDICULARATPOINTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepFace; +}} + +namespace adsk { namespace fusion { + +/// The definition for a parametric construction axis created using the +/// SetByPerpendicularAtPoint method +class ConstructionAxisPerpendicularAtPointDefinition : public ConstructionAxisDefinition { +public: + + /// Returns the face the construction axis is perpendicular to. + core::Ptr face() const; + + /// Returns the point (construction or sketch point) that positions the axis. + core::Ptr point() const; + + /// Redefines the input geometry of the construction axis. + /// face : The face (BRepFace object) to create the axis perpendicular to. + /// pointEntity : The point (sketch point, vertex, construction point) used to position the axis. + /// Returns true if the redefinition of the axis is successful. + bool redefine(const core::Ptr& face, const core::Ptr& pointEntity); + + ADSK_FUSION_CONSTRUCTIONAXISPERPENDICULARATPOINTDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONAXISPERPENDICULARATPOINTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONAXISPERPENDICULARATPOINTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONAXISPERPENDICULARATPOINTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepFace* face_raw() const = 0; + virtual core::Base* point_raw() const = 0; + virtual bool redefine_raw(BRepFace* face, core::Base* pointEntity) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionAxisPerpendicularAtPointDefinition::face() const +{ + core::Ptr res = face_raw(); + return res; +} + +inline core::Ptr ConstructionAxisPerpendicularAtPointDefinition::point() const +{ + core::Ptr res = point_raw(); + return res; +} + +inline bool ConstructionAxisPerpendicularAtPointDefinition::redefine(const core::Ptr& face, const core::Ptr& pointEntity) +{ + bool res = redefine_raw(face.get(), pointEntity.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONAXISPERPENDICULARATPOINTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisTwoPlaneDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisTwoPlaneDefinition.h new file mode 100644 index 0000000..102b7ae --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisTwoPlaneDefinition.h @@ -0,0 +1,81 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionAxisDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONAXISTWOPLANEDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONAXISTWOPLANEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONAXISTWOPLANEDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONAXISTWOPLANEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// The definition for a parametric construction axis created using the SetByTwoPlanes method +class ConstructionAxisTwoPlaneDefinition : public ConstructionAxisDefinition { +public: + + /// Gets the first planar face or construction plane + core::Ptr planarEntityOne() const; + + /// Gets the second planar face or construction plane + core::Ptr planarEntityTwo() const; + + /// Redefines the input geometry of the construction axis. + /// planarEntityOne : The first planar face or construction plane + /// planarEntityTwo : The second planar face or construction plane + /// Returns true if the redefinition of the axis is successful. + bool redefine(const core::Ptr& planarEntityOne, const core::Ptr& planarEntityTwo); + + ADSK_FUSION_CONSTRUCTIONAXISTWOPLANEDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONAXISTWOPLANEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONAXISTWOPLANEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONAXISTWOPLANEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* planarEntityOne_raw() const = 0; + virtual core::Base* planarEntityTwo_raw() const = 0; + virtual bool redefine_raw(core::Base* planarEntityOne, core::Base* planarEntityTwo) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionAxisTwoPlaneDefinition::planarEntityOne() const +{ + core::Ptr res = planarEntityOne_raw(); + return res; +} + +inline core::Ptr ConstructionAxisTwoPlaneDefinition::planarEntityTwo() const +{ + core::Ptr res = planarEntityTwo_raw(); + return res; +} + +inline bool ConstructionAxisTwoPlaneDefinition::redefine(const core::Ptr& planarEntityOne, const core::Ptr& planarEntityTwo) +{ + bool res = redefine_raw(planarEntityOne.get(), planarEntityTwo.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONAXISTWOPLANEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisTwoPointDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisTwoPointDefinition.h new file mode 100644 index 0000000..98fbe71 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionAxisTwoPointDefinition.h @@ -0,0 +1,81 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionAxisDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONAXISTWOPOINTDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONAXISTWOPOINTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONAXISTWOPOINTDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONAXISTWOPOINTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// The definition for a parametric construction axis created using the SetbyTwoPoints method +class ConstructionAxisTwoPointDefinition : public ConstructionAxisDefinition { +public: + + /// Gets the first point. + core::Ptr pointEntityOne() const; + + /// Gets the second point. + core::Ptr pointEntityTwo() const; + + /// Redefines the input geometry of the construction axis. + /// pointEntityOne : The first point + /// pointEntityTwo : The second point + /// Returns true if the redefinition of the construction axis is successful. + bool redefine(const core::Ptr& pointEntityOne, const core::Ptr& pointEntityTwo); + + ADSK_FUSION_CONSTRUCTIONAXISTWOPOINTDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONAXISTWOPOINTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONAXISTWOPOINTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONAXISTWOPOINTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* pointEntityOne_raw() const = 0; + virtual core::Base* pointEntityTwo_raw() const = 0; + virtual bool redefine_raw(core::Base* pointEntityOne, core::Base* pointEntityTwo) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionAxisTwoPointDefinition::pointEntityOne() const +{ + core::Ptr res = pointEntityOne_raw(); + return res; +} + +inline core::Ptr ConstructionAxisTwoPointDefinition::pointEntityTwo() const +{ + core::Ptr res = pointEntityTwo_raw(); + return res; +} + +inline bool ConstructionAxisTwoPointDefinition::redefine(const core::Ptr& pointEntityOne, const core::Ptr& pointEntityTwo) +{ + bool res = redefine_raw(pointEntityOne.get(), pointEntityTwo.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONAXISTWOPOINTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlane.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlane.h new file mode 100644 index 0000000..0af8d77 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlane.h @@ -0,0 +1,356 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPLANE_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPLANE_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPLANE_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPLANE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class Component; + class ConstructionPlaneDefinition; + class Occurrence; + class TimelineObject; +}} +namespace adsk { namespace core { + class Attributes; + class BoundingBox2D; + class Matrix3D; + class Plane; +}} + +namespace adsk { namespace fusion { + +/// ConstructionPlane Object +class ConstructionPlane : public core::Base { +public: + + /// Returns a plane that represents the position and orientation of the construction plane. + /// This geometry is defined in the AssemblyContext of this ConstructionPlane. + core::Ptr geometry() const; + + /// Returns the name of the construction plane as it is shown in the browser. + std::string name() const; + bool name(const std::string& value); + + /// Returns the ConstructionPlaneDefinition object which provides access to the information + /// defining this ConstructionPlane. + core::Ptr definition() const; + + /// Deletes the construction plane. + /// Returns a bool indicating if the delete was successful or not. + bool deleteMe(); + + /// Indicates if this construction plane can be deleted. Base + /// construction planes can not be deleted. + bool isDeletable() const; + + /// Indicates if this construction plane is parametric or not. + bool isParametric() const; + + /// Indicates if the light bulb (as displayed in the browser) is on. + /// A construction plane will only be visible if it's light bulb, and that of it's + /// containing folder and parent component/s are also on. + bool isLightBulbOn() const; + bool isLightBulbOn(bool value); + + /// Indicates if the construction plane is visible. + /// This property is affected by the AssemblyContext of the construction plane. + bool isVisible() const; + + /// Gets and sets the display size of the construction plane. The bounding + /// box defines the min and max corners of the plane as defined in the + /// 2D space of the construction plane. + core::Ptr displayBounds() const; + bool displayBounds(const core::Ptr& value); + + /// Returns the parent component or base feature. If both the design and the construction + /// plane are parametric, the parent will be a component. If the design is parametric and + /// the construction plane is not, the parent will be a base feature. If + /// the design is not parametric the parent will be a component. + core::Ptr parent() const; + + /// Returns the component this construction plane belongs to. + core::Ptr component() const; + + /// Returns the timeline object associated with this construction plane. + core::Ptr timelineObject() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this object + /// in an assembly. This is only valid in the case where this is acting + /// as a proxy in an assembly. Returns null in the case where the object + /// is not in the context of an assembly but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// If this construction plane is associated with a base feature, this property will return that base feature. + /// If it's not associated with a base feature, this property will return null. + core::Ptr baseFeature() const; + + /// Returns the collection of attributes associated with this construction plane. + core::Ptr attributes() const; + + /// Returns the current health state of this construction plane. + FeatureHealthStates healthState() const; + + /// Returns the error or warning message in the case where the healthState property returns either + /// WarningFeatureHealthState or ErrorFeatureHealthState. Otherwise this property returns an empty string. + std::string errorOrWarningMessage() const; + + /// Returns the current position and orientation of the construction plane as a matrix. + /// For a parametric construction plane, this property is read-only. For a construction + /// plane in a direct modeling model or in a base feature, this is read-write and can be + /// used to reposition the constructions plane. + core::Ptr transform() const; + bool transform(const core::Ptr& value); + + /// Returns a token for the ConstructionPlane object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same construction plane. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + ADSK_FUSION_CONSTRUCTIONPLANE_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPLANE_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPLANE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPLANE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Plane* geometry_raw() const = 0; + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual ConstructionPlaneDefinition* definition_raw() const = 0; + virtual bool deleteMe_raw() = 0; + virtual bool isDeletable_raw() const = 0; + virtual bool isParametric_raw() const = 0; + virtual bool isLightBulbOn_raw() const = 0; + virtual bool isLightBulbOn_raw(bool value) = 0; + virtual bool isVisible_raw() const = 0; + virtual core::BoundingBox2D* displayBounds_raw() const = 0; + virtual bool displayBounds_raw(core::BoundingBox2D* value) = 0; + virtual core::Base* parent_raw() const = 0; + virtual Component* component_raw() const = 0; + virtual TimelineObject* timelineObject_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual ConstructionPlane* nativeObject_raw() const = 0; + virtual ConstructionPlane* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual BaseFeature* baseFeature_raw() const = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual FeatureHealthStates healthState_raw() const = 0; + virtual char* errorOrWarningMessage_raw() const = 0; + virtual core::Matrix3D* transform_raw() const = 0; + virtual bool transform_raw(core::Matrix3D* value) = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPlane::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline std::string ConstructionPlane::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool ConstructionPlane::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline core::Ptr ConstructionPlane::definition() const +{ + core::Ptr res = definition_raw(); + return res; +} + +inline bool ConstructionPlane::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline bool ConstructionPlane::isDeletable() const +{ + bool res = isDeletable_raw(); + return res; +} + +inline bool ConstructionPlane::isParametric() const +{ + bool res = isParametric_raw(); + return res; +} + +inline bool ConstructionPlane::isLightBulbOn() const +{ + bool res = isLightBulbOn_raw(); + return res; +} + +inline bool ConstructionPlane::isLightBulbOn(bool value) +{ + return isLightBulbOn_raw(value); +} + +inline bool ConstructionPlane::isVisible() const +{ + bool res = isVisible_raw(); + return res; +} + +inline core::Ptr ConstructionPlane::displayBounds() const +{ + core::Ptr res = displayBounds_raw(); + return res; +} + +inline bool ConstructionPlane::displayBounds(const core::Ptr& value) +{ + return displayBounds_raw(value.get()); +} + +inline core::Ptr ConstructionPlane::parent() const +{ + core::Ptr res = parent_raw(); + return res; +} + +inline core::Ptr ConstructionPlane::component() const +{ + core::Ptr res = component_raw(); + return res; +} + +inline core::Ptr ConstructionPlane::timelineObject() const +{ + core::Ptr res = timelineObject_raw(); + return res; +} + +inline core::Ptr ConstructionPlane::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr ConstructionPlane::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr ConstructionPlane::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr ConstructionPlane::baseFeature() const +{ + core::Ptr res = baseFeature_raw(); + return res; +} + +inline core::Ptr ConstructionPlane::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline FeatureHealthStates ConstructionPlane::healthState() const +{ + FeatureHealthStates res = healthState_raw(); + return res; +} + +inline std::string ConstructionPlane::errorOrWarningMessage() const +{ + std::string res; + + char* p= errorOrWarningMessage_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline core::Ptr ConstructionPlane::transform() const +{ + core::Ptr res = transform_raw(); + return res; +} + +inline bool ConstructionPlane::transform(const core::Ptr& value) +{ + return transform_raw(value.get()); +} + +inline std::string ConstructionPlane::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPLANE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneAtAngleDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneAtAngleDefinition.h new file mode 100644 index 0000000..da48eaa --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneAtAngleDefinition.h @@ -0,0 +1,105 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionPlaneDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPLANEATANGLEDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPLANEATANGLEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPLANEATANGLEDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPLANEATANGLEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Parameter; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// ConstructionPlaneAtAngleDefinition defines a ConstructionPlane by... +class ConstructionPlaneAtAngleDefinition : public ConstructionPlaneDefinition { +public: + + /// Returns a Value object that for a transient definition provides the current + /// assigned value. For a definition associated with a construction plane, this + /// provides access to the associated parameter controlling the angle. + core::Ptr angle() const; + + /// Gets the linear edge, construction line, or sketch line that defines + /// the axis of rotation for the construction plane. + core::Ptr linearEntity() const; + + /// Gets the planar face or construction plane the angle for this + /// construction plane is measured from and is parametrically dependent on. + core::Ptr planarEntity() const; + + /// Redefines the input geometry of the construction plane. + /// angle : A ValueInput object that defines the angle at which to create the construction plane + /// linearEntity : The linear edge, construction line, or sketch line that defines the axis of rotation to + /// measure the angle about + /// planarEntity : A plane, planar face or construction plane the angle of the construction plane is + /// measured from + /// Returns true if the redefinition of the plane is successful. + bool redefine(const core::Ptr& angle, const core::Ptr& linearEntity, const core::Ptr& planarEntity); + + ADSK_FUSION_CONSTRUCTIONPLANEATANGLEDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPLANEATANGLEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPLANEATANGLEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPLANEATANGLEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Parameter* angle_raw() const = 0; + virtual core::Base* linearEntity_raw() const = 0; + virtual core::Base* planarEntity_raw() const = 0; + virtual bool redefine_raw(core::ValueInput* angle, core::Base* linearEntity, core::Base* planarEntity) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPlaneAtAngleDefinition::angle() const +{ + core::Ptr res = angle_raw(); + return res; +} + +inline core::Ptr ConstructionPlaneAtAngleDefinition::linearEntity() const +{ + core::Ptr res = linearEntity_raw(); + return res; +} + +inline core::Ptr ConstructionPlaneAtAngleDefinition::planarEntity() const +{ + core::Ptr res = planarEntity_raw(); + return res; +} + +inline bool ConstructionPlaneAtAngleDefinition::redefine(const core::Ptr& angle, const core::Ptr& linearEntity, const core::Ptr& planarEntity) +{ + bool res = redefine_raw(angle.get(), linearEntity.get(), planarEntity.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPLANEATANGLEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneByPlaneDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneByPlaneDefinition.h new file mode 100644 index 0000000..71bd3b8 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneByPlaneDefinition.h @@ -0,0 +1,70 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionPlaneDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPLANEBYPLANEDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPLANEBYPLANEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPLANEBYPLANEDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPLANEBYPLANEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Plane; +}} + +namespace adsk { namespace fusion { + +/// The definition for a non-parametric construction plane. All constructions planes will +/// return this type of definition regardless of method used to initially create them. +class ConstructionPlaneByPlaneDefinition : public ConstructionPlaneDefinition { +public: + + /// Gets and sets the position of the construction plane. + core::Ptr plane() const; + bool plane(const core::Ptr& value); + + ADSK_FUSION_CONSTRUCTIONPLANEBYPLANEDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPLANEBYPLANEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPLANEBYPLANEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPLANEBYPLANEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Plane* plane_raw() const = 0; + virtual bool plane_raw(core::Plane* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPlaneByPlaneDefinition::plane() const +{ + core::Ptr res = plane_raw(); + return res; +} + +inline bool ConstructionPlaneByPlaneDefinition::plane(const core::Ptr& value) +{ + return plane_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPLANEBYPLANEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneDefinition.h new file mode 100644 index 0000000..df4239f --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneDefinition.h @@ -0,0 +1,94 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPLANEDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPLANEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPLANEDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPLANEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ConstructionPlane; +}} + +namespace adsk { namespace fusion { + +/// A Base class to return the information, possibly parametric, used to define the ConstructionPlane. +class ConstructionPlaneDefinition : public core::Base { +public: + + /// Returns the ConstructionPlane object + core::Ptr parentConstructionPlane() const; + + ADSK_FUSION_CONSTRUCTIONPLANEDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPLANEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPLANEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPLANEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ConstructionPlane* parentConstructionPlane_raw() const = 0; + virtual void placeholderConstructionPlaneDefinition0() {} + virtual void placeholderConstructionPlaneDefinition1() {} + virtual void placeholderConstructionPlaneDefinition2() {} + virtual void placeholderConstructionPlaneDefinition3() {} + virtual void placeholderConstructionPlaneDefinition4() {} + virtual void placeholderConstructionPlaneDefinition5() {} + virtual void placeholderConstructionPlaneDefinition6() {} + virtual void placeholderConstructionPlaneDefinition7() {} + virtual void placeholderConstructionPlaneDefinition8() {} + virtual void placeholderConstructionPlaneDefinition9() {} + virtual void placeholderConstructionPlaneDefinition10() {} + virtual void placeholderConstructionPlaneDefinition11() {} + virtual void placeholderConstructionPlaneDefinition12() {} + virtual void placeholderConstructionPlaneDefinition13() {} + virtual void placeholderConstructionPlaneDefinition14() {} + virtual void placeholderConstructionPlaneDefinition15() {} + virtual void placeholderConstructionPlaneDefinition16() {} + virtual void placeholderConstructionPlaneDefinition17() {} + virtual void placeholderConstructionPlaneDefinition18() {} + virtual void placeholderConstructionPlaneDefinition19() {} + virtual void placeholderConstructionPlaneDefinition20() {} + virtual void placeholderConstructionPlaneDefinition21() {} + virtual void placeholderConstructionPlaneDefinition22() {} + virtual void placeholderConstructionPlaneDefinition23() {} + virtual void placeholderConstructionPlaneDefinition24() {} + virtual void placeholderConstructionPlaneDefinition25() {} + virtual void placeholderConstructionPlaneDefinition26() {} + virtual void placeholderConstructionPlaneDefinition27() {} + virtual void placeholderConstructionPlaneDefinition28() {} + virtual void placeholderConstructionPlaneDefinition29() {} + virtual void placeholderConstructionPlaneDefinition30() {} +}; + +// Inline wrappers + +inline core::Ptr ConstructionPlaneDefinition::parentConstructionPlane() const +{ + core::Ptr res = parentConstructionPlane_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPLANEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneDistanceOnPathDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneDistanceOnPathDefinition.h new file mode 100644 index 0000000..0d21504 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneDistanceOnPathDefinition.h @@ -0,0 +1,89 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionPlaneDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPLANEDISTANCEONPATHDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPLANEDISTANCEONPATHDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPLANEDISTANCEONPATHDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPLANEDISTANCEONPATHDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Parameter; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// ConstructionDistanceOnPathDefinition defines a ConstructionPlane normal to an edge or +/// sketch profile at a specified position along the path defined by the edge or sketch profile. +class ConstructionPlaneDistanceOnPathDefinition : public ConstructionPlaneDefinition { +public: + + /// Gets the sketch curve, edge, or a profile object. + core::Ptr pathEntity() const; + + /// Redefines the input defining the construction plane. + /// pathEntity : The sketch curve, edge, or a profile object + /// distance : The ValueInput object that defines the distance along the path + /// Returns true if the redefinition of the plane is successful. + bool redefine(const core::Ptr& pathEntity, const core::Ptr& distance); + + /// Gets the distance along the path. + core::Ptr distance() const; + + ADSK_FUSION_CONSTRUCTIONPLANEDISTANCEONPATHDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPLANEDISTANCEONPATHDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPLANEDISTANCEONPATHDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPLANEDISTANCEONPATHDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* pathEntity_raw() const = 0; + virtual bool redefine_raw(core::Base* pathEntity, core::ValueInput* distance) = 0; + virtual Parameter* distance_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPlaneDistanceOnPathDefinition::pathEntity() const +{ + core::Ptr res = pathEntity_raw(); + return res; +} + +inline bool ConstructionPlaneDistanceOnPathDefinition::redefine(const core::Ptr& pathEntity, const core::Ptr& distance) +{ + bool res = redefine_raw(pathEntity.get(), distance.get()); + return res; +} + +inline core::Ptr ConstructionPlaneDistanceOnPathDefinition::distance() const +{ + core::Ptr res = distance_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPLANEDISTANCEONPATHDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneInput.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneInput.h new file mode 100644 index 0000000..c3675d9 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneInput.h @@ -0,0 +1,260 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPLANEINPUT_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPLANEINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPLANEINPUT_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPLANEINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepFace; + class Occurrence; +}} +namespace adsk { namespace core { + class Plane; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// A ConstructionPlaneInput is a throwaway object used to create a ConstructionPlane +/// The usage pattern is: +/// a. create a ConstructionPlaneInput (ConstructionPlanes.CreateInput) +/// b. call one of the member functions to specify how the ConstructionPlane is created +/// c. create the ConstructionPlane (call ConstructionPlanes.Add) +/// d. stop referencing the ConstructionPlaneInput (so it gets deleted). +class ConstructionPlaneInput : public core::Base { +public: + + /// This input method is for creating a non-parametric construction plane positioned in + /// space as defined by the input Plane object. + /// This method of defining a construction plane is only valid when working in a direct edit model (do not capture design history). + /// This is not valid when working in a parametric model and will fail. + /// plane : A transient plane object + /// Returns true if the construction plane definition is successful. + bool setByPlane(const core::Ptr& plane); + + /// This input method is for creating a construction plane that is offset from a planar + /// face or construction plane at a specified distance. This can result in + /// a parametric or non-parametric construction plane depending on whether the parent + /// component is parametric or is a direct edit component. + /// planarEntity : A plane, planar face or construction plane from which to create the offset plane + /// offset : ValueInput object that specifies the offset distance for the plane + /// Returns true if the construction plane definition is successful. + bool setByOffset(const core::Ptr& planarEntity, const core::Ptr& offset); + + /// This input method is for creating a construction plane through an edge, axis or line + /// at a specified angle. This can result in a parametric or non-parametric construction + /// plane depending on whether the parent component is parametric or is a direct edit + /// component. + /// linearEntity : The axis about which to rotate the plane + /// angle : The angle at which to create the plane + /// planarEntity : The planar face or construction plane the angle is measured from. + /// Returns true if the construction plane definition is successful. + bool setByAngle(const core::Ptr& linearEntity, const core::Ptr& angle, const core::Ptr& planarEntity); + + /// This input method is for creating a construction plane tangent to a cylindrical or + /// conical face at a specified point. This can result in a parametric or non-parametric construction + /// plane depending on whether the parent component is parametric or is a direct edit + /// component. + /// tangentFace : A cylindrical or conical face to create the plane tangent to + /// angle : The angle relative to the planarEntity input at which to create the tangent plane + /// planarEntity : The planar face or construction plane the tangent is measured from. + /// Returns true if the construction plane definition is successful. + bool setByTangent(const core::Ptr& tangentFace, const core::Ptr& angle, const core::Ptr& planarEntity); + + /// This input method is for creating a construction plane at the midpoint between + /// two planar faces or construction planes. This can result in a parametric or + /// non-parametric construction plane depending on whether the parent component is + /// parametric or is a direct edit component. + /// planarEntityOne : The first planar face or construction plane to create a bisecting plane between + /// planarEntityTwo : The second planar face or construction plane to create a bisecting plane between + /// Returns true if the construction plane definition is successful. + /// This will fail if the two planes are co-planar. + bool setByTwoPlanes(const core::Ptr& planarEntityOne, const core::Ptr& planarEntityTwo); + + /// This input method is for creating a construction plane that passes through two + /// coplanar linear entities or axes. + /// Defines a plane by specifying two coplanar linear entities. This can result in a + /// parametric or non-parametric construction plane depending on whether the parent + /// component is parametric or is a direct edit component. + /// linearEntityOne : The first of two coplanar linear entities to define the plane + /// linearEntityTwo : The second of two coplanar linear entities to define the plane + /// Returns true if the construction plane definition is successful. + /// This will fail if the two linear entities are not coplanar. + bool setByTwoEdges(const core::Ptr& linearEntityOne, const core::Ptr& linearEntityTwo); + + /// This input method is for creating a construction plane through three points that + /// define a triangle. This can result in a parametric or non-parametric construction + /// plane depending on whether the parent component is parametric or is a direct edit + /// component. + /// pointEntityOne : The first construction point, sketch point or vertex in the triangle + /// pointEntityTwo : The second construction point, sketch point or vertex in the triangle + /// pointEntityThree : The third construction point, sketch point or vertex in the triangle + /// Returns true if the construction plane definition is successful. + /// This will fail if the points do not form a triangle (no two + /// points can be coincident and all three cannot be collinear). + bool setByThreePoints(const core::Ptr& pointEntityOne, const core::Ptr& pointEntityTwo, const core::Ptr& pointEntityThree); + + /// This input method is for creating a construction plane tangent to a face + /// and aligned to a point. This can result in a parametric or non-parametric + /// construction plane depending on whether the parent component is parametric or is a + /// direct edit component. + /// tangentFace : A face to create the plane tangent to + /// pointEntity : A construction point, sketch point or vertex the tangent plane aligns to. + /// This point need not lie on the tangent face. + /// Returns true if the construction plane definition is successful. + bool setByTangentAtPoint(const core::Ptr& tangentFace, const core::Ptr& pointEntity); + + /// This input method is for creating a construction plane normal to, and at + /// specified distance along, a path defined by an edge or sketch profile. + /// This can result in a parametric or non-parametric + /// construction plane depending on whether the parent component is parametric or is a + /// direct edit component. + /// pathEntity : The path can be an edge, sketch curve, or a path of multiple entities. + /// distance : The distance is a value from 0 to 1 indicating the position along the path where 0 + /// is at the start and 1 is at the end. + /// Returns true if the construction plane definition is successful. + bool setByDistanceOnPath(const core::Ptr& pathEntity, const core::Ptr& distance); + + /// In order for geometry to be transformed correctly, an Occurrence for creation needs to be + /// specified when the ConstructionPlane is created based on geometry (e.g. a planarEntity) + /// in another component AND (the ConstructionPlane) is not in the root component. + /// The CreationOccurrence is analogous to the active occurrence in the UI + core::Ptr creationOccurrence() const; + bool creationOccurrence(const core::Ptr& value); + + /// When creating a construction plane that is owned by a base or form feature, set this property to the + /// base or form feature you want to associate the new construction plane with. By default, this is null, + /// meaning it will not be associated with a base or form feature. + /// Because of a current limitation, if you want to create a construction plane associated with a base + /// or form feature, you must set this property AND call the edit method of the base or form feature, + /// create the feature, and then call the finishEdit method of the base or form feature. The base or form + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseOrFormFeature() const; + bool targetBaseOrFormFeature(const core::Ptr& value); + + ADSK_FUSION_CONSTRUCTIONPLANEINPUT_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPLANEINPUT_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPLANEINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPLANEINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool setByPlane_raw(core::Plane* plane) = 0; + virtual bool setByOffset_raw(core::Base* planarEntity, core::ValueInput* offset) = 0; + virtual bool setByAngle_raw(core::Base* linearEntity, core::ValueInput* angle, core::Base* planarEntity) = 0; + virtual bool setByTangent_raw(BRepFace* tangentFace, core::ValueInput* angle, core::Base* planarEntity) = 0; + virtual bool setByTwoPlanes_raw(core::Base* planarEntityOne, core::Base* planarEntityTwo) = 0; + virtual bool setByTwoEdges_raw(core::Base* linearEntityOne, core::Base* linearEntityTwo) = 0; + virtual bool setByThreePoints_raw(core::Base* pointEntityOne, core::Base* pointEntityTwo, core::Base* pointEntityThree) = 0; + virtual bool setByTangentAtPoint_raw(BRepFace* tangentFace, core::Base* pointEntity) = 0; + virtual bool setByDistanceOnPath_raw(core::Base* pathEntity, core::ValueInput* distance) = 0; + virtual Occurrence* creationOccurrence_raw() const = 0; + virtual bool creationOccurrence_raw(Occurrence* value) = 0; + virtual core::Base* targetBaseOrFormFeature_raw() const = 0; + virtual bool targetBaseOrFormFeature_raw(core::Base* value) = 0; +}; + +// Inline wrappers + +inline bool ConstructionPlaneInput::setByPlane(const core::Ptr& plane) +{ + bool res = setByPlane_raw(plane.get()); + return res; +} + +inline bool ConstructionPlaneInput::setByOffset(const core::Ptr& planarEntity, const core::Ptr& offset) +{ + bool res = setByOffset_raw(planarEntity.get(), offset.get()); + return res; +} + +inline bool ConstructionPlaneInput::setByAngle(const core::Ptr& linearEntity, const core::Ptr& angle, const core::Ptr& planarEntity) +{ + bool res = setByAngle_raw(linearEntity.get(), angle.get(), planarEntity.get()); + return res; +} + +inline bool ConstructionPlaneInput::setByTangent(const core::Ptr& tangentFace, const core::Ptr& angle, const core::Ptr& planarEntity) +{ + bool res = setByTangent_raw(tangentFace.get(), angle.get(), planarEntity.get()); + return res; +} + +inline bool ConstructionPlaneInput::setByTwoPlanes(const core::Ptr& planarEntityOne, const core::Ptr& planarEntityTwo) +{ + bool res = setByTwoPlanes_raw(planarEntityOne.get(), planarEntityTwo.get()); + return res; +} + +inline bool ConstructionPlaneInput::setByTwoEdges(const core::Ptr& linearEntityOne, const core::Ptr& linearEntityTwo) +{ + bool res = setByTwoEdges_raw(linearEntityOne.get(), linearEntityTwo.get()); + return res; +} + +inline bool ConstructionPlaneInput::setByThreePoints(const core::Ptr& pointEntityOne, const core::Ptr& pointEntityTwo, const core::Ptr& pointEntityThree) +{ + bool res = setByThreePoints_raw(pointEntityOne.get(), pointEntityTwo.get(), pointEntityThree.get()); + return res; +} + +inline bool ConstructionPlaneInput::setByTangentAtPoint(const core::Ptr& tangentFace, const core::Ptr& pointEntity) +{ + bool res = setByTangentAtPoint_raw(tangentFace.get(), pointEntity.get()); + return res; +} + +inline bool ConstructionPlaneInput::setByDistanceOnPath(const core::Ptr& pathEntity, const core::Ptr& distance) +{ + bool res = setByDistanceOnPath_raw(pathEntity.get(), distance.get()); + return res; +} + +inline core::Ptr ConstructionPlaneInput::creationOccurrence() const +{ + core::Ptr res = creationOccurrence_raw(); + return res; +} + +inline bool ConstructionPlaneInput::creationOccurrence(const core::Ptr& value) +{ + return creationOccurrence_raw(value.get()); +} + +inline core::Ptr ConstructionPlaneInput::targetBaseOrFormFeature() const +{ + core::Ptr res = targetBaseOrFormFeature_raw(); + return res; +} + +inline bool ConstructionPlaneInput::targetBaseOrFormFeature(const core::Ptr& value) +{ + return targetBaseOrFormFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPLANEINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneMidplaneDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneMidplaneDefinition.h new file mode 100644 index 0000000..e51210b --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneMidplaneDefinition.h @@ -0,0 +1,81 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionPlaneDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPLANEMIDPLANEDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPLANEMIDPLANEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPLANEMIDPLANEDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPLANEMIDPLANEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// ConstructionPlaneMidplaneDefinition defines a ConstructionPlane by... +class ConstructionPlaneMidplaneDefinition : public ConstructionPlaneDefinition { +public: + + /// Gets the first planar face or construction plane that defines this ConstructionPlane. + core::Ptr planarEntityOne() const; + + /// Gets the second planar face or construction plane that defines this ConstructionPlane. + core::Ptr planarEntityTwo() const; + + /// Redefines the input geometry of the construction plane. + /// planarEntityOne : The first planar face or construction plane that defines this ConstructionPlane. + /// planarEntityTwo : The second planar face or construction plane that defines this ConstructionPlane. + /// Returns true if the redefinition of the plane is successful. + bool redefine(const core::Ptr& planarEntityOne, const core::Ptr& planarEntityTwo); + + ADSK_FUSION_CONSTRUCTIONPLANEMIDPLANEDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPLANEMIDPLANEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPLANEMIDPLANEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPLANEMIDPLANEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* planarEntityOne_raw() const = 0; + virtual core::Base* planarEntityTwo_raw() const = 0; + virtual bool redefine_raw(core::Base* planarEntityOne, core::Base* planarEntityTwo) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPlaneMidplaneDefinition::planarEntityOne() const +{ + core::Ptr res = planarEntityOne_raw(); + return res; +} + +inline core::Ptr ConstructionPlaneMidplaneDefinition::planarEntityTwo() const +{ + core::Ptr res = planarEntityTwo_raw(); + return res; +} + +inline bool ConstructionPlaneMidplaneDefinition::redefine(const core::Ptr& planarEntityOne, const core::Ptr& planarEntityTwo) +{ + bool res = redefine_raw(planarEntityOne.get(), planarEntityTwo.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPLANEMIDPLANEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneOffsetDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneOffsetDefinition.h new file mode 100644 index 0000000..eb3d671 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneOffsetDefinition.h @@ -0,0 +1,91 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionPlaneDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPLANEOFFSETDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPLANEOFFSETDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPLANEOFFSETDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPLANEOFFSETDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Parameter; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// ConstructionPlaneOffsetDefinition defines a ConstructionPlane by... +class ConstructionPlaneOffsetDefinition : public ConstructionPlaneDefinition { +public: + + /// Returns a Value object that for a transient definition that provides the current + /// assigned value and for a definition associated with a construction plane + /// Provides access to the associated parameter controlling the offset. + core::Ptr offset() const; + + /// Gets the planar face or construction plane this construction plane + /// is parametrically dependent on. + core::Ptr planarEntity() const; + + /// Redefines the input geometry of the construction plane. + /// offset : ValueInput object that specifies the offset distance + /// planarEntity : A plane, planar face or construction plane from which to measure the offset from + /// Returns true is the operation is successful + bool redefine(const core::Ptr& offset, const core::Ptr& planarEntity); + + ADSK_FUSION_CONSTRUCTIONPLANEOFFSETDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPLANEOFFSETDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPLANEOFFSETDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPLANEOFFSETDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Parameter* offset_raw() const = 0; + virtual core::Base* planarEntity_raw() const = 0; + virtual bool redefine_raw(core::ValueInput* offset, core::Base* planarEntity) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPlaneOffsetDefinition::offset() const +{ + core::Ptr res = offset_raw(); + return res; +} + +inline core::Ptr ConstructionPlaneOffsetDefinition::planarEntity() const +{ + core::Ptr res = planarEntity_raw(); + return res; +} + +inline bool ConstructionPlaneOffsetDefinition::redefine(const core::Ptr& offset, const core::Ptr& planarEntity) +{ + bool res = redefine_raw(offset.get(), planarEntity.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPLANEOFFSETDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneTangentAtPointDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneTangentAtPointDefinition.h new file mode 100644 index 0000000..686dc8a --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneTangentAtPointDefinition.h @@ -0,0 +1,86 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionPlaneDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPLANETANGENTATPOINTDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPLANETANGENTATPOINTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPLANETANGENTATPOINTDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPLANETANGENTATPOINTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepFace; +}} + +namespace adsk { namespace fusion { + +/// ConstructionPlaneTangentAtPointDefinition defines a ConstructionPlane tangent to a +/// face and aligned to a point. +class ConstructionPlaneTangentAtPointDefinition : public ConstructionPlaneDefinition { +public: + + /// Gets the tangent face. + core::Ptr tangentFace() const; + + /// Gets the point (sketch point, vertex, construction point) used to align the plane. + core::Ptr pointEntity() const; + + /// Redefines the input geometry of the construction plane. + /// tangentFace : The face to create the plane tangent to + /// pointEntity : The point (sketch point, vertex, construction point) used to align the plane. + /// Returns true if the redefinition of the plane is successful. + bool redefine(const core::Ptr& tangentFace, const core::Ptr& pointEntity); + + ADSK_FUSION_CONSTRUCTIONPLANETANGENTATPOINTDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPLANETANGENTATPOINTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPLANETANGENTATPOINTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPLANETANGENTATPOINTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepFace* tangentFace_raw() const = 0; + virtual core::Base* pointEntity_raw() const = 0; + virtual bool redefine_raw(core::Base* tangentFace, core::Base* pointEntity) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPlaneTangentAtPointDefinition::tangentFace() const +{ + core::Ptr res = tangentFace_raw(); + return res; +} + +inline core::Ptr ConstructionPlaneTangentAtPointDefinition::pointEntity() const +{ + core::Ptr res = pointEntity_raw(); + return res; +} + +inline bool ConstructionPlaneTangentAtPointDefinition::redefine(const core::Ptr& tangentFace, const core::Ptr& pointEntity) +{ + bool res = redefine_raw(tangentFace.get(), pointEntity.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPLANETANGENTATPOINTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneTangentDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneTangentDefinition.h new file mode 100644 index 0000000..1a2f328 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneTangentDefinition.h @@ -0,0 +1,105 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionPlaneDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPLANETANGENTDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPLANETANGENTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPLANETANGENTDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPLANETANGENTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Parameter; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// ConstructionPlaneTangentDefinition defines a ConstructionPlane tangent to a cylindrical or conical +/// face at a point. +class ConstructionPlaneTangentDefinition : public ConstructionPlaneDefinition { +public: + + /// Returns a Value object that for a transient definition provides the current + /// assigned value. For a definition associated with a construction plane, it + /// provides access to the associated parameter controlling the angle. + core::Ptr angle() const; + + /// Gets the cylindrical or conical face that the construction plane + /// is tangent to. + core::Ptr tangentFace() const; + + /// Gets the planar face or construction plane the angle for this + /// construction plane is measured from and is parametrically dependent on. + core::Ptr planarEntity() const; + + /// Redefines the input geometry of the construction plane. + /// angle : A Value object that defines the angle of the construction plane + /// tangentFace : The cylindrical or conical face that the construction plane is tangent to. + /// planarEntity : The planar face or construction plane the angle for this + /// construction plane is measured from + /// Returns true if the redefinition of the plane is successful. + bool redefine(const core::Ptr& angle, const core::Ptr& tangentFace, const core::Ptr& planarEntity); + + ADSK_FUSION_CONSTRUCTIONPLANETANGENTDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPLANETANGENTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPLANETANGENTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPLANETANGENTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Parameter* angle_raw() const = 0; + virtual core::Base* tangentFace_raw() const = 0; + virtual core::Base* planarEntity_raw() const = 0; + virtual bool redefine_raw(core::ValueInput* angle, core::Base* tangentFace, core::Base* planarEntity) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPlaneTangentDefinition::angle() const +{ + core::Ptr res = angle_raw(); + return res; +} + +inline core::Ptr ConstructionPlaneTangentDefinition::tangentFace() const +{ + core::Ptr res = tangentFace_raw(); + return res; +} + +inline core::Ptr ConstructionPlaneTangentDefinition::planarEntity() const +{ + core::Ptr res = planarEntity_raw(); + return res; +} + +inline bool ConstructionPlaneTangentDefinition::redefine(const core::Ptr& angle, const core::Ptr& tangentFace, const core::Ptr& planarEntity) +{ + bool res = redefine_raw(angle.get(), tangentFace.get(), planarEntity.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPLANETANGENTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneThreePointsDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneThreePointsDefinition.h new file mode 100644 index 0000000..ff64275 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneThreePointsDefinition.h @@ -0,0 +1,94 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionPlaneDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPLANETHREEPOINTSDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPLANETHREEPOINTSDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPLANETHREEPOINTSDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPLANETHREEPOINTSDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// ConstructionPlaneThreePointDefinition defines a ConstructionPlane by 3 point entities +/// (e.g. (sketch points, vertices or construction points) that form a triangle (i.e. +/// no two points the same and they aren't collinear). +class ConstructionPlaneThreePointsDefinition : public ConstructionPlaneDefinition { +public: + + /// Gets the first construction point, sketch point or vertex. + core::Ptr pointEntityOne() const; + + /// Gets the second construction point, sketch point or vertex. + core::Ptr pointEntityTwo() const; + + /// Gets the third construction point, sketch point or vertex. + core::Ptr pointEntityThree() const; + + /// Redefines the input geometry of the construction plane. + /// pointEntityOne : Gets the first construction point, sketch point or vertex. + /// pointEntityTwo : Gets the second construction point, sketch point or vertex. + /// pointEntityThree : Gets the third construction point, sketch point or vertex. + /// Returns true if the redefinition of the plane is successful. + bool redefine(const core::Ptr& pointEntityOne, const core::Ptr& pointEntityTwo, const core::Ptr& pointEntityThree); + + ADSK_FUSION_CONSTRUCTIONPLANETHREEPOINTSDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPLANETHREEPOINTSDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPLANETHREEPOINTSDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPLANETHREEPOINTSDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* pointEntityOne_raw() const = 0; + virtual core::Base* pointEntityTwo_raw() const = 0; + virtual core::Base* pointEntityThree_raw() const = 0; + virtual bool redefine_raw(core::Base* pointEntityOne, core::Base* pointEntityTwo, core::Base* pointEntityThree) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPlaneThreePointsDefinition::pointEntityOne() const +{ + core::Ptr res = pointEntityOne_raw(); + return res; +} + +inline core::Ptr ConstructionPlaneThreePointsDefinition::pointEntityTwo() const +{ + core::Ptr res = pointEntityTwo_raw(); + return res; +} + +inline core::Ptr ConstructionPlaneThreePointsDefinition::pointEntityThree() const +{ + core::Ptr res = pointEntityThree_raw(); + return res; +} + +inline bool ConstructionPlaneThreePointsDefinition::redefine(const core::Ptr& pointEntityOne, const core::Ptr& pointEntityTwo, const core::Ptr& pointEntityThree) +{ + bool res = redefine_raw(pointEntityOne.get(), pointEntityTwo.get(), pointEntityThree.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPLANETHREEPOINTSDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneTwoEdgesDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneTwoEdgesDefinition.h new file mode 100644 index 0000000..81b949f --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlaneTwoEdgesDefinition.h @@ -0,0 +1,86 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionPlaneDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPLANETWOEDGESDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPLANETWOEDGESDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPLANETWOEDGESDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPLANETWOEDGESDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// ConstructionPlaneTwoEdgesDefinition defines a ConstructionPlane by two co-planar +/// linear entities like edges, sketch lines or construction axis. +class ConstructionPlaneTwoEdgesDefinition : public ConstructionPlaneDefinition { +public: + + /// Gets the first linear edge, construction line, or sketch line that defines + /// the construction plane. + core::Ptr linearEntityOne() const; + + /// Gets the second linear edge, construction line, or sketch line that defines + /// the construction plane. + core::Ptr linearEntityTwo() const; + + /// Redefines the input geometry of the construction plane. + /// linearEntityOne : The first linear edge, construction line, or sketch line that defines + /// the construction plane. + /// linearEntityTwo : The second linear edge, construction line, or sketch line that defines + /// the construction plane. + /// + bool redefine(const core::Ptr& linearEntityOne, const core::Ptr& linearEntityTwo); + + ADSK_FUSION_CONSTRUCTIONPLANETWOEDGESDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPLANETWOEDGESDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPLANETWOEDGESDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPLANETWOEDGESDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* linearEntityOne_raw() const = 0; + virtual core::Base* linearEntityTwo_raw() const = 0; + virtual bool redefine_raw(core::Base* linearEntityOne, core::Base* linearEntityTwo) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPlaneTwoEdgesDefinition::linearEntityOne() const +{ + core::Ptr res = linearEntityOne_raw(); + return res; +} + +inline core::Ptr ConstructionPlaneTwoEdgesDefinition::linearEntityTwo() const +{ + core::Ptr res = linearEntityTwo_raw(); + return res; +} + +inline bool ConstructionPlaneTwoEdgesDefinition::redefine(const core::Ptr& linearEntityOne, const core::Ptr& linearEntityTwo) +{ + bool res = redefine_raw(linearEntityOne.get(), linearEntityTwo.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPLANETWOEDGESDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlanes.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlanes.h new file mode 100644 index 0000000..937d105 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPlanes.h @@ -0,0 +1,144 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPLANES_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPLANES_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPLANES_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPLANES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Component; + class ConstructionPlane; + class ConstructionPlaneInput; + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the construction planes within a component and provides +/// methods to create new construction planes. +class ConstructionPlanes : public core::Base { +public: + + /// Function that returns the specified construction plane using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the specified construction plane using the name of the construction + /// plane as it is displayed in the browser. + /// name : The name of the construction plane as it is displayed in the browser + /// Returns the specified item or null if an invalid name was specified. + core::Ptr itemByName(const std::string& name) const; + + /// Returns the number of construction planes in the collection. + size_t count() const; + + /// Create a ConstructionPlaneInput object that is in turn used to create a ConstructionPlane. + /// occurrenceForCreation : A creation occurrence is needed if the input is in another component AND the + /// construction plane is not in the root component. The occurrenceForCreation is analogous + /// to the active occurrence in the UI. + /// Returns a ConstructionPlaneInput object + core::Ptr createInput(const core::Ptr& occurrenceForCreation = NULL) const; + + /// Creates and adds a new ConstructionPlane using the creation parameters in + /// the ConstructionPlaneInput. + /// If the ConstructionPlaneInput was defined using the setByPlane method then + /// the add will only work in a direct edit model (do not capture design history) and will fail in a parametric model. + /// input : A ConstructionPlaneInput object + /// Returns the newly created construction plane or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Returns the component that owns this collection. + core::Ptr component() const; + + typedef ConstructionPlane iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_CONSTRUCTIONPLANES_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPLANES_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPLANES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPLANES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ConstructionPlane* item_raw(size_t index) const = 0; + virtual ConstructionPlane* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual ConstructionPlaneInput* createInput_raw(Occurrence* occurrenceForCreation) const = 0; + virtual ConstructionPlane* add_raw(ConstructionPlaneInput* input) = 0; + virtual Component* component_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPlanes::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr ConstructionPlanes::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t ConstructionPlanes::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr ConstructionPlanes::createInput(const core::Ptr& occurrenceForCreation) const +{ + core::Ptr res = createInput_raw(occurrenceForCreation.get()); + return res; +} + +inline core::Ptr ConstructionPlanes::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr ConstructionPlanes::component() const +{ + core::Ptr res = component_raw(); + return res; +} + +template inline void ConstructionPlanes::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPLANES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPoint.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPoint.h new file mode 100644 index 0000000..8917b8c --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPoint.h @@ -0,0 +1,315 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPOINT_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPOINT_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPOINT_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPOINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class Component; + class ConstructionPointDefinition; + class Occurrence; + class TimelineObject; +}} +namespace adsk { namespace core { + class Attributes; + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// ConstructionPoint Object +class ConstructionPoint : public core::Base { +public: + + /// Returns a Point3D object that represents the position of the construction point. + /// The returned geometry is in the AssemblyContext of this ConstructionPoint. + core::Ptr geometry() const; + + /// The name of the construction point as it is displayed in the browser. + std::string name() const; + bool name(const std::string& value); + + /// Returns the construction point definition object which provides access to the + /// information defining the construction point. + core::Ptr definition() const; + + /// Deletes the construction point. + /// Returns a bool indicating if the delete was successful or not. + bool deleteMe(); + + /// Indicates if this construction point can be deleted. The base + /// construction point cannot be deleted. + bool isDeletable() const; + + /// Indicates if the light bulb (as displayed in the browser) is on. + /// A construction point will only be visible if it's light bulb, and that of it's + /// containing folder and parent component/s are also on. + bool isLightBulbOn() const; + bool isLightBulbOn(bool value); + + /// Gets if the construction point is visible. + /// This property is affected by the AssemblyContext of the construction point. + bool isVisible() const; + + /// Returns the parent component or base feature. If both the design and the construction + /// point are parametric, the parent will be a component. If the design is parametric and + /// the construction point is not, the parent will be a base feature. If + /// the design is not parametric the parent will be a component. + core::Ptr parent() const; + + /// Returns the component this construction point belongs to. + core::Ptr component() const; + + /// Indicates if the construction point is parametric. + bool isParametric() const; + + /// Returns the timeline object associated with this construction point. + core::Ptr timelineObject() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this object + /// in an assembly. This is only valid in the case where this is acting + /// as a proxy in an assembly. Returns null in the case where the object + /// is not in the context of an assembly but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// If this construction point is associated with a base feature, this property will return that base feature. + /// If it's not associated with a base feature, this property will return null. + core::Ptr baseFeature() const; + + /// Returns the collection of attributes associated with this construction point. + core::Ptr attributes() const; + + /// Returns the current health state of this construction point. + FeatureHealthStates healthState() const; + + /// Returns the error or warning message in the case where the healthState property returns either + /// WarningFeatureHealthState or ErrorFeatureHealthState. Otherwise this property returns an empty string. + std::string errorOrWarningMessage() const; + + /// Returns a token for the ConstructionPoint object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same construction point. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + ADSK_FUSION_CONSTRUCTIONPOINT_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPOINT_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPOINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPOINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Point3D* geometry_raw() const = 0; + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual ConstructionPointDefinition* definition_raw() const = 0; + virtual bool deleteMe_raw() = 0; + virtual bool isDeletable_raw() const = 0; + virtual bool isLightBulbOn_raw() const = 0; + virtual bool isLightBulbOn_raw(bool value) = 0; + virtual bool isVisible_raw() const = 0; + virtual core::Base* parent_raw() const = 0; + virtual Component* component_raw() const = 0; + virtual bool isParametric_raw() const = 0; + virtual TimelineObject* timelineObject_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual ConstructionPoint* nativeObject_raw() const = 0; + virtual ConstructionPoint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual BaseFeature* baseFeature_raw() const = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual FeatureHealthStates healthState_raw() const = 0; + virtual char* errorOrWarningMessage_raw() const = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPoint::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline std::string ConstructionPoint::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool ConstructionPoint::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline core::Ptr ConstructionPoint::definition() const +{ + core::Ptr res = definition_raw(); + return res; +} + +inline bool ConstructionPoint::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline bool ConstructionPoint::isDeletable() const +{ + bool res = isDeletable_raw(); + return res; +} + +inline bool ConstructionPoint::isLightBulbOn() const +{ + bool res = isLightBulbOn_raw(); + return res; +} + +inline bool ConstructionPoint::isLightBulbOn(bool value) +{ + return isLightBulbOn_raw(value); +} + +inline bool ConstructionPoint::isVisible() const +{ + bool res = isVisible_raw(); + return res; +} + +inline core::Ptr ConstructionPoint::parent() const +{ + core::Ptr res = parent_raw(); + return res; +} + +inline core::Ptr ConstructionPoint::component() const +{ + core::Ptr res = component_raw(); + return res; +} + +inline bool ConstructionPoint::isParametric() const +{ + bool res = isParametric_raw(); + return res; +} + +inline core::Ptr ConstructionPoint::timelineObject() const +{ + core::Ptr res = timelineObject_raw(); + return res; +} + +inline core::Ptr ConstructionPoint::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr ConstructionPoint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr ConstructionPoint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr ConstructionPoint::baseFeature() const +{ + core::Ptr res = baseFeature_raw(); + return res; +} + +inline core::Ptr ConstructionPoint::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline FeatureHealthStates ConstructionPoint::healthState() const +{ + FeatureHealthStates res = healthState_raw(); + return res; +} + +inline std::string ConstructionPoint::errorOrWarningMessage() const +{ + std::string res; + + char* p= errorOrWarningMessage_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string ConstructionPoint::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPOINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointCenterDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointCenterDefinition.h new file mode 100644 index 0000000..4e87123 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointCenterDefinition.h @@ -0,0 +1,66 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionPointDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPOINTCENTERDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPOINTCENTERDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPOINTCENTERDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPOINTCENTERDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// The definition for a parametric construction point created using the SetbyCenter method +class ConstructionPointCenterDefinition : public ConstructionPointDefinition { +public: + + /// Gets and sets the spherical face (sphere or torus), circular edge or sketch arc/circle + /// whose center defines the location for the construction point. + core::Ptr circularEntity() const; + bool circularEntity(const core::Ptr& value); + + ADSK_FUSION_CONSTRUCTIONPOINTCENTERDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPOINTCENTERDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPOINTCENTERDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPOINTCENTERDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* circularEntity_raw() const = 0; + virtual bool circularEntity_raw(core::Base* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPointCenterDefinition::circularEntity() const +{ + core::Ptr res = circularEntity_raw(); + return res; +} + +inline bool ConstructionPointCenterDefinition::circularEntity(const core::Ptr& value) +{ + return circularEntity_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPOINTCENTERDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointDefinition.h new file mode 100644 index 0000000..a672a02 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointDefinition.h @@ -0,0 +1,95 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPOINTDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPOINTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPOINTDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPOINTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ConstructionPoint; +}} + +namespace adsk { namespace fusion { + +/// A Base class to return the information (possibly parametric) used to +/// define a ConstructionPoint. +class ConstructionPointDefinition : public core::Base { +public: + + /// Returns the ConstructionPoint object + core::Ptr parentConstructionPoint() const; + + ADSK_FUSION_CONSTRUCTIONPOINTDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPOINTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPOINTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPOINTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ConstructionPoint* parentConstructionPoint_raw() const = 0; + virtual void placeholderConstructionPointDefinition0() {} + virtual void placeholderConstructionPointDefinition1() {} + virtual void placeholderConstructionPointDefinition2() {} + virtual void placeholderConstructionPointDefinition3() {} + virtual void placeholderConstructionPointDefinition4() {} + virtual void placeholderConstructionPointDefinition5() {} + virtual void placeholderConstructionPointDefinition6() {} + virtual void placeholderConstructionPointDefinition7() {} + virtual void placeholderConstructionPointDefinition8() {} + virtual void placeholderConstructionPointDefinition9() {} + virtual void placeholderConstructionPointDefinition10() {} + virtual void placeholderConstructionPointDefinition11() {} + virtual void placeholderConstructionPointDefinition12() {} + virtual void placeholderConstructionPointDefinition13() {} + virtual void placeholderConstructionPointDefinition14() {} + virtual void placeholderConstructionPointDefinition15() {} + virtual void placeholderConstructionPointDefinition16() {} + virtual void placeholderConstructionPointDefinition17() {} + virtual void placeholderConstructionPointDefinition18() {} + virtual void placeholderConstructionPointDefinition19() {} + virtual void placeholderConstructionPointDefinition20() {} + virtual void placeholderConstructionPointDefinition21() {} + virtual void placeholderConstructionPointDefinition22() {} + virtual void placeholderConstructionPointDefinition23() {} + virtual void placeholderConstructionPointDefinition24() {} + virtual void placeholderConstructionPointDefinition25() {} + virtual void placeholderConstructionPointDefinition26() {} + virtual void placeholderConstructionPointDefinition27() {} + virtual void placeholderConstructionPointDefinition28() {} + virtual void placeholderConstructionPointDefinition29() {} + virtual void placeholderConstructionPointDefinition30() {} +}; + +// Inline wrappers + +inline core::Ptr ConstructionPointDefinition::parentConstructionPoint() const +{ + core::Ptr res = parentConstructionPoint_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPOINTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointEdgePlaneDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointEdgePlaneDefinition.h new file mode 100644 index 0000000..f70fb83 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointEdgePlaneDefinition.h @@ -0,0 +1,81 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionPointDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPOINTEDGEPLANEDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPOINTEDGEPLANEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPOINTEDGEPLANEDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPOINTEDGEPLANEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// The definition for a parametric construction point created using the SetbyEdgePlane method +class ConstructionPointEdgePlaneDefinition : public ConstructionPointDefinition { +public: + + /// A linear B-Rep edge, construction axis or sketch line. + core::Ptr edge() const; + + /// A plane, planar B-Rep face or construction plane. + core::Ptr plane() const; + + /// Redefines the input geometry of the construction point. + /// edge : A linear B-Rep edge, construction axis or sketch line. + /// plane : A plane, planar B-Rep face or construction plane. + /// Returns true if the redefinition of the Construction Point is successful. + bool redefine(const core::Ptr& edge, const core::Ptr& plane); + + ADSK_FUSION_CONSTRUCTIONPOINTEDGEPLANEDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPOINTEDGEPLANEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPOINTEDGEPLANEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPOINTEDGEPLANEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* edge_raw() const = 0; + virtual core::Base* plane_raw() const = 0; + virtual bool redefine_raw(core::Base* edge, core::Base* plane) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPointEdgePlaneDefinition::edge() const +{ + core::Ptr res = edge_raw(); + return res; +} + +inline core::Ptr ConstructionPointEdgePlaneDefinition::plane() const +{ + core::Ptr res = plane_raw(); + return res; +} + +inline bool ConstructionPointEdgePlaneDefinition::redefine(const core::Ptr& edge, const core::Ptr& plane) +{ + bool res = redefine_raw(edge.get(), plane.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPOINTEDGEPLANEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointInput.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointInput.h new file mode 100644 index 0000000..a9d473f --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointInput.h @@ -0,0 +1,184 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPOINTINPUT_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPOINTINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPOINTINPUT_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPOINTINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// A ConstructionPointInput is a throwaway object used to create a ConstructionPoint +/// The usage pattern is +/// a. create a ConstructionPointInput (ConstructionPoints.CreateInput) +/// b. call one of the member functions to specify how the ConstructionPoint is created +/// c. create the ConstructionPoint (call ConstructionPoints.Add) +/// d. stop referencing the ConstructionPointInput (so it gets deleted). +class ConstructionPointInput : public core::Base { +public: + + /// This input method is for creating a construction point at the intersection of + /// the two linear edges or sketch lines. + /// The edges can be B-Rep edges or sketch lines. + /// This can result in a parametric or non-parametric construction point depending + /// on whether the parent component is parametric or is a direct edit component. + /// edgeOne : The first B-Rep edge or sketch line + /// edgeTwo : The second B-Rep edge or sketch line + /// Returns true if the creation of the ConstructionPointInput is successful. + bool setByTwoEdges(const core::Ptr& edgeOne, const core::Ptr& edgeTwo); + + /// This input method is for creating a construction point at the intersection of the + /// three planes or planar faces. + /// This can result in a parametric or non-parametric construction point depending + /// on whether the parent component is parametric or is a direct edit component. + /// planeOne : The first plane or planar face to intersect + /// planeTwo : The second plane or planar face to intersect + /// planeThree : The third plane or planar face to intersect + /// Returns true if the creation of the ConstructionPointInput is successful. + bool setByThreePlanes(const core::Ptr& planeOne, const core::Ptr& planeTwo, const core::Ptr& planeThree); + + /// This input method is for creating a construction point at the intersection of a + /// construction plane, planar face or sketch profile and a linear edge, construction axis + /// or sketch line. + /// This can result in a parametric or non-parametric construction point depending + /// on whether the parent component is parametric or is a direct edit component. + /// edge : A linear B-Rep edge, construction axis or sketch line. + /// plane : A plane, planar B-Rep face or construction plane. + /// Returns true if the creation of the ConstructionPointInput is successful. + bool setByEdgePlane(const core::Ptr& edge, const core::Ptr& plane); + + /// This input method is for creating a construction point at the center of a spherical + /// face (sphere or torus), circular edge or sketch arc/circle + /// This can result in a parametric or non-parametric construction point depending + /// on whether the parent component is parametric or is a direct edit component. + /// circularEntity : A spherical face (sphere or torus), circular edge or sketch arc/circle + /// Returns true if the creation of the ConstructionPointInput is successful. + bool setByCenter(const core::Ptr& circularEntity); + + /// This input method is for creating a construction point on the specified point + /// or vertex. The point can be either a B-Rep vertex, SketchPoint, or a Point3D object. + /// Providing a Point3D object is only valid when working in a direct edit model (do not capture design history). + /// This is not valid when working in a parametric model and will fail. + /// Even when providing a B-Rep vertex, or SketchPoint the result will be non-parametric + /// if the parent component is a direct edit component. + /// point : A B-Rep vertex, SketchPoint, or Point object + /// Returns true if the creation of the ConstructionPointInput is successful. + bool setByPoint(const core::Ptr& point); + + /// In order for geometry to be transformed correctly, an occurrence for creation needs + /// to be specified when the ConstructionPoint is created based on geometry + /// (e.g. a sketch point) in another component AND (the ConstructionPoint) is not in the + /// root component. The CreationOccurrence is analogous to the active occurrence in the UI + core::Ptr creationOccurrence() const; + bool creationOccurrence(const core::Ptr& value); + + /// When creating a construction point that is owned by a base or form feature, set this property to the + /// base or form feature you want to associate the new construction point with. By default, this is null, + /// meaning it will not be associated with a base or form feature. + /// Because of a current limitation, if you want to create a construction point associated with a base + /// or form feature, you must set this property AND call the edit method of the base or form feature, + /// create the feature, and then call the finishEdit method of the base or form feature. The base or form + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseOrFormFeature() const; + bool targetBaseOrFormFeature(const core::Ptr& value); + + ADSK_FUSION_CONSTRUCTIONPOINTINPUT_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPOINTINPUT_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPOINTINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPOINTINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool setByTwoEdges_raw(core::Base* edgeOne, core::Base* edgeTwo) = 0; + virtual bool setByThreePlanes_raw(core::Base* planeOne, core::Base* planeTwo, core::Base* planeThree) = 0; + virtual bool setByEdgePlane_raw(core::Base* edge, core::Base* plane) = 0; + virtual bool setByCenter_raw(core::Base* circularEntity) = 0; + virtual bool setByPoint_raw(core::Base* point) = 0; + virtual Occurrence* creationOccurrence_raw() const = 0; + virtual bool creationOccurrence_raw(Occurrence* value) = 0; + virtual core::Base* targetBaseOrFormFeature_raw() const = 0; + virtual bool targetBaseOrFormFeature_raw(core::Base* value) = 0; +}; + +// Inline wrappers + +inline bool ConstructionPointInput::setByTwoEdges(const core::Ptr& edgeOne, const core::Ptr& edgeTwo) +{ + bool res = setByTwoEdges_raw(edgeOne.get(), edgeTwo.get()); + return res; +} + +inline bool ConstructionPointInput::setByThreePlanes(const core::Ptr& planeOne, const core::Ptr& planeTwo, const core::Ptr& planeThree) +{ + bool res = setByThreePlanes_raw(planeOne.get(), planeTwo.get(), planeThree.get()); + return res; +} + +inline bool ConstructionPointInput::setByEdgePlane(const core::Ptr& edge, const core::Ptr& plane) +{ + bool res = setByEdgePlane_raw(edge.get(), plane.get()); + return res; +} + +inline bool ConstructionPointInput::setByCenter(const core::Ptr& circularEntity) +{ + bool res = setByCenter_raw(circularEntity.get()); + return res; +} + +inline bool ConstructionPointInput::setByPoint(const core::Ptr& point) +{ + bool res = setByPoint_raw(point.get()); + return res; +} + +inline core::Ptr ConstructionPointInput::creationOccurrence() const +{ + core::Ptr res = creationOccurrence_raw(); + return res; +} + +inline bool ConstructionPointInput::creationOccurrence(const core::Ptr& value) +{ + return creationOccurrence_raw(value.get()); +} + +inline core::Ptr ConstructionPointInput::targetBaseOrFormFeature() const +{ + core::Ptr res = targetBaseOrFormFeature_raw(); + return res; +} + +inline bool ConstructionPointInput::targetBaseOrFormFeature(const core::Ptr& value) +{ + return targetBaseOrFormFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPOINTINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointPointDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointPointDefinition.h new file mode 100644 index 0000000..3423302 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointPointDefinition.h @@ -0,0 +1,69 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionPointDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPOINTPOINTDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPOINTPOINTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPOINTPOINTDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPOINTPOINTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// The definition for a parametric construction point created using the SetbyPoint method +/// All non-parametric constructions points will return this type of definition regardless +/// of the method used to initially create them. +class ConstructionPointPointDefinition : public ConstructionPointDefinition { +public: + + /// Gets and sets the position of the point using a construction point, sketch point or + /// vertex. + /// Non-parametric points will always return a Point3D object + core::Ptr pointEntity() const; + bool pointEntity(const core::Ptr& value); + + ADSK_FUSION_CONSTRUCTIONPOINTPOINTDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPOINTPOINTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPOINTPOINTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPOINTPOINTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* pointEntity_raw() const = 0; + virtual bool pointEntity_raw(core::Base* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPointPointDefinition::pointEntity() const +{ + core::Ptr res = pointEntity_raw(); + return res; +} + +inline bool ConstructionPointPointDefinition::pointEntity(const core::Ptr& value) +{ + return pointEntity_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPOINTPOINTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointThreePlanesDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointThreePlanesDefinition.h new file mode 100644 index 0000000..b174879 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointThreePlanesDefinition.h @@ -0,0 +1,92 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionPointDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPOINTTHREEPLANESDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPOINTTHREEPLANESDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPOINTTHREEPLANESDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPOINTTHREEPLANESDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// The definition for a parametric construction point created using the SetbyThreePlanes method +class ConstructionPointThreePlanesDefinition : public ConstructionPointDefinition { +public: + + /// The first plane or planar face + core::Ptr planeOne() const; + + /// The second plane or planar face + core::Ptr planeTwo() const; + + /// The third plane or planar face + core::Ptr planeThree() const; + + /// Redefines the input geometry of the construction point. + /// planeOne : The first plane or planar face to intersect + /// planeTwo : The second plane or planar face to intersect + /// planeThree : The third plane or planar face to intersect + /// Returns true if the redefinition of the Construction Point is successful. + bool redefine(const core::Ptr& planeOne, const core::Ptr& planeTwo, const core::Ptr& planeThree); + + ADSK_FUSION_CONSTRUCTIONPOINTTHREEPLANESDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPOINTTHREEPLANESDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPOINTTHREEPLANESDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPOINTTHREEPLANESDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* planeOne_raw() const = 0; + virtual core::Base* planeTwo_raw() const = 0; + virtual core::Base* planeThree_raw() const = 0; + virtual bool redefine_raw(core::Base* planeOne, core::Base* planeTwo, core::Base* planeThree) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPointThreePlanesDefinition::planeOne() const +{ + core::Ptr res = planeOne_raw(); + return res; +} + +inline core::Ptr ConstructionPointThreePlanesDefinition::planeTwo() const +{ + core::Ptr res = planeTwo_raw(); + return res; +} + +inline core::Ptr ConstructionPointThreePlanesDefinition::planeThree() const +{ + core::Ptr res = planeThree_raw(); + return res; +} + +inline bool ConstructionPointThreePlanesDefinition::redefine(const core::Ptr& planeOne, const core::Ptr& planeTwo, const core::Ptr& planeThree) +{ + bool res = redefine_raw(planeOne.get(), planeTwo.get(), planeThree.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPOINTTHREEPLANESDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointTwoEdgesDefinition.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointTwoEdgesDefinition.h new file mode 100644 index 0000000..02e4a18 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPointTwoEdgesDefinition.h @@ -0,0 +1,81 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ConstructionPointDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPOINTTWOEDGESDEFINITION_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPOINTTWOEDGESDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPOINTTWOEDGESDEFINITION_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPOINTTWOEDGESDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// The definition for a parametric construction point created using the SetbyTwoEdges method +class ConstructionPointTwoEdgesDefinition : public ConstructionPointDefinition { +public: + + /// Returns a B-Rep edge or sketch line + core::Ptr edgeOne() const; + + /// Returns a B-Rep edge or sketch line + core::Ptr edgeTwo() const; + + /// Redefines the input geometry of the construction point. + /// edgeOne : The first B-Rep edge or sketch line + /// edgeTwo : The second B-Rep edge or sketch line + /// Returns true if the redefinition of the Construction Point is successful. + bool redefine(const core::Ptr& edgeOne, const core::Ptr& edgeTwo); + + ADSK_FUSION_CONSTRUCTIONPOINTTWOEDGESDEFINITION_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPOINTTWOEDGESDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPOINTTWOEDGESDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPOINTTWOEDGESDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* edgeOne_raw() const = 0; + virtual core::Base* edgeTwo_raw() const = 0; + virtual bool redefine_raw(core::Base* edgeOne, core::Base* edgeTwo) = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPointTwoEdgesDefinition::edgeOne() const +{ + core::Ptr res = edgeOne_raw(); + return res; +} + +inline core::Ptr ConstructionPointTwoEdgesDefinition::edgeTwo() const +{ + core::Ptr res = edgeTwo_raw(); + return res; +} + +inline bool ConstructionPointTwoEdgesDefinition::redefine(const core::Ptr& edgeOne, const core::Ptr& edgeTwo) +{ + bool res = redefine_raw(edgeOne.get(), edgeTwo.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPOINTTWOEDGESDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPoints.h b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPoints.h new file mode 100644 index 0000000..37ebec4 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Construction/ConstructionPoints.h @@ -0,0 +1,144 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTRUCTIONPOINTS_CPP__ +# define ADSK_FUSION_CONSTRUCTIONPOINTS_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTRUCTIONPOINTS_API +# endif +#else +# define ADSK_FUSION_CONSTRUCTIONPOINTS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Component; + class ConstructionPoint; + class ConstructionPointInput; + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the construction points within a component and provides +/// methods to create new construction points. +class ConstructionPoints : public core::Base { +public: + + /// Function that returns the specified construction point using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the specified construction point using the name of the construction + /// point as it is displayed in the browser. + /// name : The name of the construction point as it is displayed in the browser. + /// Returns the specified item or null if an invalid name was specified. + core::Ptr itemByName(const std::string& name) const; + + /// The number of construction points in the collection. + size_t count() const; + + /// Create a ConstructionPointInput object that is in turn used + /// to create a ConstructionPoint. + /// occurrenceForCreation : A creation occurrence is needed if the input is in another component AND the + /// construction point is not in the root component. The occurrenceForCreation is analogous + /// to the active occurrence in the UI. + /// Returns a ConstructionPointInput object + core::Ptr createInput(const core::Ptr& occurrenceForCreation = NULL) const; + + /// Creates a new construction point. + /// If the ConstructionPointInput was defined using the setByPoint method using a Point3D object then + /// the add will only work in a direct edit model (do not capture design history) and will fail in a parametric model. + /// input : A ConstructionPointInput object + /// Returns the newly created construction point or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// The component that owns this collection. + core::Ptr component() const; + + typedef ConstructionPoint iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_CONSTRUCTIONPOINTS_API static const char* classType(); + ADSK_FUSION_CONSTRUCTIONPOINTS_API const char* objectType() const override; + ADSK_FUSION_CONSTRUCTIONPOINTS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTRUCTIONPOINTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ConstructionPoint* item_raw(size_t index) const = 0; + virtual ConstructionPoint* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual ConstructionPointInput* createInput_raw(Occurrence* occurrenceForCreation) const = 0; + virtual ConstructionPoint* add_raw(ConstructionPointInput* input) = 0; + virtual Component* component_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstructionPoints::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr ConstructionPoints::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t ConstructionPoints::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr ConstructionPoints::createInput(const core::Ptr& occurrenceForCreation) const +{ + core::Ptr res = createInput_raw(occurrenceForCreation.get()); + return res; +} + +inline core::Ptr ConstructionPoints::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr ConstructionPoints::component() const +{ + core::Ptr res = component_raw(); + return res; +} + +template inline void ConstructionPoints::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTRUCTIONPOINTS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/AllExtentDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/AllExtentDefinition.h new file mode 100644 index 0000000..0677bcd --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/AllExtentDefinition.h @@ -0,0 +1,69 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "ExtentDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_ALLEXTENTDEFINITION_CPP__ +# define ADSK_FUSION_ALLEXTENTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_ALLEXTENTDEFINITION_API +# endif +#else +# define ADSK_FUSION_ALLEXTENTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Defines the inputs for a AllExtentDefinition object. +/// This defines a feature extent where the direction can be positive, negative, or symmetric. +/// Setting the direction to Symmetric specifies that the extrusion is through-all, +/// and goes in both directions. +class AllExtentDefinition : public ExtentDefinition { +public: + + /// Gets and sets the direction of the extent. + ExtentDirections direction() const; + bool direction(ExtentDirections value); + + ADSK_FUSION_ALLEXTENTDEFINITION_API static const char* classType(); + ADSK_FUSION_ALLEXTENTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_ALLEXTENTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_ALLEXTENTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ExtentDirections direction_raw() const = 0; + virtual bool direction_raw(ExtentDirections value) = 0; +}; + +// Inline wrappers + +inline ExtentDirections AllExtentDefinition::direction() const +{ + ExtentDirections res = direction_raw(); + return res; +} + +inline bool AllExtentDefinition::direction(ExtentDirections value) +{ + return direction_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_ALLEXTENTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/AngleExtentDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/AngleExtentDefinition.h new file mode 100644 index 0000000..f029cdf --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/AngleExtentDefinition.h @@ -0,0 +1,83 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExtentDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_ANGLEEXTENTDEFINITION_CPP__ +# define ADSK_FUSION_ANGLEEXTENTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_ANGLEEXTENTDEFINITION_API +# endif +#else +# define ADSK_FUSION_ANGLEEXTENTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; +}} + +namespace adsk { namespace fusion { + +/// Defines the inputs for a AngleExtentDefinition object. +/// This feature extent is defined by an angle as well as whether the extent is symmetric or only in one direction. +/// If the extent is not symmetric, a positive or negative angle can be used to control the direction. +class AngleExtentDefinition : public ExtentDefinition { +public: + + /// Gets and sets if the angle extent is in one direction or symmetric. + /// For a hole this property will always return false and setting it is ignored. + bool isSymmetric() const; + bool isSymmetric(bool value); + + /// Gets the ModelParameter that defines the angle. The value of the angle can be edited + /// by using the properties on the ModelParameter object to edit the parameter. + core::Ptr angle() const; + + ADSK_FUSION_ANGLEEXTENTDEFINITION_API static const char* classType(); + ADSK_FUSION_ANGLEEXTENTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_ANGLEEXTENTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_ANGLEEXTENTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool isSymmetric_raw() const = 0; + virtual bool isSymmetric_raw(bool value) = 0; + virtual ModelParameter* angle_raw() const = 0; +}; + +// Inline wrappers + +inline bool AngleExtentDefinition::isSymmetric() const +{ + bool res = isSymmetric_raw(); + return res; +} + +inline bool AngleExtentDefinition::isSymmetric(bool value) +{ + return isSymmetric_raw(value); +} + +inline core::Ptr AngleExtentDefinition::angle() const +{ + core::Ptr res = angle_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_ANGLEEXTENTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/AtCenterHolePositionDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/AtCenterHolePositionDefinition.h new file mode 100644 index 0000000..7b9d0c9 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/AtCenterHolePositionDefinition.h @@ -0,0 +1,73 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "HolePositionDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_ATCENTERHOLEPOSITIONDEFINITION_CPP__ +# define ADSK_FUSION_ATCENTERHOLEPOSITIONDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_ATCENTERHOLEPOSITIONDEFINITION_API +# endif +#else +# define ADSK_FUSION_ATCENTERHOLEPOSITIONDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepEdge; +}} + +namespace adsk { namespace fusion { + +/// Provides positioning information for a hole that is positioned at the center of a +/// circular or elliptical edge. +class AtCenterHolePositionDefinition : public HolePositionDefinition { +public: + + /// Returns the plane that defines the orientation and start of the hole. + core::Ptr planarEntity() const; + + /// Returns the circular or elliptical edge the hole is centered at. + core::Ptr centerEdge() const; + + ADSK_FUSION_ATCENTERHOLEPOSITIONDEFINITION_API static const char* classType(); + ADSK_FUSION_ATCENTERHOLEPOSITIONDEFINITION_API const char* objectType() const override; + ADSK_FUSION_ATCENTERHOLEPOSITIONDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_ATCENTERHOLEPOSITIONDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* planarEntity_raw() const = 0; + virtual BRepEdge* centerEdge_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr AtCenterHolePositionDefinition::planarEntity() const +{ + core::Ptr res = planarEntity_raw(); + return res; +} + +inline core::Ptr AtCenterHolePositionDefinition::centerEdge() const +{ + core::Ptr res = centerEdge_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_ATCENTERHOLEPOSITIONDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/BRepCell.h b/usr/autodesk/CPP/include/Fusion/Features/BRepCell.h new file mode 100644 index 0000000..0e6c79e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/BRepCell.h @@ -0,0 +1,94 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPCELL_CPP__ +# define ADSK_FUSION_BREPCELL_API XI_EXPORT +# else +# define ADSK_FUSION_BREPCELL_API +# endif +#else +# define ADSK_FUSION_BREPCELL_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing BRepCell. +class BRepCell : public core::Base { +public: + + /// Gets and sets whether the cell is selected. For a Trim feature a selected cell is removed, + /// whereas for a boundary fill feature, a selected cell is kept and used in the feature operation. + bool isSelected() const; + bool isSelected(bool value); + + /// Returns the tools that we're using in the definition of this cell. + core::Ptr sourceTools() const; + + /// Returns a BRepBody that represents this cell. This is a transient B-Rep body. + core::Ptr cellBody() const; + + ADSK_FUSION_BREPCELL_API static const char* classType(); + ADSK_FUSION_BREPCELL_API const char* objectType() const override; + ADSK_FUSION_BREPCELL_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPCELL_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool isSelected_raw() const = 0; + virtual bool isSelected_raw(bool value) = 0; + virtual core::ObjectCollection* sourceTools_raw() const = 0; + virtual BRepBody* cellBody_raw() const = 0; +}; + +// Inline wrappers + +inline bool BRepCell::isSelected() const +{ + bool res = isSelected_raw(); + return res; +} + +inline bool BRepCell::isSelected(bool value) +{ + return isSelected_raw(value); +} + +inline core::Ptr BRepCell::sourceTools() const +{ + core::Ptr res = sourceTools_raw(); + return res; +} + +inline core::Ptr BRepCell::cellBody() const +{ + core::Ptr res = cellBody_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPCELL_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/BRepCells.h b/usr/autodesk/CPP/include/Fusion/Features/BRepCells.h new file mode 100644 index 0000000..f45cc11 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/BRepCells.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BREPCELLS_CPP__ +# define ADSK_FUSION_BREPCELLS_API XI_EXPORT +# else +# define ADSK_FUSION_BREPCELLS_API +# endif +#else +# define ADSK_FUSION_BREPCELLS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepCell; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing BRepCells defined by a BoundaryFillFeatureInput +class BRepCells : public core::Base { +public: + + /// Function that returns the specified BRepCell using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of BRepCells in the collection. + size_t count() const; + + typedef BRepCell iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BREPCELLS_API static const char* classType(); + ADSK_FUSION_BREPCELLS_API const char* objectType() const override; + ADSK_FUSION_BREPCELLS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BREPCELLS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepCell* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BRepCells::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t BRepCells::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void BRepCells::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BREPCELLS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/BaseFeature.h b/usr/autodesk/CPP/include/Fusion/Features/BaseFeature.h new file mode 100644 index 0000000..a876b0a --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/BaseFeature.h @@ -0,0 +1,214 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BASEFEATURE_CPP__ +# define ADSK_FUSION_BASEFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_BASEFEATURE_API +# endif +#else +# define ADSK_FUSION_BASEFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class ConstructionAxis; + class ConstructionPlane; + class ConstructionPoint; + class MeshBody; + class Occurrence; + class Sketch; +}} + +namespace adsk { namespace fusion { + +/// The BaseFeature class represents a direct edit feature within a parametric design. +class BaseFeature : public Feature { +public: + + /// Returns an array of the construction planes associated with this base feature. + std::vector> constructionPlanes() const; + + /// Returns an array of the construction axes associated with this base feature. + std::vector> constructionAxes() const; + + /// Returns an array of the construction points associated with this base feature. + std::vector> constructionPoints() const; + + /// Returns an array of the sketches associated with this base feature. + std::vector> sketches() const; + + /// Returns an array of the mesh bodies associated with this base feature. + std::vector> meshBodies() const; + + /// Set the user-interface so that the base body is in edit mode. + /// Returns true if successful. + bool startEdit(); + + /// Exits from edit mode in the user-interface. If this base feature in not + /// in edit mode, then nothing happens. + /// Returns true if successful. + bool finishEdit(); + + /// Update an existing source BRepBody created by this BaseFeature. + /// The input BRepBody definition will be copied into the existing BRepBody. + /// sourceBody : The source BRepBody to update. The source bodies of a BaseFeature are only available + /// from the bodies collection of the BaseFeature when the BaseFeature is in edit mode. + /// newBody : The BRepBody whose definition will be used to replace the existing source body's definition. + /// Returns true if the body was updated, or false if the update failed. + bool updateBody(const core::Ptr& sourceBody, const core::Ptr& newBody); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_BASEFEATURE_API static const char* classType(); + ADSK_FUSION_BASEFEATURE_API const char* objectType() const override; + ADSK_FUSION_BASEFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BASEFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ConstructionPlane** constructionPlanes_raw(size_t& return_size) const = 0; + virtual ConstructionAxis** constructionAxes_raw(size_t& return_size) const = 0; + virtual ConstructionPoint** constructionPoints_raw(size_t& return_size) const = 0; + virtual Sketch** sketches_raw(size_t& return_size) const = 0; + virtual MeshBody** meshBodies_raw(size_t& return_size) const = 0; + virtual bool startEdit_raw() = 0; + virtual bool finishEdit_raw() = 0; + virtual bool updateBody_raw(BRepBody* sourceBody, BRepBody* newBody) = 0; + virtual BaseFeature* nativeObject_raw() const = 0; + virtual BaseFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline std::vector> BaseFeature::constructionPlanes() const +{ + std::vector> res; + size_t s; + + ConstructionPlane** p= constructionPlanes_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> BaseFeature::constructionAxes() const +{ + std::vector> res; + size_t s; + + ConstructionAxis** p= constructionAxes_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> BaseFeature::constructionPoints() const +{ + std::vector> res; + size_t s; + + ConstructionPoint** p= constructionPoints_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> BaseFeature::sketches() const +{ + std::vector> res; + size_t s; + + Sketch** p= sketches_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> BaseFeature::meshBodies() const +{ + std::vector> res; + size_t s; + + MeshBody** p= meshBodies_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool BaseFeature::startEdit() +{ + bool res = startEdit_raw(); + return res; +} + +inline bool BaseFeature::finishEdit() +{ + bool res = finishEdit_raw(); + return res; +} + +inline bool BaseFeature::updateBody(const core::Ptr& sourceBody, const core::Ptr& newBody) +{ + bool res = updateBody_raw(sourceBody.get(), newBody.get()); + return res; +} + +inline core::Ptr BaseFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr BaseFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BASEFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/BaseFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/BaseFeatures.h new file mode 100644 index 0000000..e23491c --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/BaseFeatures.h @@ -0,0 +1,111 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BASEFEATURES_CPP__ +# define ADSK_FUSION_BASEFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_BASEFEATURES_API +# endif +#else +# define ADSK_FUSION_BASEFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; +}} + +namespace adsk { namespace fusion { + +/// The BaseFeature class represents a direct edit feature within a parametric design. +class BaseFeatures : public core::Base { +public: + + /// Function that returns the specified base feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified base feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of base features in the collection. + size_t count() const; + + /// Creates a new empty base feature in the parent component. + /// Returns the new BaseFeature or null in the case of an error. + core::Ptr add(); + + typedef BaseFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BASEFEATURES_API static const char* classType(); + ADSK_FUSION_BASEFEATURES_API const char* objectType() const override; + ADSK_FUSION_BASEFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BASEFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BaseFeature* item_raw(size_t index) const = 0; + virtual BaseFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual BaseFeature* add_raw() = 0; +}; + +// Inline wrappers + +inline core::Ptr BaseFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr BaseFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t BaseFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr BaseFeatures::add() +{ + core::Ptr res = add_raw(); + return res; +} + +template inline void BaseFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BASEFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/BoundaryFillFeature.h b/usr/autodesk/CPP/include/Fusion/Features/BoundaryFillFeature.h new file mode 100644 index 0000000..1240ca5 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/BoundaryFillFeature.h @@ -0,0 +1,149 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BOUNDARYFILLFEATURE_CPP__ +# define ADSK_FUSION_BOUNDARYFILLFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_BOUNDARYFILLFEATURE_API +# endif +#else +# define ADSK_FUSION_BOUNDARYFILLFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepCells; + class Occurrence; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing boundary fill feature in a design. +class BoundaryFillFeature : public Feature { +public: + + /// A collection of construction planes and open or closed BRepBody objects that define the + /// set of boundaries that have been used in the calculation of available closed boundaries. + /// Setting this property will clear all currently selected tools. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr tools() const; + bool tools(const core::Ptr& value); + + /// Gets the set of closed boundaries that have been calculated based on the current set of + /// tools. To get this collection the model must be in the state it was when the feature + /// was initially computed, which means the timeline marker must be positioned to immediately + /// before this feature. + /// After changing any selected cells you must call the applyCellChanges method to update + /// the feature with the changes. + core::Ptr bRepCells() const; + + /// Gets and sets the type of operation performed by the boundary fill feature. + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// After making any changes to the set of selected cells you must call this method to + /// indicate all changes have been made and to apply those changes to the feature. + /// Returns true if the apply was successful. + bool applyCellChanges(); + + ADSK_FUSION_BOUNDARYFILLFEATURE_API static const char* classType(); + ADSK_FUSION_BOUNDARYFILLFEATURE_API const char* objectType() const override; + ADSK_FUSION_BOUNDARYFILLFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BOUNDARYFILLFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* tools_raw() const = 0; + virtual bool tools_raw(core::ObjectCollection* value) = 0; + virtual BRepCells* bRepCells_raw() const = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual BoundaryFillFeature* nativeObject_raw() const = 0; + virtual BoundaryFillFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual bool applyCellChanges_raw() = 0; +}; + +// Inline wrappers + +inline core::Ptr BoundaryFillFeature::tools() const +{ + core::Ptr res = tools_raw(); + return res; +} + +inline bool BoundaryFillFeature::tools(const core::Ptr& value) +{ + return tools_raw(value.get()); +} + +inline core::Ptr BoundaryFillFeature::bRepCells() const +{ + core::Ptr res = bRepCells_raw(); + return res; +} + +inline FeatureOperations BoundaryFillFeature::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool BoundaryFillFeature::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline core::Ptr BoundaryFillFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr BoundaryFillFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline bool BoundaryFillFeature::applyCellChanges() +{ + bool res = applyCellChanges_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BOUNDARYFILLFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/BoundaryFillFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/BoundaryFillFeatureInput.h new file mode 100644 index 0000000..323554c --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/BoundaryFillFeatureInput.h @@ -0,0 +1,163 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BOUNDARYFILLFEATUREINPUT_CPP__ +# define ADSK_FUSION_BOUNDARYFILLFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_BOUNDARYFILLFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_BOUNDARYFILLFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class BRepCells; + class Occurrence; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a BoundaryFillFeatureInput. +class BoundaryFillFeatureInput : public core::Base { +public: + + /// Returns the collection of the valid cells that have been calculated based on the set of input tools. + /// You use this collection to specify which cells you want included in the output. + core::Ptr bRepCells() const; + + /// Gets and sets the type of operation performed by the boundary fill feature. + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// In order for geometry to be transformed correctly, an Occurrence for creation needs to be + /// specified when the Boundary Fill is created based on geometry (e.g. a profile and/or face(s)) + /// in another component AND (the Boundary Fill) is not in the root component. + /// The CreationOccurrence is analogous to the active occurrence in the UI + core::Ptr creationOccurrence() const; + bool creationOccurrence(const core::Ptr& value); + + /// Gets and sets the collection of one or more construction planes and open or closed + /// BRepBody objects that are used in calculating the possible closed boundaries. + core::Ptr tools() const; + bool tools(const core::Ptr& value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + /// To determine the possible boundaries and allow you to choose which cells to keep, the boundary + /// fill feature does a partial compute when the input object is created. To do this it starts a boundary + /// fill feature transaction and completes the transaction when you call the add method. If you don't + /// call the add method to finish the transaction it leaves Fusion 360 in a bad state and there will be undo + /// problems and possibly a crash. If you have created a BoundFillFeatureInput object and don't want to finish + /// the feature creation, you need to call the cancel method on the BoundaryFillFeatureInput object to + /// safely abort the current boundary fill transaction. + bool cancel(); + + ADSK_FUSION_BOUNDARYFILLFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_BOUNDARYFILLFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_BOUNDARYFILLFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BOUNDARYFILLFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepCells* bRepCells_raw() const = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual Occurrence* creationOccurrence_raw() const = 0; + virtual bool creationOccurrence_raw(Occurrence* value) = 0; + virtual core::ObjectCollection* tools_raw() const = 0; + virtual bool tools_raw(core::ObjectCollection* value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; + virtual bool cancel_raw() = 0; +}; + +// Inline wrappers + +inline core::Ptr BoundaryFillFeatureInput::bRepCells() const +{ + core::Ptr res = bRepCells_raw(); + return res; +} + +inline FeatureOperations BoundaryFillFeatureInput::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool BoundaryFillFeatureInput::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline core::Ptr BoundaryFillFeatureInput::creationOccurrence() const +{ + core::Ptr res = creationOccurrence_raw(); + return res; +} + +inline bool BoundaryFillFeatureInput::creationOccurrence(const core::Ptr& value) +{ + return creationOccurrence_raw(value.get()); +} + +inline core::Ptr BoundaryFillFeatureInput::tools() const +{ + core::Ptr res = tools_raw(); + return res; +} + +inline bool BoundaryFillFeatureInput::tools(const core::Ptr& value) +{ + return tools_raw(value.get()); +} + +inline core::Ptr BoundaryFillFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool BoundaryFillFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} + +inline bool BoundaryFillFeatureInput::cancel() +{ + bool res = cancel_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BOUNDARYFILLFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/BoundaryFillFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/BoundaryFillFeatures.h new file mode 100644 index 0000000..f9df2cc --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/BoundaryFillFeatures.h @@ -0,0 +1,142 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BOUNDARYFILLFEATURES_CPP__ +# define ADSK_FUSION_BOUNDARYFILLFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_BOUNDARYFILLFEATURES_API +# endif +#else +# define ADSK_FUSION_BOUNDARYFILLFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BoundaryFillFeature; + class BoundaryFillFeatureInput; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing boundary fill features in a component +/// and supports the ability to create new boundary fill features. +class BoundaryFillFeatures : public core::Base { +public: + + /// Function that returns the specified boundary fill feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of boundary fill features in the collection. + size_t count() const; + + /// Creates a BoundaryFillFeatureInput object. Use properties and methods on this object + /// to define the boundary fill you want to create and then use the Add method, passing in + /// the BoundaryFillFeatureInput object. + /// To determine the possible boundaries and allow you to choose which cells to keep, the boundary + /// fill feature does a partial compute when the input object is created. To do this it starts a boundary + /// fill feature transaction and completes the transaction when you call the add method. If you don't + /// call the add method to finish the transaction it leaves Fusion 360 in a bad state and there will be undo + /// problems and possibly a crash. If you have created a BoundFillFeatureInput object and don't want to finish + /// the feature creation, you need to call the cancel method on the BoundaryFillFeatureInput object to + /// safely abort the current boundary fill transaction. + /// tools : A collection of one or more construction planes and open or closed BRepBody objects that will be + /// used in calculating the possible closed boundaries. + /// operation : The operation type to perform. + /// Returns the newly created BoundaryFillFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& tools, FeatureOperations operation) const; + + /// Creates a new boundary fill feature. + /// input : A BoundaryFillFeatureInput object that defines the desired boundary fill feature. Use the createInput + /// method to create a new BoundaryFillFeatureInput object and then use methods on it + /// (the BoundaryFillFeatureInput object) to define the boundary fill feature. + /// Returns the newly created BoundaryFillFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified boundary fill feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef BoundaryFillFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BOUNDARYFILLFEATURES_API static const char* classType(); + ADSK_FUSION_BOUNDARYFILLFEATURES_API const char* objectType() const override; + ADSK_FUSION_BOUNDARYFILLFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BOUNDARYFILLFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BoundaryFillFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual BoundaryFillFeatureInput* createInput_raw(core::ObjectCollection* tools, FeatureOperations operation) const = 0; + virtual BoundaryFillFeature* add_raw(BoundaryFillFeatureInput* input) = 0; + virtual BoundaryFillFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr BoundaryFillFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t BoundaryFillFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr BoundaryFillFeatures::createInput(const core::Ptr& tools, FeatureOperations operation) const +{ + core::Ptr res = createInput_raw(tools.get(), operation); + return res; +} + +inline core::Ptr BoundaryFillFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr BoundaryFillFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void BoundaryFillFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BOUNDARYFILLFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/BoxFeature.h b/usr/autodesk/CPP/include/Fusion/Features/BoxFeature.h new file mode 100644 index 0000000..4a1e630 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/BoxFeature.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BOXFEATURE_CPP__ +# define ADSK_FUSION_BOXFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_BOXFEATURE_API +# endif +#else +# define ADSK_FUSION_BOXFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Object that represents an existing box feature in a design. +class BoxFeature : public Feature { +public: + + ADSK_FUSION_BOXFEATURE_API static const char* classType(); + ADSK_FUSION_BOXFEATURE_API const char* objectType() const override; + ADSK_FUSION_BOXFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BOXFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BOXFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/BoxFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/BoxFeatures.h new file mode 100644 index 0000000..db70335 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/BoxFeatures.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BOXFEATURES_CPP__ +# define ADSK_FUSION_BOXFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_BOXFEATURES_API +# endif +#else +# define ADSK_FUSION_BOXFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BoxFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing box features in a design. +class BoxFeatures : public core::Base { +public: + + /// Function that returns the specified box feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified box feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of box features in the collection. + size_t count() const; + + typedef BoxFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_BOXFEATURES_API static const char* classType(); + ADSK_FUSION_BOXFEATURES_API const char* objectType() const override; + ADSK_FUSION_BOXFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BOXFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BoxFeature* item_raw(size_t index) const = 0; + virtual BoxFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr BoxFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr BoxFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t BoxFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void BoxFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BOXFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ChamferEdgeSet.h b/usr/autodesk/CPP/include/Fusion/Features/ChamferEdgeSet.h new file mode 100644 index 0000000..68da2dc --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ChamferEdgeSet.h @@ -0,0 +1,108 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CHAMFEREDGESET_CPP__ +# define ADSK_FUSION_CHAMFEREDGESET_API XI_EXPORT +# else +# define ADSK_FUSION_CHAMFEREDGESET_API +# endif +#else +# define ADSK_FUSION_CHAMFEREDGESET_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// The base class for the classes that define the different types of chamfer edge sets. +class ChamferEdgeSet : public core::Base { +public: + + /// Deletes the chamfer edge set from the chamfer. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// Returns true if the operation was successful. + bool deleteMe(); + + /// Gets and sets the Tangent chain for chamfer. This enables tangent chain option for chamfer. + bool isTangentChain() const; + bool isTangentChain(bool value); + + ADSK_FUSION_CHAMFEREDGESET_API static const char* classType(); + ADSK_FUSION_CHAMFEREDGESET_API const char* objectType() const override; + ADSK_FUSION_CHAMFEREDGESET_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CHAMFEREDGESET_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool deleteMe_raw() = 0; + virtual bool isTangentChain_raw() const = 0; + virtual bool isTangentChain_raw(bool value) = 0; + virtual void placeholderChamferEdgeSet0() {} + virtual void placeholderChamferEdgeSet1() {} + virtual void placeholderChamferEdgeSet2() {} + virtual void placeholderChamferEdgeSet3() {} + virtual void placeholderChamferEdgeSet4() {} + virtual void placeholderChamferEdgeSet5() {} + virtual void placeholderChamferEdgeSet6() {} + virtual void placeholderChamferEdgeSet7() {} + virtual void placeholderChamferEdgeSet8() {} + virtual void placeholderChamferEdgeSet9() {} + virtual void placeholderChamferEdgeSet10() {} + virtual void placeholderChamferEdgeSet11() {} + virtual void placeholderChamferEdgeSet12() {} + virtual void placeholderChamferEdgeSet13() {} + virtual void placeholderChamferEdgeSet14() {} + virtual void placeholderChamferEdgeSet15() {} + virtual void placeholderChamferEdgeSet16() {} + virtual void placeholderChamferEdgeSet17() {} + virtual void placeholderChamferEdgeSet18() {} + virtual void placeholderChamferEdgeSet19() {} + virtual void placeholderChamferEdgeSet20() {} + virtual void placeholderChamferEdgeSet21() {} + virtual void placeholderChamferEdgeSet22() {} + virtual void placeholderChamferEdgeSet23() {} + virtual void placeholderChamferEdgeSet24() {} + virtual void placeholderChamferEdgeSet25() {} + virtual void placeholderChamferEdgeSet26() {} + virtual void placeholderChamferEdgeSet27() {} + virtual void placeholderChamferEdgeSet28() {} +}; + +// Inline wrappers + +inline bool ChamferEdgeSet::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline bool ChamferEdgeSet::isTangentChain() const +{ + bool res = isTangentChain_raw(); + return res; +} + +inline bool ChamferEdgeSet::isTangentChain(bool value) +{ + return isTangentChain_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CHAMFEREDGESET_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ChamferEdgeSets.h b/usr/autodesk/CPP/include/Fusion/Features/ChamferEdgeSets.h new file mode 100644 index 0000000..5c0cf43 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ChamferEdgeSets.h @@ -0,0 +1,170 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CHAMFEREDGESETS_CPP__ +# define ADSK_FUSION_CHAMFEREDGESETS_API XI_EXPORT +# else +# define ADSK_FUSION_CHAMFEREDGESETS_API +# endif +#else +# define ADSK_FUSION_CHAMFEREDGESETS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ChamferEdgeSet; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing chamfer edge sets associated with a chamfer feature. +class ChamferEdgeSets : public core::Base { +public: + + /// Function that returns the specified chamfer edge set using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of chamfer edge sets in the collection. + size_t count() const; + + /// Adds a set of edges an equal distance offset to this chamfer feature. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// edges : An ObjectCollection containing the edges to be chamfered. Edges can be defined by passing in BrepEdge, + /// BRepFace, or Feature objects. If BRepFace or Feature objects are passed in all of the edges associated + /// with those objects will be chamfered. If BRepEdge objects are provided and the isTangentChain argument is true + /// additional edges may also get chamfered if they are tangentially connected to any of the input edges. + /// distance : A ValueInput object that defines the distance offset of the chamfer. If the ValueInput uses + /// a real then it is interpreted as centimeters. If it is a string then the units + /// can be defined as part of the string (i.e. "2 in") or if no units are specified + /// it is interpreted using the current default units for length. + /// isTangentChain : A boolean value for setting whether or not edges that are tangentially connected to + /// the input edges (if any) will also be chamfered. + /// Returns true if the set of edges was successfully added to the ChamferFeatureInput. + bool addEqualDistanceChamferEdgeSet(const core::Ptr& edges, const core::Ptr& distance, bool isTangentChain); + + /// Adds a set of edges an equal distance offset to this chamfer feature. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// edges : An ObjectCollection containing the edges to be chamfered. Edges can be defined by passing in BrepEdge, + /// BRepFace, or Feature objects. If BRepFace or Feature objects are passed in all of the edges associated + /// with those objects will be chamfered. If BRepEdge objects are provided and the isTangentChain argument is true + /// additional edges may also get chamfered if they are tangentially connected to any of the input edges. + /// distanceOne : A ValueInput object that defines the first distance offset of the chamfer. If the ValueInput uses + /// a real then it is interpreted as centimeters. If it is a string then the units + /// can be defined as part of the string (i.e. "2 in") or if no units are specified + /// it is interpreted using the current default units for length. + /// distanceTwo : A ValueInput object that defines the second distance offset of the chamfer. If the ValueInput uses + /// a real then it is interpreted as centimeters. If it is a string then the units + /// can be defined as part of the string (i.e. "2 in") or if no units are specified + /// it is interpreted using the current default units for length. + /// isFlipped : Swaps the directions for distance one and two. + /// isTangentChain : A boolean value for setting whether or not edges that are tangentially connected to + /// the input edges (if any) will also be chamfered. + /// Returns true if the set of edges was successfully added to the ChamferFeatureInput. + bool addTwoDistancesChamferEdgeSet(const core::Ptr& edges, const core::Ptr& distanceOne, const core::Ptr& distanceTwo, bool isFlipped, bool isTangentChain); + + /// Adds a set of edges an equal distance offset to this chamfer feature. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// edges : An ObjectCollection containing the edges to be chamfered. Edges can be defined by passing in BrepEdge, + /// BRepFace, or Feature objects. If BRepFace or Feature objects are passed in all of the edges associated + /// with those objects will be chamfered. If BRepEdge objects are provided and the isTangentChain argument is true + /// additional edges may also get chamfered if they are tangentially connected to any of the input edges. + /// distance : A ValueInput object that defines the distance offset of the chamfer. If the ValueInput uses + /// a real then it is interpreted as centimeters. If it is a string then the units + /// can be defined as part of the string (i.e. "2 in") or if no units are specified + /// it is interpreted using the current default units for length. + /// angle : A ValueInput object that defines the angle of the chamfer. If the ValueInput uses + /// a real then it is interpreted as radians. If it is a string then the units + /// can be defined as part of the string (i.e. "2 rad") or if no units are specified + /// it is interpreted as degrees. + /// isFlipped : Swaps the directions for distance one and two. + /// isTangentChain : A boolean value for setting whether or not edges that are tangentially connected to + /// the input edges (if any) will also be chamfered. + /// Returns true if the set of edges was successfully added to the ChamferFeatureInput. + bool addDistanceAndAngleChamferEdgeSet(const core::Ptr& edges, const core::Ptr& distance, const core::Ptr& angle, bool isFlipped, bool isTangentChain); + + typedef ChamferEdgeSet iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_CHAMFEREDGESETS_API static const char* classType(); + ADSK_FUSION_CHAMFEREDGESETS_API const char* objectType() const override; + ADSK_FUSION_CHAMFEREDGESETS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CHAMFEREDGESETS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ChamferEdgeSet* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual bool addEqualDistanceChamferEdgeSet_raw(core::ObjectCollection* edges, core::ValueInput* distance, bool isTangentChain) = 0; + virtual bool addTwoDistancesChamferEdgeSet_raw(core::ObjectCollection* edges, core::ValueInput* distanceOne, core::ValueInput* distanceTwo, bool isFlipped, bool isTangentChain) = 0; + virtual bool addDistanceAndAngleChamferEdgeSet_raw(core::ObjectCollection* edges, core::ValueInput* distance, core::ValueInput* angle, bool isFlipped, bool isTangentChain) = 0; +}; + +// Inline wrappers + +inline core::Ptr ChamferEdgeSets::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t ChamferEdgeSets::count() const +{ + size_t res = count_raw(); + return res; +} + +inline bool ChamferEdgeSets::addEqualDistanceChamferEdgeSet(const core::Ptr& edges, const core::Ptr& distance, bool isTangentChain) +{ + bool res = addEqualDistanceChamferEdgeSet_raw(edges.get(), distance.get(), isTangentChain); + return res; +} + +inline bool ChamferEdgeSets::addTwoDistancesChamferEdgeSet(const core::Ptr& edges, const core::Ptr& distanceOne, const core::Ptr& distanceTwo, bool isFlipped, bool isTangentChain) +{ + bool res = addTwoDistancesChamferEdgeSet_raw(edges.get(), distanceOne.get(), distanceTwo.get(), isFlipped, isTangentChain); + return res; +} + +inline bool ChamferEdgeSets::addDistanceAndAngleChamferEdgeSet(const core::Ptr& edges, const core::Ptr& distance, const core::Ptr& angle, bool isFlipped, bool isTangentChain) +{ + bool res = addDistanceAndAngleChamferEdgeSet_raw(edges.get(), distance.get(), angle.get(), isFlipped, isTangentChain); + return res; +} + +template inline void ChamferEdgeSets::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CHAMFEREDGESETS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ChamferFeature.h b/usr/autodesk/CPP/include/Fusion/Features/ChamferFeature.h new file mode 100644 index 0000000..b5fddf0 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ChamferFeature.h @@ -0,0 +1,241 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CHAMFERFEATURE_CPP__ +# define ADSK_FUSION_CHAMFERFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_CHAMFERFEATURE_API +# endif +#else +# define ADSK_FUSION_CHAMFERFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ChamferEdgeSets; + class ChamferTypeDefinition; + class Occurrence; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing chamfer feature in a design. +class ChamferFeature : public Feature { +public: + + /// Gets and sets the edges being chamfered. Specific edges can be defined using one or more BRepEdge + /// objects or BRepFace objects can be used to chamfer all edges of the face or Feature objects can + /// be used to chamfer all edges associated with the input features. If BRepEdge objects are provided + /// and the isTangentChain argument is true additional edges may also get chamfered if they are + /// tangentially connected to any of the input edges. When getting the property, your + /// code should check for the different types in the returned collection and handle it appropriately. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// This property returns nothing in the case where the feature is non-parametric. + core::Ptr edges() const; + bool edges(const core::Ptr& value); + + /// Gets and sets whether or not edges that are tangentially connected to + /// the input edges (if any) will also be chamfered. + bool isTangentChain() const; + bool isTangentChain(bool value); + + /// Gets an enum indicating how the chamfer was defined. The valid return values are + /// EqualDistanceType, TwoDistancesType and DistanceAndAngleType. + /// This property returns nothing in the case where the feature is non-parametric. + ChamferTypes chamferType() const; + + /// Gets the definition object that is defining the type of chamfer. Modifying the + /// definition object will cause the chamfer to recompute. Various types of definition objects can + /// be returned depending on how the chamfer is defined. The ChamferType property can + /// be used to determine which type of definition will be returned. + /// This property returns nothing in the case where the feature is non-parametric. + core::Ptr chamferTypeDefinition() const; + + /// Changes the type of chamfer to be an equal distance chamfer. + /// distance : A ValueInput object that defines the distance of the chamfer. If the ValueInput uses + /// a real then it is interpreted as centimeters. If it is a string then the units + /// can be defined as part of the string (i.e. "2 in"). If no units are specified + /// it is interpreted using the current default units for length. + /// Returns true if the feature is successfully changed + bool setEqualDistance(const core::Ptr& distance); + + /// Changes the type of chamfer to be a two distances chamfer. + /// distanceOne : A ValueInput object that defines the distanceOne of the chamfer. This distance + /// is along the face which is on the left of the selected edge. + /// If the ValueInput uses a real then it is interpreted as centimeters. + /// If it is a string then the units can be defined as part of the string (i.e. "2 in"). + /// If no units are specified it is interpreted using the current default units for length. + /// distanceTwo : A ValueInput object that defines the distanceTwo of the chamfer. This distance + /// is along the face which is on the right of the selected edge. + /// If the ValueInput uses a real then it is interpreted as centimeters. + /// If it is a string then the units can be defined as part of the string (i.e. "2 in"). + /// If no units are specified it is interpreted using the current default units for length. + /// Returns true if the feature is successfully changed + bool setTwoDistances(const core::Ptr& distanceOne, const core::Ptr& distanceTwo); + + /// Changes the type of chamfer to be a distance and angle chamfer. + /// distance : A ValueInput object that defines the distance of the chamfer. This distance + /// is along the face which is on the right of the selected edge. + /// If the ValueInput uses a real then it is interpreted as centimeters. + /// If it is a string then the units can be defined as part of the string (i.e. "2 in"). + /// If no units are specified it is interpreted using the current default units for length. + /// angle : A valueInput object that defines the angle. The direction will be towards to the face + /// which is on the left of the selected edge. This can be a string or a value. + /// If it's a string it is interpreted using the current document units and can include + /// equations. For example all of the following are valid as long as they result in + /// angle units; "45", "45 deg", "a1 / 2". If a value is input it is interpreted + /// as radians. + /// It cannot be negative. + /// Returns true if the feature is successfully changed + bool setDistanceAndAngle(const core::Ptr& distance, const core::Ptr& angle); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Gets and sets the type of corner to be modeled when multiple edges connect at a vertex. + ChamferCornerTypes cornerType() const; + bool cornerType(ChamferCornerTypes value); + + /// Returns the edge sets associated with this chamfer. + core::Ptr edgeSets() const; + + ADSK_FUSION_CHAMFERFEATURE_API static const char* classType(); + ADSK_FUSION_CHAMFERFEATURE_API const char* objectType() const override; + ADSK_FUSION_CHAMFERFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CHAMFERFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* edges_raw() const = 0; + virtual bool edges_raw(core::ObjectCollection* value) = 0; + virtual bool isTangentChain_raw() const = 0; + virtual bool isTangentChain_raw(bool value) = 0; + virtual ChamferTypes chamferType_raw() const = 0; + virtual ChamferTypeDefinition* chamferTypeDefinition_raw() const = 0; + virtual bool setEqualDistance_raw(core::ValueInput* distance) = 0; + virtual bool setTwoDistances_raw(core::ValueInput* distanceOne, core::ValueInput* distanceTwo) = 0; + virtual bool setDistanceAndAngle_raw(core::ValueInput* distance, core::ValueInput* angle) = 0; + virtual ChamferFeature* nativeObject_raw() const = 0; + virtual ChamferFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual ChamferCornerTypes cornerType_raw() const = 0; + virtual bool cornerType_raw(ChamferCornerTypes value) = 0; + virtual ChamferEdgeSets* edgeSets_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ChamferFeature::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline bool ChamferFeature::edges(const core::Ptr& value) +{ + return edges_raw(value.get()); +} + +inline bool ChamferFeature::isTangentChain() const +{ + bool res = isTangentChain_raw(); + return res; +} + +inline bool ChamferFeature::isTangentChain(bool value) +{ + return isTangentChain_raw(value); +} + +inline ChamferTypes ChamferFeature::chamferType() const +{ + ChamferTypes res = chamferType_raw(); + return res; +} + +inline core::Ptr ChamferFeature::chamferTypeDefinition() const +{ + core::Ptr res = chamferTypeDefinition_raw(); + return res; +} + +inline bool ChamferFeature::setEqualDistance(const core::Ptr& distance) +{ + bool res = setEqualDistance_raw(distance.get()); + return res; +} + +inline bool ChamferFeature::setTwoDistances(const core::Ptr& distanceOne, const core::Ptr& distanceTwo) +{ + bool res = setTwoDistances_raw(distanceOne.get(), distanceTwo.get()); + return res; +} + +inline bool ChamferFeature::setDistanceAndAngle(const core::Ptr& distance, const core::Ptr& angle) +{ + bool res = setDistanceAndAngle_raw(distance.get(), angle.get()); + return res; +} + +inline core::Ptr ChamferFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr ChamferFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline ChamferCornerTypes ChamferFeature::cornerType() const +{ + ChamferCornerTypes res = cornerType_raw(); + return res; +} + +inline bool ChamferFeature::cornerType(ChamferCornerTypes value) +{ + return cornerType_raw(value); +} + +inline core::Ptr ChamferFeature::edgeSets() const +{ + core::Ptr res = edgeSets_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CHAMFERFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ChamferFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/ChamferFeatureInput.h new file mode 100644 index 0000000..1ec0564 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ChamferFeatureInput.h @@ -0,0 +1,204 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CHAMFERFEATUREINPUT_CPP__ +# define ADSK_FUSION_CHAMFERFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_CHAMFERFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_CHAMFERFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class ChamferEdgeSets; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a chamfer +/// feature. +class ChamferFeatureInput : public core::Base { +public: + + /// Gets and sets the collection of edges that will be chamfered. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr edges() const; + bool edges(const core::Ptr& value); + + /// Adds a set of edges to this input. + /// distance : A ValueInput object that defines the size of the chamfer. If the ValueInput uses + /// a real then it is interpreted as centimeters. If it is a string then the units + /// can be defined as part of the string (i.e. "2 in"). If no units are specified + /// it is interpreted using the current default units for length. + /// Returns true if the set of edges was successfully added to the ChamferFeatureInput. + bool setToEqualDistance(const core::Ptr& distance); + + /// Adds a set of edges to this input. + /// distanceOne : A ValueInput object that defines the distanceOne of the chamfer. This distance + /// is along the face which is on the left of the selected edge. + /// If the ValueInput uses a real then it is interpreted as centimeters. + /// If it is a string then the units can be defined as part of the string (i.e. "2 in"). + /// If no units are specified it is interpreted using the current default units for length. + /// distanceTwo : A ValueInput object that defines the distanceTwo of the chamfer. This distance + /// is along the face which is on the right of the selected edge. + /// If the ValueInput uses a real then it is interpreted as centimeters. + /// If it is a string then the units can be defined as part of the string (i.e. "2 in"). + /// If no units are specified it is interpreted using the current default units for length. + /// Returns true if successful. + bool setToTwoDistances(const core::Ptr& distanceOne, const core::Ptr& distanceTwo); + + /// Adds a set of edges to this input. + /// distance : A ValueInput object that defines the distance of the chamfer. This distance + /// is along the face which is on the right of the selected edge. + /// If the ValueInput uses a real then it is interpreted as centimeters. + /// If it is a string then the units can be defined as part of the string (i.e. "2 in"). + /// If no units are specified it is interpreted using the current default units for length. + /// angle : A valueInput object that defines the angle. The direction will be towards to the face + /// which is on the left of the selected edge. This can be a string or a value. + /// If it's a string it is interpreted using the current document units and can include + /// equations. For example all of the following are valid as long as they result in + /// angle units; "45", "45 deg", "a1 / 2". If a value is input it is interpreted + /// as radians. It cannot be negative. + /// Returns true if successful. + bool setToDistanceAndAngle(const core::Ptr& distance, const core::Ptr& angle); + + /// Gets and sets if any edges that are tangentially connected to any of chamfered + /// edges will also be included in the chamfer. + bool isTangentChain() const; + bool isTangentChain(bool value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + /// Gets and sets the type of corner to be modeled when multiple edges connect at a vertex. + ChamferCornerTypes cornerType() const; + bool cornerType(ChamferCornerTypes value); + + /// Returns the collection of edge sets for this chamfer feature input. + core::Ptr chamferEdgeSets() const; + + ADSK_FUSION_CHAMFERFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_CHAMFERFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_CHAMFERFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CHAMFERFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* edges_raw() const = 0; + virtual bool edges_raw(core::ObjectCollection* value) = 0; + virtual bool setToEqualDistance_raw(core::ValueInput* distance) = 0; + virtual bool setToTwoDistances_raw(core::ValueInput* distanceOne, core::ValueInput* distanceTwo) = 0; + virtual bool setToDistanceAndAngle_raw(core::ValueInput* distance, core::ValueInput* angle) = 0; + virtual bool isTangentChain_raw() const = 0; + virtual bool isTangentChain_raw(bool value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; + virtual ChamferCornerTypes cornerType_raw() const = 0; + virtual bool cornerType_raw(ChamferCornerTypes value) = 0; + virtual ChamferEdgeSets* chamferEdgeSets_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ChamferFeatureInput::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline bool ChamferFeatureInput::edges(const core::Ptr& value) +{ + return edges_raw(value.get()); +} + +inline bool ChamferFeatureInput::setToEqualDistance(const core::Ptr& distance) +{ + bool res = setToEqualDistance_raw(distance.get()); + return res; +} + +inline bool ChamferFeatureInput::setToTwoDistances(const core::Ptr& distanceOne, const core::Ptr& distanceTwo) +{ + bool res = setToTwoDistances_raw(distanceOne.get(), distanceTwo.get()); + return res; +} + +inline bool ChamferFeatureInput::setToDistanceAndAngle(const core::Ptr& distance, const core::Ptr& angle) +{ + bool res = setToDistanceAndAngle_raw(distance.get(), angle.get()); + return res; +} + +inline bool ChamferFeatureInput::isTangentChain() const +{ + bool res = isTangentChain_raw(); + return res; +} + +inline bool ChamferFeatureInput::isTangentChain(bool value) +{ + return isTangentChain_raw(value); +} + +inline core::Ptr ChamferFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool ChamferFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} + +inline ChamferCornerTypes ChamferFeatureInput::cornerType() const +{ + ChamferCornerTypes res = cornerType_raw(); + return res; +} + +inline bool ChamferFeatureInput::cornerType(ChamferCornerTypes value) +{ + return cornerType_raw(value); +} + +inline core::Ptr ChamferFeatureInput::chamferEdgeSets() const +{ + core::Ptr res = chamferEdgeSets_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CHAMFERFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ChamferFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/ChamferFeatures.h new file mode 100644 index 0000000..2ffec20 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ChamferFeatures.h @@ -0,0 +1,147 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CHAMFERFEATURES_CPP__ +# define ADSK_FUSION_CHAMFERFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_CHAMFERFEATURES_API +# endif +#else +# define ADSK_FUSION_CHAMFERFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ChamferFeature; + class ChamferFeatureInput; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing chamfer features in a component +/// and supports the ability to create new chamfer features. +class ChamferFeatures : public core::Base { +public: + + /// Function that returns the specified chamfer feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of chamfer features in the collection. + size_t count() const; + + /// Creates a ChamferFeatureInput object. Use properties and methods on this object + /// to define the chamfer you want to create and then use the Add method, passing in + /// the ChamferFeatureInput object. + /// edges : The collection of edges that will be chamfered. + /// isTangentChain : Boolean indicating if all edges that are tangentially connected to any of the input edges should be included in the chamfer or not. + /// Returns the newly created ChamferFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& edges, bool isTangentChain) const; + + /// Creates a new chamfer feature. + /// input : A ChamferFeatureInput object that defines the desired chamfer. Use the createInput + /// method to create a new ChamferFeatureInput object and then use methods on it + /// (the ChamferFeatureInput object) to define the chamfer. + /// Returns the newly created ChamferFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified chamfer feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// Creates a ChamferFeatureInput object. Use properties and methods on this object + /// to define the chamfer you want to create and then use the Add method, passing in + /// the ChamferFeatureInput object. + /// Returns the newly created ChamferFeatureInput object or null if the creation failed. + core::Ptr createInput2() const; + + typedef ChamferFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_CHAMFERFEATURES_API static const char* classType(); + ADSK_FUSION_CHAMFERFEATURES_API const char* objectType() const override; + ADSK_FUSION_CHAMFERFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CHAMFERFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ChamferFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual ChamferFeatureInput* createInput_raw(core::ObjectCollection* edges, bool isTangentChain) const = 0; + virtual ChamferFeature* add_raw(ChamferFeatureInput* input) = 0; + virtual ChamferFeature* itemByName_raw(const char * name) const = 0; + virtual ChamferFeatureInput* createInput2_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ChamferFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t ChamferFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr ChamferFeatures::createInput(const core::Ptr& edges, bool isTangentChain) const +{ + core::Ptr res = createInput_raw(edges.get(), isTangentChain); + return res; +} + +inline core::Ptr ChamferFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr ChamferFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline core::Ptr ChamferFeatures::createInput2() const +{ + core::Ptr res = createInput2_raw(); + return res; +} + +template inline void ChamferFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CHAMFERFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ChamferTypeDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/ChamferTypeDefinition.h new file mode 100644 index 0000000..8d4c7dc --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ChamferTypeDefinition.h @@ -0,0 +1,94 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CHAMFERTYPEDEFINITION_CPP__ +# define ADSK_FUSION_CHAMFERTYPEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CHAMFERTYPEDEFINITION_API +# endif +#else +# define ADSK_FUSION_CHAMFERTYPEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ChamferFeature; +}} + +namespace adsk { namespace fusion { + +/// The base class for the classes that define how a chamfer can be defined. +class ChamferTypeDefinition : public core::Base { +public: + + /// Returns the feature that owns this chamfer type definition + core::Ptr parentFeature() const; + + ADSK_FUSION_CHAMFERTYPEDEFINITION_API static const char* classType(); + ADSK_FUSION_CHAMFERTYPEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CHAMFERTYPEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CHAMFERTYPEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ChamferFeature* parentFeature_raw() const = 0; + virtual void placeholderChamferTypeDefinition0() {} + virtual void placeholderChamferTypeDefinition1() {} + virtual void placeholderChamferTypeDefinition2() {} + virtual void placeholderChamferTypeDefinition3() {} + virtual void placeholderChamferTypeDefinition4() {} + virtual void placeholderChamferTypeDefinition5() {} + virtual void placeholderChamferTypeDefinition6() {} + virtual void placeholderChamferTypeDefinition7() {} + virtual void placeholderChamferTypeDefinition8() {} + virtual void placeholderChamferTypeDefinition9() {} + virtual void placeholderChamferTypeDefinition10() {} + virtual void placeholderChamferTypeDefinition11() {} + virtual void placeholderChamferTypeDefinition12() {} + virtual void placeholderChamferTypeDefinition13() {} + virtual void placeholderChamferTypeDefinition14() {} + virtual void placeholderChamferTypeDefinition15() {} + virtual void placeholderChamferTypeDefinition16() {} + virtual void placeholderChamferTypeDefinition17() {} + virtual void placeholderChamferTypeDefinition18() {} + virtual void placeholderChamferTypeDefinition19() {} + virtual void placeholderChamferTypeDefinition20() {} + virtual void placeholderChamferTypeDefinition21() {} + virtual void placeholderChamferTypeDefinition22() {} + virtual void placeholderChamferTypeDefinition23() {} + virtual void placeholderChamferTypeDefinition24() {} + virtual void placeholderChamferTypeDefinition25() {} + virtual void placeholderChamferTypeDefinition26() {} + virtual void placeholderChamferTypeDefinition27() {} + virtual void placeholderChamferTypeDefinition28() {} + virtual void placeholderChamferTypeDefinition29() {} + virtual void placeholderChamferTypeDefinition30() {} +}; + +// Inline wrappers + +inline core::Ptr ChamferTypeDefinition::parentFeature() const +{ + core::Ptr res = parentFeature_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CHAMFERTYPEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ChordLengthFilletEdgeSet.h b/usr/autodesk/CPP/include/Fusion/Features/ChordLengthFilletEdgeSet.h new file mode 100644 index 0000000..64f2f61 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ChordLengthFilletEdgeSet.h @@ -0,0 +1,85 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "FilletEdgeSet.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CHORDLENGTHFILLETEDGESET_CPP__ +# define ADSK_FUSION_CHORDLENGTHFILLETEDGESET_API XI_EXPORT +# else +# define ADSK_FUSION_CHORDLENGTHFILLETEDGESET_API +# endif +#else +# define ADSK_FUSION_CHORDLENGTHFILLETEDGESET_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the edges and the parameter associated with a chord length fillet. +class ChordLengthFilletEdgeSet : public FilletEdgeSet { +public: + + /// Gets and sets the edges that will be filleted. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr edges() const; + bool edges(const core::Ptr& value); + + /// Returns the model parameter that controls the chord length of the fillet. You can edit + /// the chord length by using the properties on the returned ModelParameter object. + core::Ptr chordLength() const; + + ADSK_FUSION_CHORDLENGTHFILLETEDGESET_API static const char* classType(); + ADSK_FUSION_CHORDLENGTHFILLETEDGESET_API const char* objectType() const override; + ADSK_FUSION_CHORDLENGTHFILLETEDGESET_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CHORDLENGTHFILLETEDGESET_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* edges_raw() const = 0; + virtual bool edges_raw(core::ObjectCollection* value) = 0; + virtual ModelParameter* chordLength_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ChordLengthFilletEdgeSet::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline bool ChordLengthFilletEdgeSet::edges(const core::Ptr& value) +{ + return edges_raw(value.get()); +} + +inline core::Ptr ChordLengthFilletEdgeSet::chordLength() const +{ + core::Ptr res = chordLength_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CHORDLENGTHFILLETEDGESET_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CircularPatternFeature.h b/usr/autodesk/CPP/include/Fusion/Features/CircularPatternFeature.h new file mode 100644 index 0000000..b2c4e77 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CircularPatternFeature.h @@ -0,0 +1,251 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CIRCULARPATTERNFEATURE_CPP__ +# define ADSK_FUSION_CIRCULARPATTERNFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_CIRCULARPATTERNFEATURE_API +# endif +#else +# define ADSK_FUSION_CIRCULARPATTERNFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; + class Occurrence; + class PatternElements; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing circular pattern feature in a design. +class CircularPatternFeature : public Feature { +public: + + /// Gets and sets the input entities. The collection can contain faces, features, bodies or occurrences. + /// All of the entities must be of a single type. For example, it can't contain features and occurrences + /// but only features or occurrences. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr inputEntities() const; + bool inputEntities(const core::Ptr& value); + + /// Gets and sets the axis of circular pattern. This can be a sketch line, linear edge, + /// construction axis, an edge/sketch curve that defines an axis (circle, etc.) or a face that defines an axis (cylinder, cone, torus, etc.). + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr axis() const; + bool axis(const core::Ptr& value); + + /// Returns the parameter controlling the total angle. + /// To edit the angle use properties on the parameter to edit its value. + /// This property returns null in the case where the feature is non-parametric. + /// A negative value can be used to change the direction of the pattern. + core::Ptr totalAngle() const; + + /// Gets and sets if the angle extent is in one direction or symmetric. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isSymmetric() const; + bool isSymmetric(bool value); + + /// Returns the parameter controlling the number of pattern elements, including any suppressed elements. + /// To edit the quantity use properties on the parameter to edit its value. + /// This property returns null in the case where the feature is non-parametric. + core::Ptr quantity() const; + + /// Gets and sets the id's of the elements to suppress. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + std::vector suppressedElementsIds() const; + bool suppressedElementsIds(const std::vector& value); + + /// Gets the PatternElements collection that contains the elements created by this pattern. + core::Ptr patternElements() const; + + /// Returns the features that were created as a result of this pattern. + /// This is only valid for a direct edit model and this returns null + /// in the case where the feature is parametric. + core::Ptr resultFeatures() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns the type of entities the pattern consists of. This can be used to help + /// determine the type of results that will be found in the pattern elements. + PatternEntityTypes patternEntityType() const; + + /// Gets and sets the compute option for this pattern feature. + /// This property only applies when patterning features and is ignored in the direct modeling environment. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + PatternComputeOptions patternComputeOption() const; + bool patternComputeOption(PatternComputeOptions value); + + ADSK_FUSION_CIRCULARPATTERNFEATURE_API static const char* classType(); + ADSK_FUSION_CIRCULARPATTERNFEATURE_API const char* objectType() const override; + ADSK_FUSION_CIRCULARPATTERNFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CIRCULARPATTERNFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* inputEntities_raw() const = 0; + virtual bool inputEntities_raw(core::ObjectCollection* value) = 0; + virtual core::Base* axis_raw() const = 0; + virtual bool axis_raw(core::Base* value) = 0; + virtual ModelParameter* totalAngle_raw() const = 0; + virtual bool isSymmetric_raw() const = 0; + virtual bool isSymmetric_raw(bool value) = 0; + virtual ModelParameter* quantity_raw() const = 0; + virtual size_t* suppressedElementsIds_raw(size_t& return_size) const = 0; + virtual bool suppressedElementsIds_raw(const size_t* value, size_t value_size) = 0; + virtual PatternElements* patternElements_raw() const = 0; + virtual core::ObjectCollection* resultFeatures_raw() const = 0; + virtual CircularPatternFeature* nativeObject_raw() const = 0; + virtual CircularPatternFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual PatternEntityTypes patternEntityType_raw() const = 0; + virtual PatternComputeOptions patternComputeOption_raw() const = 0; + virtual bool patternComputeOption_raw(PatternComputeOptions value) = 0; +}; + +// Inline wrappers + +inline core::Ptr CircularPatternFeature::inputEntities() const +{ + core::Ptr res = inputEntities_raw(); + return res; +} + +inline bool CircularPatternFeature::inputEntities(const core::Ptr& value) +{ + return inputEntities_raw(value.get()); +} + +inline core::Ptr CircularPatternFeature::axis() const +{ + core::Ptr res = axis_raw(); + return res; +} + +inline bool CircularPatternFeature::axis(const core::Ptr& value) +{ + return axis_raw(value.get()); +} + +inline core::Ptr CircularPatternFeature::totalAngle() const +{ + core::Ptr res = totalAngle_raw(); + return res; +} + +inline bool CircularPatternFeature::isSymmetric() const +{ + bool res = isSymmetric_raw(); + return res; +} + +inline bool CircularPatternFeature::isSymmetric(bool value) +{ + return isSymmetric_raw(value); +} + +inline core::Ptr CircularPatternFeature::quantity() const +{ + core::Ptr res = quantity_raw(); + return res; +} + +inline std::vector CircularPatternFeature::suppressedElementsIds() const +{ + std::vector res; + size_t s; + + size_t* p= suppressedElementsIds_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool CircularPatternFeature::suppressedElementsIds(const std::vector& value) +{ + return suppressedElementsIds_raw(value.empty() ? NULL : &value[0], value.size()); +} + +inline core::Ptr CircularPatternFeature::patternElements() const +{ + core::Ptr res = patternElements_raw(); + return res; +} + +inline core::Ptr CircularPatternFeature::resultFeatures() const +{ + core::Ptr res = resultFeatures_raw(); + return res; +} + +inline core::Ptr CircularPatternFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr CircularPatternFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline PatternEntityTypes CircularPatternFeature::patternEntityType() const +{ + PatternEntityTypes res = patternEntityType_raw(); + return res; +} + +inline PatternComputeOptions CircularPatternFeature::patternComputeOption() const +{ + PatternComputeOptions res = patternComputeOption_raw(); + return res; +} + +inline bool CircularPatternFeature::patternComputeOption(PatternComputeOptions value) +{ + return patternComputeOption_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CIRCULARPATTERNFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CircularPatternFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/CircularPatternFeatureInput.h new file mode 100644 index 0000000..a13febc --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CircularPatternFeatureInput.h @@ -0,0 +1,188 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CIRCULARPATTERNFEATUREINPUT_CPP__ +# define ADSK_FUSION_CIRCULARPATTERNFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_CIRCULARPATTERNFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_CIRCULARPATTERNFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a circular pattern +/// feature. +class CircularPatternFeatureInput : public core::Base { +public: + + /// Gets and sets the input entities. The collection can contain faces, features, bodies or occurrences. + /// All of the entities must be of a single type. For example, it can't contain features and occurrences + /// but only features or occurrences. + core::Ptr inputEntities() const; + bool inputEntities(const core::Ptr& value); + + /// Gets and sets the axis of circular pattern. This can be a sketch line, linear edge, + /// construction axis, an edge/sketch curve that defines an axis (circle, etc.) or a face that defines an axis (cylinder, cone, torus, etc.). + core::Ptr axis() const; + bool axis(const core::Ptr& value); + + /// Gets and sets quantity of the elements. + core::Ptr quantity() const; + bool quantity(const core::Ptr& value); + + /// Gets and sets total angle. A negative angle can be used to reverse the direction. + /// An angle of 360 degrees or 2 pi radians will create a full circular pattern. + core::Ptr totalAngle() const; + bool totalAngle(const core::Ptr& value); + + /// Gets and sets if the angle extent is in one direction or symmetric. + bool isSymmetric() const; + bool isSymmetric(bool value); + + /// Gets and sets the compute option when patterning features. The default value for this is AdjustPatternCompute. + /// This property only applies when patterning features and is ignored in the direct modeling environment. + PatternComputeOptions patternComputeOption() const; + bool patternComputeOption(PatternComputeOptions value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_CIRCULARPATTERNFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_CIRCULARPATTERNFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_CIRCULARPATTERNFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CIRCULARPATTERNFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* inputEntities_raw() const = 0; + virtual bool inputEntities_raw(core::ObjectCollection* value) = 0; + virtual core::Base* axis_raw() const = 0; + virtual bool axis_raw(core::Base* value) = 0; + virtual core::ValueInput* quantity_raw() const = 0; + virtual bool quantity_raw(core::ValueInput* value) = 0; + virtual core::ValueInput* totalAngle_raw() const = 0; + virtual bool totalAngle_raw(core::ValueInput* value) = 0; + virtual bool isSymmetric_raw() const = 0; + virtual bool isSymmetric_raw(bool value) = 0; + virtual PatternComputeOptions patternComputeOption_raw() const = 0; + virtual bool patternComputeOption_raw(PatternComputeOptions value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr CircularPatternFeatureInput::inputEntities() const +{ + core::Ptr res = inputEntities_raw(); + return res; +} + +inline bool CircularPatternFeatureInput::inputEntities(const core::Ptr& value) +{ + return inputEntities_raw(value.get()); +} + +inline core::Ptr CircularPatternFeatureInput::axis() const +{ + core::Ptr res = axis_raw(); + return res; +} + +inline bool CircularPatternFeatureInput::axis(const core::Ptr& value) +{ + return axis_raw(value.get()); +} + +inline core::Ptr CircularPatternFeatureInput::quantity() const +{ + core::Ptr res = quantity_raw(); + return res; +} + +inline bool CircularPatternFeatureInput::quantity(const core::Ptr& value) +{ + return quantity_raw(value.get()); +} + +inline core::Ptr CircularPatternFeatureInput::totalAngle() const +{ + core::Ptr res = totalAngle_raw(); + return res; +} + +inline bool CircularPatternFeatureInput::totalAngle(const core::Ptr& value) +{ + return totalAngle_raw(value.get()); +} + +inline bool CircularPatternFeatureInput::isSymmetric() const +{ + bool res = isSymmetric_raw(); + return res; +} + +inline bool CircularPatternFeatureInput::isSymmetric(bool value) +{ + return isSymmetric_raw(value); +} + +inline PatternComputeOptions CircularPatternFeatureInput::patternComputeOption() const +{ + PatternComputeOptions res = patternComputeOption_raw(); + return res; +} + +inline bool CircularPatternFeatureInput::patternComputeOption(PatternComputeOptions value) +{ + return patternComputeOption_raw(value); +} + +inline core::Ptr CircularPatternFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool CircularPatternFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CIRCULARPATTERNFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CircularPatternFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/CircularPatternFeatures.h new file mode 100644 index 0000000..41f782f --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CircularPatternFeatures.h @@ -0,0 +1,137 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CIRCULARPATTERNFEATURES_CPP__ +# define ADSK_FUSION_CIRCULARPATTERNFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_CIRCULARPATTERNFEATURES_API +# endif +#else +# define ADSK_FUSION_CIRCULARPATTERNFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CircularPatternFeature; + class CircularPatternFeatureInput; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing circular pattern features in a component +/// and supports the ability to create new circular pattern features. +class CircularPatternFeatures : public core::Base { +public: + + /// Function that returns the specified circular pattern feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of circular pattern features in the collection. + size_t count() const; + + /// Creates a CircularPatternFeatureInput object. Use properties and methods on this object + /// to define the circular pattern you want to create and then use the Add method, passing in + /// the CircularPatternFeatureInput object. + /// inputEntities : The collection can contain faces, features, bodies or occurrences. + /// All of the entities must be of a single type. For example, it can't contain features and occurrences + /// but only features or occurrences. + /// axis : Input linear entity or the entity has axis that defines axis of circular pattern. This can be a sketch line, linear edge, + /// construction axis, an edge/sketch curve that defines an axis (circle, etc.) or a face that defines an axis (cylinder, cone, torus, etc.). + /// Returns the newly created CircularPatternFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& inputEntities, const core::Ptr& axis) const; + + /// Creates a new circular pattern feature. + /// input : A CircularPatternFeatureInput object that defines the desired circular pattern. Use the createInput + /// method to create a new CircularPatternFeatureInput object and then use methods on it + /// (the CircularPatternFeatureInput object) to define the circular pattern. + /// Returns the newly created CircularPatternFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified circular pattern feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef CircularPatternFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_CIRCULARPATTERNFEATURES_API static const char* classType(); + ADSK_FUSION_CIRCULARPATTERNFEATURES_API const char* objectType() const override; + ADSK_FUSION_CIRCULARPATTERNFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CIRCULARPATTERNFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CircularPatternFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual CircularPatternFeatureInput* createInput_raw(core::ObjectCollection* inputEntities, core::Base* axis) const = 0; + virtual CircularPatternFeature* add_raw(CircularPatternFeatureInput* input) = 0; + virtual CircularPatternFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr CircularPatternFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t CircularPatternFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr CircularPatternFeatures::createInput(const core::Ptr& inputEntities, const core::Ptr& axis) const +{ + core::Ptr res = createInput_raw(inputEntities.get(), axis.get()); + return res; +} + +inline core::Ptr CircularPatternFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr CircularPatternFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void CircularPatternFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CIRCULARPATTERNFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CoilFeature.h b/usr/autodesk/CPP/include/Fusion/Features/CoilFeature.h new file mode 100644 index 0000000..e719bda --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CoilFeature.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_COILFEATURE_CPP__ +# define ADSK_FUSION_COILFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_COILFEATURE_API +# endif +#else +# define ADSK_FUSION_COILFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Object that represents an existing coil primitive feature in a design. +class CoilFeature : public Feature { +public: + + ADSK_FUSION_COILFEATURE_API static const char* classType(); + ADSK_FUSION_COILFEATURE_API const char* objectType() const override; + ADSK_FUSION_COILFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_COILFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_COILFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CoilFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/CoilFeatureInput.h new file mode 100644 index 0000000..76d900d --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CoilFeatureInput.h @@ -0,0 +1,325 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_COILFEATUREINPUT_CPP__ +# define ADSK_FUSION_COILFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_COILFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_COILFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a coil feature. +class CoilFeatureInput : public core::Base { +public: + + /// Sets the coil type to RevolutionsAndHeightCoilType. + /// revolutions : A ValueInput object that defines the number of revolutions. + /// height : A ValueInput object that defines the height. + /// angle : A ValueInput object that defines angle. + /// Returns true if successful. + bool setToRevolutionAndHeight(const core::Ptr& revolutions, const core::Ptr& height, const core::Ptr& angle); + + /// Sets the coil type to RevolutionsAndPitchCoilType. + /// revolutions : A ValueInput object that defines the number of revolutions. + /// pitch : A ValueInput object that defines the pitch. + /// angle : A ValueInput object that defines angle. + /// Returns true if successful. + bool setToRevolutionsAndPitch(const core::Ptr& revolutions, const core::Ptr& pitch, const core::Ptr& angle); + + /// Sets the coil type to HeightAndPitchCoilType. + /// height : A ValueInput object that defines the height. + /// pitch : A ValueInput object that defines the pitch. + /// angle : A ValueInput object that defines angle. + /// Returns true if successful. + bool setToHeightAndPitchCoil(const core::Ptr& height, const core::Ptr& pitch, const core::Ptr& angle); + + /// Sets the coil type to SpiralCoilType. + /// revolutions : A ValueInput object that defines the number of revolutions. + /// pitch : A ValueInput object that defines the pitch. + /// Returns true if successful. + bool setToSpiral(const core::Ptr& revolutions, const core::Ptr& pitch); + + /// Specifies if the coil should be created as a solid or surface. This is + /// initialized to true so a solid will be created if it's not changed. + /// It only can be set to false in non-parametric modeling. + bool isSolid() const; + bool isSolid(bool value); + + /// Gets the revolutions number. Returns null in the case where the coilType property returns HeightAndPitchCoilType. + core::Ptr revolutions() const; + + /// Gets the height. Returns null in the case where the coilType property returns RevolutionsAndPitchCoilType. + core::Ptr height() const; + + /// Gets the pitch. Returns null in the case where the coilType property returns RevolutionsAndHeightCoilType or SpiralCoilType. + core::Ptr pitch() const; + + /// Gets the angle. Returns null in the case where the coilType property returns SpiralCoilType. + core::Ptr angle() const; + + /// Gets the type of the coil. + CoilFeatureTypes coilType() const; + + /// Gets and sets the type of operation performed by the coil. + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// Gets and sets the base plane. + core::Ptr basePlane() const; + bool basePlane(const core::Ptr& value); + + /// Gets and sets whether the rotation is clockwise or counter-clockwise. A value of true indicates clockwise rotation. + /// It defaults to true. + bool isClockwiseRotation() const; + bool isClockwiseRotation(bool value); + + /// Gets and sets the diameter. + core::Ptr diameter() const; + bool diameter(const core::Ptr& value); + + /// Gets the section type of the coil. + /// It defaults to CircularCoilSectionType. + CoilFeatureSectionTypes coilSectionType() const; + bool coilSectionType(CoilFeatureSectionTypes value); + + /// Gets the section position of the coil. + /// It defaults to InsideCoilSectionPosition. + CoilFeatureSectionPositions coilSectionPosition() const; + bool coilSectionPosition(CoilFeatureSectionPositions value); + + /// Gets and sets the section size. + core::Ptr sectionSize() const; + bool sectionSize(const core::Ptr& value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_COILFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_COILFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_COILFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_COILFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool setToRevolutionAndHeight_raw(core::ValueInput* revolutions, core::ValueInput* height, core::ValueInput* angle) = 0; + virtual bool setToRevolutionsAndPitch_raw(core::ValueInput* revolutions, core::ValueInput* pitch, core::ValueInput* angle) = 0; + virtual bool setToHeightAndPitchCoil_raw(core::ValueInput* height, core::ValueInput* pitch, core::ValueInput* angle) = 0; + virtual bool setToSpiral_raw(core::ValueInput* revolutions, core::ValueInput* pitch) = 0; + virtual bool isSolid_raw() const = 0; + virtual bool isSolid_raw(bool value) = 0; + virtual core::ValueInput* revolutions_raw() const = 0; + virtual core::ValueInput* height_raw() const = 0; + virtual core::ValueInput* pitch_raw() const = 0; + virtual core::ValueInput* angle_raw() const = 0; + virtual CoilFeatureTypes coilType_raw() const = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual core::Base* basePlane_raw() const = 0; + virtual bool basePlane_raw(core::Base* value) = 0; + virtual bool isClockwiseRotation_raw() const = 0; + virtual bool isClockwiseRotation_raw(bool value) = 0; + virtual core::ValueInput* diameter_raw() const = 0; + virtual bool diameter_raw(core::ValueInput* value) = 0; + virtual CoilFeatureSectionTypes coilSectionType_raw() const = 0; + virtual bool coilSectionType_raw(CoilFeatureSectionTypes value) = 0; + virtual CoilFeatureSectionPositions coilSectionPosition_raw() const = 0; + virtual bool coilSectionPosition_raw(CoilFeatureSectionPositions value) = 0; + virtual core::ValueInput* sectionSize_raw() const = 0; + virtual bool sectionSize_raw(core::ValueInput* value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline bool CoilFeatureInput::setToRevolutionAndHeight(const core::Ptr& revolutions, const core::Ptr& height, const core::Ptr& angle) +{ + bool res = setToRevolutionAndHeight_raw(revolutions.get(), height.get(), angle.get()); + return res; +} + +inline bool CoilFeatureInput::setToRevolutionsAndPitch(const core::Ptr& revolutions, const core::Ptr& pitch, const core::Ptr& angle) +{ + bool res = setToRevolutionsAndPitch_raw(revolutions.get(), pitch.get(), angle.get()); + return res; +} + +inline bool CoilFeatureInput::setToHeightAndPitchCoil(const core::Ptr& height, const core::Ptr& pitch, const core::Ptr& angle) +{ + bool res = setToHeightAndPitchCoil_raw(height.get(), pitch.get(), angle.get()); + return res; +} + +inline bool CoilFeatureInput::setToSpiral(const core::Ptr& revolutions, const core::Ptr& pitch) +{ + bool res = setToSpiral_raw(revolutions.get(), pitch.get()); + return res; +} + +inline bool CoilFeatureInput::isSolid() const +{ + bool res = isSolid_raw(); + return res; +} + +inline bool CoilFeatureInput::isSolid(bool value) +{ + return isSolid_raw(value); +} + +inline core::Ptr CoilFeatureInput::revolutions() const +{ + core::Ptr res = revolutions_raw(); + return res; +} + +inline core::Ptr CoilFeatureInput::height() const +{ + core::Ptr res = height_raw(); + return res; +} + +inline core::Ptr CoilFeatureInput::pitch() const +{ + core::Ptr res = pitch_raw(); + return res; +} + +inline core::Ptr CoilFeatureInput::angle() const +{ + core::Ptr res = angle_raw(); + return res; +} + +inline CoilFeatureTypes CoilFeatureInput::coilType() const +{ + CoilFeatureTypes res = coilType_raw(); + return res; +} + +inline FeatureOperations CoilFeatureInput::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool CoilFeatureInput::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline core::Ptr CoilFeatureInput::basePlane() const +{ + core::Ptr res = basePlane_raw(); + return res; +} + +inline bool CoilFeatureInput::basePlane(const core::Ptr& value) +{ + return basePlane_raw(value.get()); +} + +inline bool CoilFeatureInput::isClockwiseRotation() const +{ + bool res = isClockwiseRotation_raw(); + return res; +} + +inline bool CoilFeatureInput::isClockwiseRotation(bool value) +{ + return isClockwiseRotation_raw(value); +} + +inline core::Ptr CoilFeatureInput::diameter() const +{ + core::Ptr res = diameter_raw(); + return res; +} + +inline bool CoilFeatureInput::diameter(const core::Ptr& value) +{ + return diameter_raw(value.get()); +} + +inline CoilFeatureSectionTypes CoilFeatureInput::coilSectionType() const +{ + CoilFeatureSectionTypes res = coilSectionType_raw(); + return res; +} + +inline bool CoilFeatureInput::coilSectionType(CoilFeatureSectionTypes value) +{ + return coilSectionType_raw(value); +} + +inline CoilFeatureSectionPositions CoilFeatureInput::coilSectionPosition() const +{ + CoilFeatureSectionPositions res = coilSectionPosition_raw(); + return res; +} + +inline bool CoilFeatureInput::coilSectionPosition(CoilFeatureSectionPositions value) +{ + return coilSectionPosition_raw(value); +} + +inline core::Ptr CoilFeatureInput::sectionSize() const +{ + core::Ptr res = sectionSize_raw(); + return res; +} + +inline bool CoilFeatureInput::sectionSize(const core::Ptr& value) +{ + return sectionSize_raw(value.get()); +} + +inline core::Ptr CoilFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool CoilFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_COILFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CoilFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/CoilFeatures.h new file mode 100644 index 0000000..97285f3 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CoilFeatures.h @@ -0,0 +1,101 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_COILFEATURES_CPP__ +# define ADSK_FUSION_COILFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_COILFEATURES_API +# endif +#else +# define ADSK_FUSION_COILFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CoilFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing coil features in a design +/// and supports the ability to create new coil features. +class CoilFeatures : public core::Base { +public: + + /// Function that returns the specified coil feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified coil feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of coil features in the collection. + size_t count() const; + + typedef CoilFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_COILFEATURES_API static const char* classType(); + ADSK_FUSION_COILFEATURES_API const char* objectType() const override; + ADSK_FUSION_COILFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_COILFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CoilFeature* item_raw(size_t index) const = 0; + virtual CoilFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr CoilFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr CoilFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t CoilFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void CoilFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_COILFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CombineFeature.h b/usr/autodesk/CPP/include/Fusion/Features/CombineFeature.h new file mode 100644 index 0000000..284c400 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CombineFeature.h @@ -0,0 +1,172 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_COMBINEFEATURE_CPP__ +# define ADSK_FUSION_COMBINEFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_COMBINEFEATURE_API +# endif +#else +# define ADSK_FUSION_COMBINEFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class Occurrence; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing Combine feature in a design. +/// In non-parametric environment this object does not exist. +class CombineFeature : public Feature { +public: + + /// Gets and sets the BRep Body object that represents the blank body. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr targetBody() const; + bool targetBody(const core::Ptr& value); + + /// Gets and sets the BRep Body objects that represent the tool bodies. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr toolBodies() const; + bool toolBodies(const core::Ptr& value); + + /// Gets and sets the type of operation performed by the combine. + /// The valid values are JoinFeatureOperation, CutFeatureOperation and IntersectFeatureOperation. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// Gets a boolean value for whether or not a new component was created when this feature was created. + bool isNewComponent() const; + + /// Gets and sets a boolean value for whether or not the tool bodies are retrained after the combine results. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isKeepToolBodies() const; + bool isKeepToolBodies(bool value); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_COMBINEFEATURE_API static const char* classType(); + ADSK_FUSION_COMBINEFEATURE_API const char* objectType() const override; + ADSK_FUSION_COMBINEFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_COMBINEFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepBody* targetBody_raw() const = 0; + virtual bool targetBody_raw(BRepBody* value) = 0; + virtual core::ObjectCollection* toolBodies_raw() const = 0; + virtual bool toolBodies_raw(core::ObjectCollection* value) = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual bool isNewComponent_raw() const = 0; + virtual bool isKeepToolBodies_raw() const = 0; + virtual bool isKeepToolBodies_raw(bool value) = 0; + virtual CombineFeature* nativeObject_raw() const = 0; + virtual CombineFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr CombineFeature::targetBody() const +{ + core::Ptr res = targetBody_raw(); + return res; +} + +inline bool CombineFeature::targetBody(const core::Ptr& value) +{ + return targetBody_raw(value.get()); +} + +inline core::Ptr CombineFeature::toolBodies() const +{ + core::Ptr res = toolBodies_raw(); + return res; +} + +inline bool CombineFeature::toolBodies(const core::Ptr& value) +{ + return toolBodies_raw(value.get()); +} + +inline FeatureOperations CombineFeature::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool CombineFeature::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline bool CombineFeature::isNewComponent() const +{ + bool res = isNewComponent_raw(); + return res; +} + +inline bool CombineFeature::isKeepToolBodies() const +{ + bool res = isKeepToolBodies_raw(); + return res; +} + +inline bool CombineFeature::isKeepToolBodies(bool value) +{ + return isKeepToolBodies_raw(value); +} + +inline core::Ptr CombineFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr CombineFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_COMBINEFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CombineFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/CombineFeatureInput.h new file mode 100644 index 0000000..3482bc4 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CombineFeatureInput.h @@ -0,0 +1,169 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_COMBINEFEATUREINPUT_CPP__ +# define ADSK_FUSION_COMBINEFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_COMBINEFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_COMBINEFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class BRepBody; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a combine +/// feature. +class CombineFeatureInput : public core::Base { +public: + + /// Gets and sets the BRep Body object that represents the blank body. + core::Ptr targetBody() const; + bool targetBody(const core::Ptr& value); + + /// Gets and sets the BRep Body objects that represent the tool bodies. + core::Ptr toolBodies() const; + bool toolBodies(const core::Ptr& value); + + /// Gets and sets the type of operation performed by the combine. + /// The valid values are JoinFeatureOperation, CutFeatureOperation and IntersectFeatureOperation. + /// The default value is JoinFeatureOperation. + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// Gets and sets a boolean value for whether or not a new component will be created with the results. The default value is false. + /// In Base feature environment NewComponent does not work. + bool isNewComponent() const; + bool isNewComponent(bool value); + + /// Gets and sets a boolean value for whether or not the tool bodies are retrained after the combine results. The default value is false. + bool isKeepToolBodies() const; + bool isKeepToolBodies(bool value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_COMBINEFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_COMBINEFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_COMBINEFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_COMBINEFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepBody* targetBody_raw() const = 0; + virtual bool targetBody_raw(BRepBody* value) = 0; + virtual core::ObjectCollection* toolBodies_raw() const = 0; + virtual bool toolBodies_raw(core::ObjectCollection* value) = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual bool isNewComponent_raw() const = 0; + virtual bool isNewComponent_raw(bool value) = 0; + virtual bool isKeepToolBodies_raw() const = 0; + virtual bool isKeepToolBodies_raw(bool value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr CombineFeatureInput::targetBody() const +{ + core::Ptr res = targetBody_raw(); + return res; +} + +inline bool CombineFeatureInput::targetBody(const core::Ptr& value) +{ + return targetBody_raw(value.get()); +} + +inline core::Ptr CombineFeatureInput::toolBodies() const +{ + core::Ptr res = toolBodies_raw(); + return res; +} + +inline bool CombineFeatureInput::toolBodies(const core::Ptr& value) +{ + return toolBodies_raw(value.get()); +} + +inline FeatureOperations CombineFeatureInput::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool CombineFeatureInput::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline bool CombineFeatureInput::isNewComponent() const +{ + bool res = isNewComponent_raw(); + return res; +} + +inline bool CombineFeatureInput::isNewComponent(bool value) +{ + return isNewComponent_raw(value); +} + +inline bool CombineFeatureInput::isKeepToolBodies() const +{ + bool res = isKeepToolBodies_raw(); + return res; +} + +inline bool CombineFeatureInput::isKeepToolBodies(bool value) +{ + return isKeepToolBodies_raw(value); +} + +inline core::Ptr CombineFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool CombineFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_COMBINEFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CombineFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/CombineFeatures.h new file mode 100644 index 0000000..c817637 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CombineFeatures.h @@ -0,0 +1,138 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_COMBINEFEATURES_CPP__ +# define ADSK_FUSION_COMBINEFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_COMBINEFEATURES_API +# endif +#else +# define ADSK_FUSION_COMBINEFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class CombineFeature; + class CombineFeatureInput; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing Combine features in a component +/// and supports the ability to create new Combine features. +class CombineFeatures : public core::Base { +public: + + /// Function that returns the specified combine feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + /// This property returns nothing in the case where the feature is non-parametric. + core::Ptr item(size_t index) const; + + /// The number of combine features in the collection. + /// This property returns nothing in the case where the feature is non-parametric. + size_t count() const; + + /// Creates a CombineFeatureInput object. Use properties and methods on this object + /// to define the combine you want to create and then use the Add method, passing in + /// the CombineFeatureInput object. + /// targetBody : A BRep body that represents the blank body. + /// toolBodies : An ObjectCollection containing one or more BRep bodies that represent tool bodies. + /// Returns the newly created CombineFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& targetBody, const core::Ptr& toolBodies) const; + + /// Creates a new combine feature. + /// input : A CombineFeatureInput object that defines the desired combine. Use the createInput + /// method to create a new CombineFeatureInput object and then use methods on it + /// (the CombineFeatureInput object) to define the combine. + /// Returns the newly created CombineFeature object or null if the creation failed. + /// This function returns nothing in the case where the feature is non-parametric. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified combine feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef CombineFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_COMBINEFEATURES_API static const char* classType(); + ADSK_FUSION_COMBINEFEATURES_API const char* objectType() const override; + ADSK_FUSION_COMBINEFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_COMBINEFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CombineFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual CombineFeatureInput* createInput_raw(BRepBody* targetBody, core::ObjectCollection* toolBodies) const = 0; + virtual CombineFeature* add_raw(CombineFeatureInput* input) = 0; + virtual CombineFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr CombineFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t CombineFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr CombineFeatures::createInput(const core::Ptr& targetBody, const core::Ptr& toolBodies) const +{ + core::Ptr res = createInput_raw(targetBody.get(), toolBodies.get()); + return res; +} + +inline core::Ptr CombineFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr CombineFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void CombineFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_COMBINEFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ConstantRadiusFilletEdgeSet.h b/usr/autodesk/CPP/include/Fusion/Features/ConstantRadiusFilletEdgeSet.h new file mode 100644 index 0000000..814900a --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ConstantRadiusFilletEdgeSet.h @@ -0,0 +1,85 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "FilletEdgeSet.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONSTANTRADIUSFILLETEDGESET_CPP__ +# define ADSK_FUSION_CONSTANTRADIUSFILLETEDGESET_API XI_EXPORT +# else +# define ADSK_FUSION_CONSTANTRADIUSFILLETEDGESET_API +# endif +#else +# define ADSK_FUSION_CONSTANTRADIUSFILLETEDGESET_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the edges and the parameter associated with a constant radius fillet. +class ConstantRadiusFilletEdgeSet : public FilletEdgeSet { +public: + + /// Gets and sets the edges that will be filleted. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr edges() const; + bool edges(const core::Ptr& value); + + /// Returns the model parameter that controls the radius of the fillet. You can edit + /// the radius by using the properties on the returned ModelParameter object. + core::Ptr radius() const; + + ADSK_FUSION_CONSTANTRADIUSFILLETEDGESET_API static const char* classType(); + ADSK_FUSION_CONSTANTRADIUSFILLETEDGESET_API const char* objectType() const override; + ADSK_FUSION_CONSTANTRADIUSFILLETEDGESET_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONSTANTRADIUSFILLETEDGESET_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* edges_raw() const = 0; + virtual bool edges_raw(core::ObjectCollection* value) = 0; + virtual ModelParameter* radius_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ConstantRadiusFilletEdgeSet::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline bool ConstantRadiusFilletEdgeSet::edges(const core::Ptr& value) +{ + return edges_raw(value.get()); +} + +inline core::Ptr ConstantRadiusFilletEdgeSet::radius() const +{ + core::Ptr res = radius_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONSTANTRADIUSFILLETEDGESET_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CopyPasteBodies.h b/usr/autodesk/CPP/include/Fusion/Features/CopyPasteBodies.h new file mode 100644 index 0000000..6b32c08 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CopyPasteBodies.h @@ -0,0 +1,113 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_COPYPASTEBODIES_CPP__ +# define ADSK_FUSION_COPYPASTEBODIES_API XI_EXPORT +# else +# define ADSK_FUSION_COPYPASTEBODIES_API +# endif +#else +# define ADSK_FUSION_COPYPASTEBODIES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CopyPasteBody; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing copy-paste features in a design. +/// These are created in the UI by copying and then pasting a B-Rep body. +class CopyPasteBodies : public core::Base { +public: + + /// Function that returns the specified Copy/Paste Body feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified Copy/Paste Body feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of Copy/Paste Body features in the collection. + size_t count() const; + + /// Copies the specified body into the component that owns this CopyPasteBodies collection. + /// sourceBody : Either an ObjectCollection of BRepBodies or a single BRepBody object to copy. + /// Returns the newly created BRepBody object or null in the case of failure. + core::Ptr add(const core::Ptr& sourceBody); + + typedef CopyPasteBody iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_COPYPASTEBODIES_API static const char* classType(); + ADSK_FUSION_COPYPASTEBODIES_API const char* objectType() const override; + ADSK_FUSION_COPYPASTEBODIES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_COPYPASTEBODIES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CopyPasteBody* item_raw(size_t index) const = 0; + virtual CopyPasteBody* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual CopyPasteBody* add_raw(core::Base* sourceBody) = 0; +}; + +// Inline wrappers + +inline core::Ptr CopyPasteBodies::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr CopyPasteBodies::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t CopyPasteBodies::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr CopyPasteBodies::add(const core::Ptr& sourceBody) +{ + core::Ptr res = add_raw(sourceBody.get()); + return res; +} + +template inline void CopyPasteBodies::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_COPYPASTEBODIES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CopyPasteBody.h b/usr/autodesk/CPP/include/Fusion/Features/CopyPasteBody.h new file mode 100644 index 0000000..c5301e9 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CopyPasteBody.h @@ -0,0 +1,67 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_COPYPASTEBODY_CPP__ +# define ADSK_FUSION_COPYPASTEBODY_API XI_EXPORT +# else +# define ADSK_FUSION_COPYPASTEBODY_API +# endif +#else +# define ADSK_FUSION_COPYPASTEBODY_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing Copy/Paste Body feature in a design. +class CopyPasteBody : public Feature { +public: + + /// Returns the bodies that were copied to create the result bodies of this feature. An ObjectCollection + /// is returned that will contain the original bodies. It's possible that the collection can be empty + /// or contain less than the number of bodies originally copied. This happens in the case where a body + /// has been deleted or consumed by some other operation. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr sourceBody() const; + + ADSK_FUSION_COPYPASTEBODY_API static const char* classType(); + ADSK_FUSION_COPYPASTEBODY_API const char* objectType() const override; + ADSK_FUSION_COPYPASTEBODY_API void* queryInterface(const char* id) const override; + ADSK_FUSION_COPYPASTEBODY_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* sourceBody_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr CopyPasteBody::sourceBody() const +{ + core::Ptr res = sourceBody_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_COPYPASTEBODY_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CustomFeature.h b/usr/autodesk/CPP/include/Fusion/Features/CustomFeature.h new file mode 100644 index 0000000..0762feb --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CustomFeature.h @@ -0,0 +1,177 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMFEATURE_CPP__ +# define ADSK_FUSION_CUSTOMFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMFEATURE_API +# endif +#else +# define ADSK_FUSION_CUSTOMFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CustomFeatureDefinition; + class CustomFeatureDependencies; + class CustomFeatureParameters; + class CustomNamedValues; + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing CustomFeature feature in a design. +class CustomFeature : public Feature { +public: + + /// Gets the CustomFeatureDefinition object associated with this custom feature. + /// null/None is returned in the case where the definition does not exist, which is + /// typically a result of the owning add-in not being loaded. + core::Ptr definition() const; + + /// Returns the collection of dependencies for this custom feature. You can + /// use the collection to query, add, and remove dependencies. + core::Ptr dependencies() const; + + /// Returns the list of parameters associated with this custom feature. + core::Ptr parameters() const; + + /// Returns the features combined by this custom feature. The start and end features and all of + /// the features between them in the timeline are returned. + std::vector> features() const; + + /// Sets the start and end features that will be grouped by the custom feature. + /// The "features" in this case can be any object that is visible in the timeline, + /// such as modeling features, sketches, and construction geometry. The input features + /// and all features between them in the timeline will be grouped by the custom feature. + /// The current start and end features can be determined by using the CustomFeature.features property + /// and getting the first and last feature from the returned array. + /// startFeature : The first feature in the timeline to be grouped by the custom feature. The start and the end features + /// can be null which will result in moving all of the features out of the custom feature. This is useful + /// in cases where you need to modify the inputs to a feature contained within a custom feature. You can + /// move the features out of the custom feature, move the timeline marker as needed to edit the features, + /// and then use this method again to add them back into the custom feature. + /// endFeature : The last feature in the timeline that will be grouped by the custom feature. This can be the same + /// feature that is provided as the startFeature argument for the case where the custom feature contains + /// a single feature. + /// + bool setStartAndEndFeatures(const core::Ptr& startFeature, const core::Ptr& endFeature); + + /// Returns the set of custom named values associated with this custom feature. These are + /// a set of named values that are saved with this feature that you can use to save + /// any additional information that is useful for you in managing the custom feature. + /// For example, you might have a setting like an option for different shapes that + /// the user chooses when creating the feature that are not represented as a parameter. + /// You can use this to save the chosen value so when the feature is computed or edited + /// you can use the value originally chosen. During an edit, you might allow the user + /// to edit this setting and you can update the saved custom value. + core::Ptr customNamedValues() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_CUSTOMFEATURE_API static const char* classType(); + ADSK_FUSION_CUSTOMFEATURE_API const char* objectType() const override; + ADSK_FUSION_CUSTOMFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CustomFeatureDefinition* definition_raw() const = 0; + virtual CustomFeatureDependencies* dependencies_raw() const = 0; + virtual CustomFeatureParameters* parameters_raw() const = 0; + virtual core::Base** features_raw(size_t& return_size) const = 0; + virtual bool setStartAndEndFeatures_raw(core::Base* startFeature, core::Base* endFeature) = 0; + virtual CustomNamedValues* customNamedValues_raw() const = 0; + virtual CustomFeature* nativeObject_raw() const = 0; + virtual CustomFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomFeature::definition() const +{ + core::Ptr res = definition_raw(); + return res; +} + +inline core::Ptr CustomFeature::dependencies() const +{ + core::Ptr res = dependencies_raw(); + return res; +} + +inline core::Ptr CustomFeature::parameters() const +{ + core::Ptr res = parameters_raw(); + return res; +} + +inline std::vector> CustomFeature::features() const +{ + std::vector> res; + size_t s; + + core::Base** p= features_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomFeature::setStartAndEndFeatures(const core::Ptr& startFeature, const core::Ptr& endFeature) +{ + bool res = setStartAndEndFeatures_raw(startFeature.get(), endFeature.get()); + return res; +} + +inline core::Ptr CustomFeature::customNamedValues() const +{ + core::Ptr res = customNamedValues_raw(); + return res; +} + +inline core::Ptr CustomFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr CustomFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureDefinition.h new file mode 100644 index 0000000..e1a2ba1 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureDefinition.h @@ -0,0 +1,196 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMFEATUREDEFINITION_CPP__ +# define ADSK_FUSION_CUSTOMFEATUREDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMFEATUREDEFINITION_API +# endif +#else +# define ADSK_FUSION_CUSTOMFEATUREDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CustomFeatureEvent; +}} + +namespace adsk { namespace fusion { + +/// The CustomFeatureDefinition object defines a specific type of custom feature. It contains +/// the settings that apply to all custom features of that type and is used when creating new +/// custom features of that type. It also supports the events used to handle changes to custom +/// features of that type. +class CustomFeatureDefinition : public core::Base { +public: + + /// A static function that creates a new CustomFeatureDefinition object. The creation of a + /// CustomFeatureDefinition object is required to be able to create new custom features and + /// for existing custom features to behave correctly. The CustomFeatureDefinition object defines + /// all of the information that is common for all custom features of a particular type. For example, + /// it defines the icon and the default name. The CustomFeatureDefinition object also supports the + /// events that used to react to an existing feature being edited or re-computed. + /// The custom feature definition should be created when your add-in is initially loaded to notify + /// Fusion that the add-in that supports that custom feature type is available. + /// id : The unique ID for custom features of a particular type. Care must be taken to ensure that this + /// is unique and you must be consistent in its use once you've chosen an ID. A good practice to + /// help ensure unique naming is to use the name of your company in combination with the name of + /// the feature, such as "CompanyName.FeatureName". For example, "WoodTools4U.Dovetail". + /// defaultName : The default name of the feature. Fusion will use this name and append a number to each feature + /// instance as it's created. For example, if this is "Dovetail" the first custom feature created + /// will be named "Dovetail1" and the second will be "Dovetail2". + /// If you want to localize this name you can use the Application.Preferences.generalPreferences.userLanguage + /// property to determine what language the user has chosen and use the corresponding name for that language. + /// iconFolder : The folder that contains the image files that will be used for the icon for this feature in + /// the timeline. This can be a full path or a relative path where it will be relative to the add-in + /// file. The folder should contain the image files named 16x16.png and 32x32.png which should be + /// images that are 16 and 32 pixels square. + /// Returns the newly created CustomFeatureDefinition or null in the case of failure. + static core::Ptr create(const std::string& id, const std::string& defaultName, const std::string& iconFolder); + + /// Gets the unique ID used for this type of custom feature. + std::string id() const; + + /// Gets and sets the folder that contains the images that are used for the icon in the timeline for + /// this custom feature. The folder should contain the image files named 16x16.png and 32x32.png + /// which should be images that are 16 and 32 pixels square. + std::string iconFolder() const; + bool iconFolder(const std::string& value); + + /// Gets and sets the default name of the feature. Fusion will use this name and append a number + /// to each feature instance as it's created. For example, if this is "Dovetail" the first + /// custom feature created will be named "Dovetail1" and the second will be "Dovetail2". + /// If you want to localize this name you can use the Application.Preferences.generalPreferences.userLanguage + /// property to determine what language the user has chosen and use the corresponding name for that language. + std::string defaultName() const; + bool defaultName(const std::string& value); + + /// Gets and sets which command will be invoked when the feature is edited. This is the id of the + /// CommandDefinition object that you have created to do the edit of the feature. + std::string editCommandId() const; + bool editCommandId(const std::string& value); + + /// The customFeatureCompute event fires when Fusion is computing the timeline and reaches + /// the custom feature. The event is fired if any of the dependencies of the custom feature + /// have changed. You can modify the results of your custom feature based on the dependencies. + core::Ptr customFeatureCompute() const; + + ADSK_FUSION_CUSTOMFEATUREDEFINITION_API static const char* classType(); + ADSK_FUSION_CUSTOMFEATUREDEFINITION_API const char* objectType() const override; + ADSK_FUSION_CUSTOMFEATUREDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMFEATUREDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_CUSTOMFEATUREDEFINITION_API static CustomFeatureDefinition* create_raw(const char * id, const char * defaultName, const char * iconFolder); + virtual char* id_raw() const = 0; + virtual char* iconFolder_raw() const = 0; + virtual bool iconFolder_raw(const char * value) = 0; + virtual char* defaultName_raw() const = 0; + virtual bool defaultName_raw(const char * value) = 0; + virtual char* editCommandId_raw() const = 0; + virtual bool editCommandId_raw(const char * value) = 0; + virtual CustomFeatureEvent* customFeatureCompute_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomFeatureDefinition::create(const std::string& id, const std::string& defaultName, const std::string& iconFolder) +{ + core::Ptr res = create_raw(id.c_str(), defaultName.c_str(), iconFolder.c_str()); + return res; +} + +inline std::string CustomFeatureDefinition::id() const +{ + std::string res; + + char* p= id_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string CustomFeatureDefinition::iconFolder() const +{ + std::string res; + + char* p= iconFolder_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomFeatureDefinition::iconFolder(const std::string& value) +{ + return iconFolder_raw(value.c_str()); +} + +inline std::string CustomFeatureDefinition::defaultName() const +{ + std::string res; + + char* p= defaultName_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomFeatureDefinition::defaultName(const std::string& value) +{ + return defaultName_raw(value.c_str()); +} + +inline std::string CustomFeatureDefinition::editCommandId() const +{ + std::string res; + + char* p= editCommandId_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomFeatureDefinition::editCommandId(const std::string& value) +{ + return editCommandId_raw(value.c_str()); +} + +inline core::Ptr CustomFeatureDefinition::customFeatureCompute() const +{ + core::Ptr res = customFeatureCompute_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMFEATUREDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureDependencies.h b/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureDependencies.h new file mode 100644 index 0000000..71aba1e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureDependencies.h @@ -0,0 +1,120 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMFEATUREDEPENDENCIES_CPP__ +# define ADSK_FUSION_CUSTOMFEATUREDEPENDENCIES_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMFEATUREDEPENDENCIES_API +# endif +#else +# define ADSK_FUSION_CUSTOMFEATUREDEPENDENCIES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CustomFeatureDependency; +}} + +namespace adsk { namespace fusion { + +/// A collection of dependencies associated with a particular custom feature. These +/// are the entities that the custom feature is dependent on. If these entities are +/// modified, it will cause the custom feature to recompute so it can be up to date. +/// These dependencies are saved with the custom feature and can be accessed at a +/// later time, typically during the compute, to access and use the entities. +class CustomFeatureDependencies : public core::Base { +public: + + /// Function that returns the specified custom dependency using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified custom dependency given its ID. + /// id : The ID of the dependency, which was assigned when the dependency was defined. + /// Returns the specified item or null if the specified ID was not found. + core::Ptr itemById(const std::string& id) const; + + /// The number of CustomFeatureParameter objects in the collection. + size_t count() const; + + /// Adds an entity or parameter that this feature is dependent on. This is used by Fusion to know + /// when to recompute this feature and to control the behavior of the feature's node in the timeline. + /// id : An ID for this dependency. This is used to allow you to identify which dependency is which in the future. + /// The ID must be unique with respect to the other dependencies of this custom feature. + /// entity : The entity or parameter you want to add as a dependency. This can be a BRepBody, BRepFace, BrepEdge, + /// BRepVertex, a sketch, any sketch entities, a profile, any construction geometry, or any parameter. + /// Returns the created CustomFeatureDependency object and asserts if it failed. + core::Ptr add(const std::string& id, const core::Ptr& entity); + + /// Deletes all of the current dependencies. This method is for convenience and + /// is equivalent to iterating through the collection and deleting them one at a time. + /// Returns true if the operation was successful. + bool deleteAll(); + + ADSK_FUSION_CUSTOMFEATUREDEPENDENCIES_API static const char* classType(); + ADSK_FUSION_CUSTOMFEATUREDEPENDENCIES_API const char* objectType() const override; + ADSK_FUSION_CUSTOMFEATUREDEPENDENCIES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMFEATUREDEPENDENCIES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CustomFeatureDependency* item_raw(size_t index) const = 0; + virtual CustomFeatureDependency* itemById_raw(const char * id) const = 0; + virtual size_t count_raw() const = 0; + virtual CustomFeatureDependency* add_raw(const char * id, core::Base* entity) = 0; + virtual bool deleteAll_raw() = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomFeatureDependencies::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr CustomFeatureDependencies::itemById(const std::string& id) const +{ + core::Ptr res = itemById_raw(id.c_str()); + return res; +} + +inline size_t CustomFeatureDependencies::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr CustomFeatureDependencies::add(const std::string& id, const core::Ptr& entity) +{ + core::Ptr res = add_raw(id.c_str(), entity.get()); + return res; +} + +inline bool CustomFeatureDependencies::deleteAll() +{ + bool res = deleteAll_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMFEATUREDEPENDENCIES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureDependency.h b/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureDependency.h new file mode 100644 index 0000000..7a8871e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureDependency.h @@ -0,0 +1,112 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMFEATUREDEPENDENCY_CPP__ +# define ADSK_FUSION_CUSTOMFEATUREDEPENDENCY_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMFEATUREDEPENDENCY_API +# endif +#else +# define ADSK_FUSION_CUSTOMFEATUREDEPENDENCY_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CustomFeature; +}} + +namespace adsk { namespace fusion { + +/// A custom feature dependency defines a dependency the custom feature has on an entity +/// outside the custom feature. For example, a feature might be dependent on a face or a +/// point and if those entities are modified the custom feature needs to recompute to be +/// up to date. +class CustomFeatureDependency : public core::Base { +public: + + /// Returns the ID of this custom feature dependency. + std::string id() const; + + /// Gets and sets the entity associated with this dependency. + core::Ptr entity() const; + bool entity(const core::Ptr& value); + + /// Deletes this dependency from the custom feature. + /// Returns true if the delete was successful. + bool deleteMe(); + + /// Returns the custom feature this dependency is associated with. + core::Ptr parentCustomFeature() const; + + ADSK_FUSION_CUSTOMFEATUREDEPENDENCY_API static const char* classType(); + ADSK_FUSION_CUSTOMFEATUREDEPENDENCY_API const char* objectType() const override; + ADSK_FUSION_CUSTOMFEATUREDEPENDENCY_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMFEATUREDEPENDENCY_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* id_raw() const = 0; + virtual core::Base* entity_raw() const = 0; + virtual bool entity_raw(core::Base* value) = 0; + virtual bool deleteMe_raw() = 0; + virtual CustomFeature* parentCustomFeature_raw() const = 0; +}; + +// Inline wrappers + +inline std::string CustomFeatureDependency::id() const +{ + std::string res; + + char* p= id_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline core::Ptr CustomFeatureDependency::entity() const +{ + core::Ptr res = entity_raw(); + return res; +} + +inline bool CustomFeatureDependency::entity(const core::Ptr& value) +{ + return entity_raw(value.get()); +} + +inline bool CustomFeatureDependency::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline core::Ptr CustomFeatureDependency::parentCustomFeature() const +{ + core::Ptr res = parentCustomFeature_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMFEATUREDEPENDENCY_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureEvents.h b/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureEvents.h new file mode 100644 index 0000000..bf9d731 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureEvents.h @@ -0,0 +1,131 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Application/Events.h" +#include "../../Core/Application/EventHandler.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_CUSTOMFEATUREEVENTS_CPP__ +# define CUSTOMFEATUREEVENTS_API XI_EXPORT +# else +# define CUSTOMFEATUREEVENTS_API +# endif +#else +# define CUSTOMFEATUREEVENTS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CustomFeature; + class CustomFeatureEventArgs; + class CustomFeatureEventHandler; +}} +namespace adsk { namespace core { + class Status; +}} + +namespace adsk { namespace fusion { + +/// A CustomFeature event is an event associated with handling changes to a custom feature. +class CustomFeatureEvent : public core::Event { +public: + + /// Add a handler to be notified when the file event occurs. + /// handler : The handler object to be called when this event is fired. + /// Returns true if the addition of the handler was successful. + bool add(CustomFeatureEventHandler* handler); + + /// Removes a handler from the event. + /// handler : The handler object to be removed from the event. + /// Returns true if removal of the handler was successful. + bool remove(CustomFeatureEventHandler* handler); + + CUSTOMFEATUREEVENTS_API static const char* classType(); + CUSTOMFEATUREEVENTS_API const char* objectType() const override; + CUSTOMFEATUREEVENTS_API void* queryInterface(const char* id) const override; + CUSTOMFEATUREEVENTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool add_raw(CustomFeatureEventHandler* handler) = 0; + virtual bool remove_raw(CustomFeatureEventHandler* handler) = 0; +}; + +// Inline wrappers + +inline bool CustomFeatureEvent::add(CustomFeatureEventHandler* handler) +{ + bool res = add_raw(handler); + return res; +} + +inline bool CustomFeatureEvent::remove(CustomFeatureEventHandler* handler) +{ + bool res = remove_raw(handler); + return res; +} + +/// The CustomFeatureEventHandler is a client implemented class that can be added as +/// a handler to a CustomFeatureEvent. +class CustomFeatureEventHandler : public core::EventHandler { +public: + + /// The function called by Fusion 360 when the associated event is fired. + /// eventArgs : Returns an object that provides access to additional information associated with the event. + CUSTOMFEATUREEVENTS_API virtual void notify(const core::Ptr& eventArgs) = 0; +}; + +/// The CustomFeatureEventArgs provides information associated with a custom feature event. +class CustomFeatureEventArgs : public core::EventArgs { +public: + + /// Provides access to the custom feature that is being recomputed. + core::Ptr customFeature() const; + + /// Provides access to the Status object associated with this compute. If the compute is successful + /// you shouldn't do anything with this property. If the compute is not fully successful, you can + /// use this returned Status object to define any errors or warnings that occurred during the compute. + /// These warnings and errors will be shown to the user in the Alerts dialog. + core::Ptr computeStatus() const; + + CUSTOMFEATUREEVENTS_API static const char* classType(); + CUSTOMFEATUREEVENTS_API const char* objectType() const override; + CUSTOMFEATUREEVENTS_API void* queryInterface(const char* id) const override; + CUSTOMFEATUREEVENTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CustomFeature* customFeature_raw() const = 0; + virtual core::Status* computeStatus_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomFeatureEventArgs::customFeature() const +{ + core::Ptr res = customFeature_raw(); + return res; +} + +inline core::Ptr CustomFeatureEventArgs::computeStatus() const +{ + core::Ptr res = computeStatus_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef CUSTOMFEATUREEVENTS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureInput.h new file mode 100644 index 0000000..e42fae2 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureInput.h @@ -0,0 +1,161 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMFEATUREINPUT_CPP__ +# define ADSK_FUSION_CUSTOMFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_CUSTOMFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a Ruled Surface feature. +class CustomFeatureInput : public core::Base { +public: + + /// Adds an entity or parameter this feature is dependent on. This is used by Fusion to know + /// when to recompute this feature and to control the behavior of the feature's node in the timeline. + /// id : An ID for this dependency. This is used to allow you to identify which dependency is which in the future. + /// The ID must be unique with respect to the other dependencies of this custom feature. + /// entity : The entity or parameter you want to add as a dependency. This can be a BRepBody, BRepFace, BrepEdge, + /// BRepVertex, a sketch, any sketch entities, a profile, any construction geometry, or any parameter. + /// Returns true if the dependency was successfully added. + bool addDependency(const std::string& id, const core::Ptr& entity); + + /// Defines the information needed to create a new custom parameter that will be associated with + /// this feature. A custom parameter appears as a model parameter and will be listed as a child of the + /// custom feature in the parameter dialog. The custom feature will automatically have a dependency + /// on this parameter. + /// id : An id for this parameter. This is used to allow you to identify the parameter in the future. This + /// must be unique with respect to all other parameters associated with this custom feature. It's needed + /// because the label does not need to be unique and the Fusion auto-generated name can be edited by + /// the user. + /// label : The label for this parameter as seen in the parameters dialog. This identifies to the user the purpose + /// of this parameter. For example, when you create an extrusion with a specific distance, there are two + /// parameters displayed in the parameters dialog with the labels "AlongDistance" and "TaperAngle". This does + /// not have to be unique because in the case of a fillet feature there can be multiple parameters all labeled "Radius". + /// value : ValueInput object that specifies the value of the parameter. If the ValueInput was created using a real, + /// the value will be interpreted using the internal unit for the unit type specified by the "units" argument. + /// For example, if the ValueInput was created using the real value 5 and the input to the "units" argument is + /// any valid length unit, the value will be interpreted as 5 centimeters since centimeters is the internal unit + /// for lengths. If the "units" argument is a valid angle unit the value will be interpreted as 5 radians. + /// If the ValueInput was created using a string, the string is used as-is for the expression of the parameter. + /// This means if there are units as part of the string it must evaluate to the same unit type as that specified + /// by the "units" argument and if no units are specified it will use the current default units specified for + /// the current document. For example, if the ValueInput was created with the string "5 in", then the "units" + /// argument must define any valid length so it is compatible. If the ValueInput was created with the string "5", + /// any unit type can be used and the result will be 5 of that unit. + /// When using a ValueInput created using a string, it's the same as creating a parameter in the user-interface. + /// You can specify any valid expression, i.e. "5", "5 in", "5 in / 2", "5 + Length", etc. and you can choose + /// from many different types of units. The only requirement is that the units must match in type. For example, + /// they must both be lengths, or they must both be angles. + /// units : The units to use for the value of the parameter. Units specified must match the units specified (if any) + /// in the ValueInput object. + /// To create a parameter with no units (unitless) you can specify either an empty string. + /// isVisible : Optional argument that specifies if the parameter will be visible in the parameters dialog or not. By + /// default the parameter will be visible. + /// This can be useful in cases where the feature can be edited to be in different states where a parameter + /// is only valid in a certain state. You can change the visibility based on the current state of the feature + /// and if that parameter should be available for edit. This implies that you create all the parameters that + /// might be needed and then change their visibility based on the current state of the feature. The parameters + /// that are not visible will not be returned by the ModelParameters collection and are only available through + /// the custom feature they're associated with. + /// Returns true if the definition of the model parameter was successfully added. + bool addCustomParameter(const std::string& id, const std::string& label, const core::Ptr& value, const std::string& units, bool isVisible = true); + + /// Sets the start and end features that the custom feature will group. A "feature" in this + /// case is an object that is visible in the timeline, such as modeling features, sketches, + /// and construction geometry. The custom feature will group the input start and end features + /// and all features between them in the timeline. + /// You can determine the current start and end features using the features property and use + /// the first and last features returned. If the custom feature contains a single feature, + /// you can use the same feature for both the start and end feature arguments. You can also + /// use null for both arguments to remove all features from a custom feature. The custom feature + /// still exists but will be empty, and the features will be displayed individually within the timeline. + /// startFeature : The first feature in the timeline that the custom feature will group. + /// endFeature : The last feature in the timeline that the custom feature will group. When creating a custom feature + /// that contains a single feature, this can be the same feature as the startFeature argument. + /// Returns true if setting the start and end features was successful. + bool setStartAndEndFeatures(const core::Ptr& startFeature, const core::Ptr& endFeature); + + /// Returns the features that are grouped by this custom feature. The start and end features and all of + /// the features between them in the timeline are returned. This includes all entities represented in + /// the timeline including modeling features, construction geometry, sketches, etc. + std::vector> features() const; + + ADSK_FUSION_CUSTOMFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_CUSTOMFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_CUSTOMFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool addDependency_raw(const char * id, core::Base* entity) = 0; + virtual bool addCustomParameter_raw(const char * id, const char * label, core::ValueInput* value, const char * units, bool isVisible) = 0; + virtual bool setStartAndEndFeatures_raw(core::Base* startFeature, core::Base* endFeature) = 0; + virtual core::Base** features_raw(size_t& return_size) const = 0; +}; + +// Inline wrappers + +inline bool CustomFeatureInput::addDependency(const std::string& id, const core::Ptr& entity) +{ + bool res = addDependency_raw(id.c_str(), entity.get()); + return res; +} + +inline bool CustomFeatureInput::addCustomParameter(const std::string& id, const std::string& label, const core::Ptr& value, const std::string& units, bool isVisible) +{ + bool res = addCustomParameter_raw(id.c_str(), label.c_str(), value.get(), units.c_str(), isVisible); + return res; +} + +inline bool CustomFeatureInput::setStartAndEndFeatures(const core::Ptr& startFeature, const core::Ptr& endFeature) +{ + bool res = setStartAndEndFeatures_raw(startFeature.get(), endFeature.get()); + return res; +} + +inline std::vector> CustomFeatureInput::features() const +{ + std::vector> res; + size_t s; + + core::Base** p= features_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureParameter.h b/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureParameter.h new file mode 100644 index 0000000..2385e11 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureParameter.h @@ -0,0 +1,105 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../Fusion/ModelParameter.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMFEATUREPARAMETER_CPP__ +# define ADSK_FUSION_CUSTOMFEATUREPARAMETER_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMFEATUREPARAMETER_API +# endif +#else +# define ADSK_FUSION_CUSTOMFEATUREPARAMETER_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CustomFeature; +}} + +namespace adsk { namespace fusion { + +/// A custom parameter is a parameter that was created as the result of a custom feature +/// being created. It is associated with the custom feature and it's lifetime is the same +/// as the custom feature that owns it. +class CustomFeatureParameter : public ModelParameter { +public: + + /// Returns the ID of this custom feature parameter. + std::string id() const; + + /// Gets and sets if this parameter is visible in the parameters dialog. By default, all new parameters are visible. + /// This can be useful in cases where the feature can be edited to be in different states where a parameter + /// is only valid in a certain state. You can change the visibility based on the current state of the feature + /// and if that parameter should be available for edit. This implies that you create all the parameters that + /// might be needed and then change their visibility based on the current state of the feature. The parameters + /// that are not visible will not be returned by the ModelParameters collection and are only available through + /// the custom feature they're associated with. + bool isVisible() const; + bool isVisible(bool value); + + /// Returns the custom feature this parameter is associated with. + core::Ptr parentCustomFeature() const; + + ADSK_FUSION_CUSTOMFEATUREPARAMETER_API static const char* classType(); + ADSK_FUSION_CUSTOMFEATUREPARAMETER_API const char* objectType() const override; + ADSK_FUSION_CUSTOMFEATUREPARAMETER_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMFEATUREPARAMETER_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* id_raw() const = 0; + virtual bool isVisible_raw() const = 0; + virtual bool isVisible_raw(bool value) = 0; + virtual CustomFeature* parentCustomFeature_raw() const = 0; +}; + +// Inline wrappers + +inline std::string CustomFeatureParameter::id() const +{ + std::string res; + + char* p= id_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomFeatureParameter::isVisible() const +{ + bool res = isVisible_raw(); + return res; +} + +inline bool CustomFeatureParameter::isVisible(bool value) +{ + return isVisible_raw(value); +} + +inline core::Ptr CustomFeatureParameter::parentCustomFeature() const +{ + core::Ptr res = parentCustomFeature_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMFEATUREPARAMETER_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureParameters.h b/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureParameters.h new file mode 100644 index 0000000..134b7b1 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CustomFeatureParameters.h @@ -0,0 +1,88 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMFEATUREPARAMETERS_CPP__ +# define ADSK_FUSION_CUSTOMFEATUREPARAMETERS_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMFEATUREPARAMETERS_API +# endif +#else +# define ADSK_FUSION_CUSTOMFEATUREPARAMETERS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CustomFeatureParameter; +}} + +namespace adsk { namespace fusion { + +/// A collection of custom parameters associated with a particular custom feature. +class CustomFeatureParameters : public core::Base { +public: + + /// Function that returns the specified custom parameter feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of CustomFeatureParameter objects in the collection. + size_t count() const; + + /// Function that returns the specified CustomParameter object given its ID. + /// id : The ID of the custom parameter, which was assigned when the parameter was defined and the custom feature was created. + /// Returns the specified item or null if the specified ID was not found. + core::Ptr itemById(const std::string& id) const; + + ADSK_FUSION_CUSTOMFEATUREPARAMETERS_API static const char* classType(); + ADSK_FUSION_CUSTOMFEATUREPARAMETERS_API const char* objectType() const override; + ADSK_FUSION_CUSTOMFEATUREPARAMETERS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMFEATUREPARAMETERS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CustomFeatureParameter* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual CustomFeatureParameter* itemById_raw(const char * id) const = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomFeatureParameters::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t CustomFeatureParameters::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr CustomFeatureParameters::itemById(const std::string& id) const +{ + core::Ptr res = itemById_raw(id.c_str()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMFEATUREPARAMETERS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CustomFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/CustomFeatures.h new file mode 100644 index 0000000..b3c49bf --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CustomFeatures.h @@ -0,0 +1,129 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMFEATURES_CPP__ +# define ADSK_FUSION_CUSTOMFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMFEATURES_API +# endif +#else +# define ADSK_FUSION_CUSTOMFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CustomFeature; + class CustomFeatureDefinition; + class CustomFeatureInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing custom features in a component +/// and supports the ability to create new custom features. +class CustomFeatures : public core::Base { +public: + + /// Function that returns the specified ruled surface feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of CustomFeature objects in the collection. + size_t count() const; + + /// Function that returns the specified CustomFeature feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// Creates a new input object that you use to define a custom feature. Creating an input object doesn't + /// create the feature but provides a way to gather all of the input needed to create a custom feature. + /// To create the custom feature, the fully defined input object is passed to the add method. + /// definition : The CustomFeatureDefinition for the type of custom feature being created. + /// Returns the newly created CustomFeatureInput object or null in the case of invalid input. + core::Ptr createInput(const core::Ptr& definition) const; + + /// Creates a new custom feature. + /// input : The CustomFeatureInput object that defines the information needed to create a custom feature. + /// Returns the newly created CustomFeature. + core::Ptr add(const core::Ptr& input); + + typedef CustomFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_CUSTOMFEATURES_API static const char* classType(); + ADSK_FUSION_CUSTOMFEATURES_API const char* objectType() const override; + ADSK_FUSION_CUSTOMFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CustomFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual CustomFeature* itemByName_raw(const char * name) const = 0; + virtual CustomFeatureInput* createInput_raw(CustomFeatureDefinition* definition) const = 0; + virtual CustomFeature* add_raw(CustomFeatureInput* input) = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t CustomFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr CustomFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline core::Ptr CustomFeatures::createInput(const core::Ptr& definition) const +{ + core::Ptr res = createInput_raw(definition.get()); + return res; +} + +inline core::Ptr CustomFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +template inline void CustomFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CustomNamedValues.h b/usr/autodesk/CPP/include/Fusion/Features/CustomNamedValues.h new file mode 100644 index 0000000..3eba916 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CustomNamedValues.h @@ -0,0 +1,142 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMNAMEDVALUES_CPP__ +# define ADSK_FUSION_CUSTOMNAMEDVALUES_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMNAMEDVALUES_API +# endif +#else +# define ADSK_FUSION_CUSTOMNAMEDVALUES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// A collection of named values. The values are strings that Fusion stores but can be +/// anything you choose. If you have several things you need to save you can choose to +/// combine the data into a JSON or XML representation and save it as a single custom value +/// or create a new custom value or each unique value you want to store. Fusion doesn't care +/// what the value is or what it represents but only saves and provides access to it. +class CustomNamedValues : public core::Base { +public: + + /// Adds or updates a value. If the specified ID does not exist, a new named value is + /// added. If the ID does exist, the named value is updated with the specified value. + /// id : The ID of the value to create or change. + /// value : The string to assign to the value. + /// Returns true is successful and false if it failed. + bool addOrSetValue(const std::string& id, const std::string& value); + + /// Function that returns if a value with the specified ID exists or not. + /// id : The ID of the value to check if it exists. + /// Returns true if a value with the ID exists. + bool isExistingValue(const std::string& id); + + /// Function that returns the specified value given its ID. + /// id : The ID of the value, which was assigned when the value was created. + /// Returns the value or an empty string if the specified ID was not found. + std::string value(const std::string& id); + + /// Function that returns the name of a value specified by its index. + /// index : The index of the item within the collection to return the name of. The first item in the collection has an index of 0 + /// and the last item is the count of this collection minus 1. + /// Returns the ID of the specified item or asserts if an out of bounds index is used. + std::string idByIndex(size_t index); + + /// The number of values in the collection. + size_t count() const; + + /// Removes the specified value from the collection. + /// id : The ID of the value to remove. + /// Returns true if the value was successfully removed and false if it failed. + /// Failure is typically because the specified ID does not exist within the collection. + bool remove(const std::string& id); + + ADSK_FUSION_CUSTOMNAMEDVALUES_API static const char* classType(); + ADSK_FUSION_CUSTOMNAMEDVALUES_API const char* objectType() const override; + ADSK_FUSION_CUSTOMNAMEDVALUES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMNAMEDVALUES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool addOrSetValue_raw(const char * id, const char * value) = 0; + virtual bool isExistingValue_raw(const char * id) = 0; + virtual char* value_raw(const char * id) = 0; + virtual char* idByIndex_raw(size_t index) = 0; + virtual size_t count_raw() const = 0; + virtual bool remove_raw(const char * id) = 0; +}; + +// Inline wrappers + +inline bool CustomNamedValues::addOrSetValue(const std::string& id, const std::string& value) +{ + bool res = addOrSetValue_raw(id.c_str(), value.c_str()); + return res; +} + +inline bool CustomNamedValues::isExistingValue(const std::string& id) +{ + bool res = isExistingValue_raw(id.c_str()); + return res; +} + +inline std::string CustomNamedValues::value(const std::string& id) +{ + std::string res; + + char* p= value_raw(id.c_str()); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string CustomNamedValues::idByIndex(size_t index) +{ + std::string res; + + char* p= idByIndex_raw(index); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline size_t CustomNamedValues::count() const +{ + size_t res = count_raw(); + return res; +} + +inline bool CustomNamedValues::remove(const std::string& id) +{ + bool res = remove_raw(id.c_str()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMNAMEDVALUES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CutPasteBodies.h b/usr/autodesk/CPP/include/Fusion/Features/CutPasteBodies.h new file mode 100644 index 0000000..08e39cb --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CutPasteBodies.h @@ -0,0 +1,114 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUTPASTEBODIES_CPP__ +# define ADSK_FUSION_CUTPASTEBODIES_API XI_EXPORT +# else +# define ADSK_FUSION_CUTPASTEBODIES_API +# endif +#else +# define ADSK_FUSION_CUTPASTEBODIES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CutPasteBody; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing cut-paste features in a design. +/// These are created in the UI by cutting and then pasting a B-Rep body. +class CutPasteBodies : public core::Base { +public: + + /// Function that returns the specified Cut/Paste Body feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified Cut/Paste Body feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of Cut/Paste Body features in the collection. + size_t count() const; + + /// Cuts and copies the specified body into the component that owns this CutPasteBodies collection. + /// This is effectively the equivalent of moving a body. + /// sourceBody : Either an ObjectCollection of BRepBodies or a single BRepBody object to cut. + /// Returns the newly created BRepBody object or null in the case of failure. + core::Ptr add(const core::Ptr& sourceBody); + + typedef CutPasteBody iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_CUTPASTEBODIES_API static const char* classType(); + ADSK_FUSION_CUTPASTEBODIES_API const char* objectType() const override; + ADSK_FUSION_CUTPASTEBODIES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUTPASTEBODIES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CutPasteBody* item_raw(size_t index) const = 0; + virtual CutPasteBody* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual CutPasteBody* add_raw(core::Base* sourceBody) = 0; +}; + +// Inline wrappers + +inline core::Ptr CutPasteBodies::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr CutPasteBodies::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t CutPasteBodies::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr CutPasteBodies::add(const core::Ptr& sourceBody) +{ + core::Ptr res = add_raw(sourceBody.get()); + return res; +} + +template inline void CutPasteBodies::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUTPASTEBODIES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CutPasteBody.h b/usr/autodesk/CPP/include/Fusion/Features/CutPasteBody.h new file mode 100644 index 0000000..9ef672d --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CutPasteBody.h @@ -0,0 +1,67 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUTPASTEBODY_CPP__ +# define ADSK_FUSION_CUTPASTEBODY_API XI_EXPORT +# else +# define ADSK_FUSION_CUTPASTEBODY_API +# endif +#else +# define ADSK_FUSION_CUTPASTEBODY_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing Cut/Paste Body feature in a design. +class CutPasteBody : public Feature { +public: + + /// Returns the bodies that were cut to create the result bodies of this feature. An ObjectCollection + /// is returned that will contain the original bodies. It's possible that the collection can be empty + /// or contain less than the number of bodies originally copied. This happens in the case where a body + /// has been deleted or consumed by some other operation. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr sourceBody() const; + + ADSK_FUSION_CUTPASTEBODY_API static const char* classType(); + ADSK_FUSION_CUTPASTEBODY_API const char* objectType() const override; + ADSK_FUSION_CUTPASTEBODY_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUTPASTEBODY_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* sourceBody_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr CutPasteBody::sourceBody() const +{ + core::Ptr res = sourceBody_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUTPASTEBODY_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CylinderFeature.h b/usr/autodesk/CPP/include/Fusion/Features/CylinderFeature.h new file mode 100644 index 0000000..bd063ca --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CylinderFeature.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CYLINDERFEATURE_CPP__ +# define ADSK_FUSION_CYLINDERFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_CYLINDERFEATURE_API +# endif +#else +# define ADSK_FUSION_CYLINDERFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Object that represents an existing cylinder feature in a design. +class CylinderFeature : public Feature { +public: + + ADSK_FUSION_CYLINDERFEATURE_API static const char* classType(); + ADSK_FUSION_CYLINDERFEATURE_API const char* objectType() const override; + ADSK_FUSION_CYLINDERFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CYLINDERFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CYLINDERFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/CylinderFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/CylinderFeatures.h new file mode 100644 index 0000000..d10f0c1 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/CylinderFeatures.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CYLINDERFEATURES_CPP__ +# define ADSK_FUSION_CYLINDERFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_CYLINDERFEATURES_API +# endif +#else +# define ADSK_FUSION_CYLINDERFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CylinderFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing cylinder features in a design. +class CylinderFeatures : public core::Base { +public: + + /// Function that returns the specified cylinder feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified cylinder feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of cylinder features in the collection. + size_t count() const; + + typedef CylinderFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_CYLINDERFEATURES_API static const char* classType(); + ADSK_FUSION_CYLINDERFEATURES_API const char* objectType() const override; + ADSK_FUSION_CYLINDERFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CYLINDERFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CylinderFeature* item_raw(size_t index) const = 0; + virtual CylinderFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr CylinderFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr CylinderFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t CylinderFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void CylinderFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CYLINDERFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/DeleteFaceFeature.h b/usr/autodesk/CPP/include/Fusion/Features/DeleteFaceFeature.h new file mode 100644 index 0000000..ed313e5 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/DeleteFaceFeature.h @@ -0,0 +1,122 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_DELETEFACEFEATURE_CPP__ +# define ADSK_FUSION_DELETEFACEFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_DELETEFACEFEATURE_API +# endif +#else +# define ADSK_FUSION_DELETEFACEFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepFace; + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing DeleteFaceFeature object in a design. +/// The SurfaceDeleteFaceFeature and DeleteFaceFeature differ in that the SurfaceDeleteFaceFeature +/// can delete any face without any restrictions. If the body is a solid, it will become a surface +/// when the first face is deleted. The specified face is deleted without any other changes being +/// made to the body. The DeleteFaceFeature deletes the specified face and also modifies the other faces +/// in the body to heal or fill in the area of the deleted face. This means that a solid body will +/// remain solid. +class DeleteFaceFeature : public Feature { +public: + + /// Gets and sets the set of faces that are deleted by this feature. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// Setting this property can fail if Fusion 360 is unable to heal the body after + /// deleting the specified faces. + std::vector> deletedFaces() const; + bool deletedFaces(const std::vector>& value); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_DELETEFACEFEATURE_API static const char* classType(); + ADSK_FUSION_DELETEFACEFEATURE_API const char* objectType() const override; + ADSK_FUSION_DELETEFACEFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_DELETEFACEFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepFace** deletedFaces_raw(size_t& return_size) const = 0; + virtual bool deletedFaces_raw(BRepFace** value, size_t value_size) = 0; + virtual DeleteFaceFeature* nativeObject_raw() const = 0; + virtual DeleteFaceFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline std::vector> DeleteFaceFeature::deletedFaces() const +{ + std::vector> res; + size_t s; + + BRepFace** p= deletedFaces_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool DeleteFaceFeature::deletedFaces(const std::vector>& value) +{ + BRepFace** value_ = new BRepFace*[value.size()]; + for(size_t i=0; i DeleteFaceFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr DeleteFaceFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_DELETEFACEFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/DeleteFaceFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/DeleteFaceFeatures.h new file mode 100644 index 0000000..8b8ee66 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/DeleteFaceFeatures.h @@ -0,0 +1,122 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_DELETEFACEFEATURES_CPP__ +# define ADSK_FUSION_DELETEFACEFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_DELETEFACEFEATURES_API +# endif +#else +# define ADSK_FUSION_DELETEFACEFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class DeleteFaceFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing DeleteFaceFeature features in a component +/// and supports the ability to create new DeleteFaceFeature features. +/// The SurfaceDeleteFaceFeature and DeleteFaceFeature differ in that the SurfaceDeleteFaceFeature +/// can delete any face without any restrictions. If the body is a solid, it will become a surface +/// when the first face is deleted. The specified face is deleted without any other changes being +/// made to the body. The DeleteFaceFeature deletes the specified face and also modifies the other faces +/// in the body to heal or fill in the area of the deleted face. This means that a solid body will +/// remain solid. +class DeleteFaceFeatures : public core::Base { +public: + + /// Function that returns the specified DeleteFaceFeature object using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified DeleteFaceFeature object using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of DeleteFaceFeature objects in the collection. + size_t count() const; + + /// Creates a new SurfaceDeleteFace feature. This deletes the specified faces + /// from their bodies and attempts to heal the body. The method will fail if + /// the body cannot be healed. This is equivalent to selecting and deleting + /// faces when in the Patch workspace. + /// facesToDelete : A single BRepFace or an ObjectCollection containing multiple BRepFace objects. + /// Returns the newly created DeleteFaceFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& facesToDelete); + + typedef DeleteFaceFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_DELETEFACEFEATURES_API static const char* classType(); + ADSK_FUSION_DELETEFACEFEATURES_API const char* objectType() const override; + ADSK_FUSION_DELETEFACEFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_DELETEFACEFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual DeleteFaceFeature* item_raw(size_t index) const = 0; + virtual DeleteFaceFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual DeleteFaceFeature* add_raw(core::Base* facesToDelete) = 0; +}; + +// Inline wrappers + +inline core::Ptr DeleteFaceFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr DeleteFaceFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t DeleteFaceFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr DeleteFaceFeatures::add(const core::Ptr& facesToDelete) +{ + core::Ptr res = add_raw(facesToDelete.get()); + return res; +} + +template inline void DeleteFaceFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_DELETEFACEFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/DistanceAndAngleChamferEdgeSet.h b/usr/autodesk/CPP/include/Fusion/Features/DistanceAndAngleChamferEdgeSet.h new file mode 100644 index 0000000..6d159b3 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/DistanceAndAngleChamferEdgeSet.h @@ -0,0 +1,117 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ChamferEdgeSet.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_DISTANCEANDANGLECHAMFEREDGESET_CPP__ +# define ADSK_FUSION_DISTANCEANDANGLECHAMFEREDGESET_API XI_EXPORT +# else +# define ADSK_FUSION_DISTANCEANDANGLECHAMFEREDGESET_API +# endif +#else +# define ADSK_FUSION_DISTANCEANDANGLECHAMFEREDGESET_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the edges and the parameter associated with a chord length fillet. +class DistanceAndAngleChamferEdgeSet : public ChamferEdgeSet { +public: + + /// Gets and sets the edges that will be chamfered. This collection can contain BRepEdge, BRepFace, + /// and Feature objects. If BRepFace or Feature are objects are provided, all of the edges associated + /// with those objects will be chamfered. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr edges() const; + bool edges(const core::Ptr& value); + + /// Returns the model parameter that controls the offset distance of the chamfer. + /// You can edit the distance by using the properties on the returned ModelParameter object. + core::Ptr distance() const; + + /// Returns the model parameter that controls the angle of the chamfer. + /// You can edit the distance by using the properties on the returned ModelParameter object. + core::Ptr angle() const; + + /// Gets and sets if the chamfer is flipped. This swaps the directions for distance one and two. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isFlipped() const; + bool isFlipped(bool value); + + ADSK_FUSION_DISTANCEANDANGLECHAMFEREDGESET_API static const char* classType(); + ADSK_FUSION_DISTANCEANDANGLECHAMFEREDGESET_API const char* objectType() const override; + ADSK_FUSION_DISTANCEANDANGLECHAMFEREDGESET_API void* queryInterface(const char* id) const override; + ADSK_FUSION_DISTANCEANDANGLECHAMFEREDGESET_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* edges_raw() const = 0; + virtual bool edges_raw(core::ObjectCollection* value) = 0; + virtual ModelParameter* distance_raw() const = 0; + virtual ModelParameter* angle_raw() const = 0; + virtual bool isFlipped_raw() const = 0; + virtual bool isFlipped_raw(bool value) = 0; +}; + +// Inline wrappers + +inline core::Ptr DistanceAndAngleChamferEdgeSet::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline bool DistanceAndAngleChamferEdgeSet::edges(const core::Ptr& value) +{ + return edges_raw(value.get()); +} + +inline core::Ptr DistanceAndAngleChamferEdgeSet::distance() const +{ + core::Ptr res = distance_raw(); + return res; +} + +inline core::Ptr DistanceAndAngleChamferEdgeSet::angle() const +{ + core::Ptr res = angle_raw(); + return res; +} + +inline bool DistanceAndAngleChamferEdgeSet::isFlipped() const +{ + bool res = isFlipped_raw(); + return res; +} + +inline bool DistanceAndAngleChamferEdgeSet::isFlipped(bool value) +{ + return isFlipped_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_DISTANCEANDANGLECHAMFEREDGESET_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/DistanceAndAngleChamferTypeDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/DistanceAndAngleChamferTypeDefinition.h new file mode 100644 index 0000000..1750764 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/DistanceAndAngleChamferTypeDefinition.h @@ -0,0 +1,74 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ChamferTypeDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_DISTANCEANDANGLECHAMFERTYPEDEFINITION_CPP__ +# define ADSK_FUSION_DISTANCEANDANGLECHAMFERTYPEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_DISTANCEANDANGLECHAMFERTYPEDEFINITION_API +# endif +#else +# define ADSK_FUSION_DISTANCEANDANGLECHAMFERTYPEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; +}} + +namespace adsk { namespace fusion { + +/// Provides information to create a chamfer that is defined by a distance from the edge and an angle. +class DistanceAndAngleChamferTypeDefinition : public ChamferTypeDefinition { +public: + + /// Returns the parameter controlling the distance. You can edit the distance + /// by editing the value of the parameter object. + core::Ptr distance() const; + + /// Returns the parameter controlling the angle. You can edit the angle + /// by editing the value of the parameter object. + core::Ptr angle() const; + + ADSK_FUSION_DISTANCEANDANGLECHAMFERTYPEDEFINITION_API static const char* classType(); + ADSK_FUSION_DISTANCEANDANGLECHAMFERTYPEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_DISTANCEANDANGLECHAMFERTYPEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_DISTANCEANDANGLECHAMFERTYPEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ModelParameter* distance_raw() const = 0; + virtual ModelParameter* angle_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr DistanceAndAngleChamferTypeDefinition::distance() const +{ + core::Ptr res = distance_raw(); + return res; +} + +inline core::Ptr DistanceAndAngleChamferTypeDefinition::angle() const +{ + core::Ptr res = angle_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_DISTANCEANDANGLECHAMFERTYPEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/DistanceExtentDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/DistanceExtentDefinition.h new file mode 100644 index 0000000..408ee24 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/DistanceExtentDefinition.h @@ -0,0 +1,101 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExtentDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_DISTANCEEXTENTDEFINITION_CPP__ +# define ADSK_FUSION_DISTANCEEXTENTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_DISTANCEEXTENTDEFINITION_API +# endif +#else +# define ADSK_FUSION_DISTANCEEXTENTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Defines the inputs for a distance ExtentDefinition object. +/// This feature extent type defines the distance as well as whether the extent is symmetric +/// or in only one direction. If the extent is not symmetric, a positive or negative distance +/// can be used to control the direction. +/// For a hole, the IsSymmetric property value will always be false. +class DistanceExtentDefinition : public ExtentDefinition { +public: + + /// Gets and sets if the distance extent is symmetric or not + /// For a hole this property will always return false and setting it is ignored. + bool isSymmetric() const; + bool isSymmetric(bool value); + + /// Returns the parameter controlling the distance. You can edit the distance + /// by editing the value of the parameter object. + core::Ptr distance() const; + + /// Statically creates a new DistanceExtentDefinition object. This is used as input when + /// defining the extents of a feature to be a specified distance. + /// distance : A ValueInput that defines the distance of the extrusion. + /// Returns the newly created DistanceExtentDefinition or null in the case of failure. + static core::Ptr create(const core::Ptr& distance); + + ADSK_FUSION_DISTANCEEXTENTDEFINITION_API static const char* classType(); + ADSK_FUSION_DISTANCEEXTENTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_DISTANCEEXTENTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_DISTANCEEXTENTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool isSymmetric_raw() const = 0; + virtual bool isSymmetric_raw(bool value) = 0; + virtual ModelParameter* distance_raw() const = 0; + ADSK_FUSION_DISTANCEEXTENTDEFINITION_API static DistanceExtentDefinition* create_raw(core::ValueInput* distance); +}; + +// Inline wrappers + +inline bool DistanceExtentDefinition::isSymmetric() const +{ + bool res = isSymmetric_raw(); + return res; +} + +inline bool DistanceExtentDefinition::isSymmetric(bool value) +{ + return isSymmetric_raw(value); +} + +inline core::Ptr DistanceExtentDefinition::distance() const +{ + core::Ptr res = distance_raw(); + return res; +} + +inline core::Ptr DistanceExtentDefinition::create(const core::Ptr& distance) +{ + core::Ptr res = create_raw(distance.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_DISTANCEEXTENTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/DraftFeature.h b/usr/autodesk/CPP/include/Fusion/Features/DraftFeature.h new file mode 100644 index 0000000..bf87355 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/DraftFeature.h @@ -0,0 +1,226 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_DRAFTFEATURE_CPP__ +# define ADSK_FUSION_DRAFTFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_DRAFTFEATURE_API +# endif +#else +# define ADSK_FUSION_DRAFTFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepFace; + class ExtentDefinition; + class Occurrence; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing draft feature in a design. +class DraftFeature : public Feature { +public: + + /// Gets and sets the input faces. + /// If isTangentChain is true, all the faces that are tangentially connected to the input faces (if any) will also be included. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + std::vector> inputFaces() const; + bool inputFaces(const std::vector>& value); + + /// Gets and sets the plane that defines the direction in which the draft is applied. This can be a planar BrepFace, or a ConstructionPlane. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr plane() const; + bool plane(const core::Ptr& value); + + /// Gets and sets if any faces that are tangentially connected to any of + /// the input faces will also be included in setting InputEntities. It defaults to true. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isTangentChain() const; + bool isTangentChain(bool value); + + /// Gets and sets if the direction of the draft is flipped. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isDirectionFlipped() const; + bool isDirectionFlipped(bool value); + + /// Gets the definition object that specifies how the draft is defined. Modifying the + /// definition object will cause the draft to recompute. This can return either an + /// AngleExtentDefinition or TwoSidesAngleExtentDefinition object. This property + /// returns nothing in the case where the feature is non-parametric. Use this property + /// to access the parameters controlling the draft and whether the draft is symmetric or not. + core::Ptr draftDefinition() const; + + /// Changes the definition of the feature so that a single angle is used for all drafts. + /// If the isSymmetric is true then the faces are split along the parting plane and drafted + /// independently using the same angle. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// isSymmetric : Set to 'true' if the faces are to be split along the plane and drafted symmetrically. This + /// will have the side effect of setting the isSymmetric property to the same value. + /// angle : The ValueInput object that defines the angle of the draft. This can be a positive or negative + /// value which will affect the direction of the draft along with the isDirectionFlipped property. + /// Returns true if successful + bool setSingleAngle(bool isSymmetric, const core::Ptr& angle); + + /// Changes the definition of the feature so that the surfaces are split along the draft plane and + /// the faces on each side of the plane are drafted independently from the other side. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// angleOne : The ValueInput object that defines the angle for the faces on the first side of the draft plane. + /// angleTwo : The ValueInput object that defines the angle for the faces on the second side of the draft plane. + /// Returns true if successful + bool setTwoAngles(const core::Ptr& angleOne, const core::Ptr& angleTwo); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_DRAFTFEATURE_API static const char* classType(); + ADSK_FUSION_DRAFTFEATURE_API const char* objectType() const override; + ADSK_FUSION_DRAFTFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_DRAFTFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepFace** inputFaces_raw(size_t& return_size) const = 0; + virtual bool inputFaces_raw(BRepFace** value, size_t value_size) = 0; + virtual core::Base* plane_raw() const = 0; + virtual bool plane_raw(core::Base* value) = 0; + virtual bool isTangentChain_raw() const = 0; + virtual bool isTangentChain_raw(bool value) = 0; + virtual bool isDirectionFlipped_raw() const = 0; + virtual bool isDirectionFlipped_raw(bool value) = 0; + virtual ExtentDefinition* draftDefinition_raw() const = 0; + virtual bool setSingleAngle_raw(bool isSymmetric, core::ValueInput* angle) = 0; + virtual bool setTwoAngles_raw(core::ValueInput* angleOne, core::ValueInput* angleTwo) = 0; + virtual DraftFeature* nativeObject_raw() const = 0; + virtual DraftFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline std::vector> DraftFeature::inputFaces() const +{ + std::vector> res; + size_t s; + + BRepFace** p= inputFaces_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool DraftFeature::inputFaces(const std::vector>& value) +{ + BRepFace** value_ = new BRepFace*[value.size()]; + for(size_t i=0; i DraftFeature::plane() const +{ + core::Ptr res = plane_raw(); + return res; +} + +inline bool DraftFeature::plane(const core::Ptr& value) +{ + return plane_raw(value.get()); +} + +inline bool DraftFeature::isTangentChain() const +{ + bool res = isTangentChain_raw(); + return res; +} + +inline bool DraftFeature::isTangentChain(bool value) +{ + return isTangentChain_raw(value); +} + +inline bool DraftFeature::isDirectionFlipped() const +{ + bool res = isDirectionFlipped_raw(); + return res; +} + +inline bool DraftFeature::isDirectionFlipped(bool value) +{ + return isDirectionFlipped_raw(value); +} + +inline core::Ptr DraftFeature::draftDefinition() const +{ + core::Ptr res = draftDefinition_raw(); + return res; +} + +inline bool DraftFeature::setSingleAngle(bool isSymmetric, const core::Ptr& angle) +{ + bool res = setSingleAngle_raw(isSymmetric, angle.get()); + return res; +} + +inline bool DraftFeature::setTwoAngles(const core::Ptr& angleOne, const core::Ptr& angleTwo) +{ + bool res = setTwoAngles_raw(angleOne.get(), angleTwo.get()); + return res; +} + +inline core::Ptr DraftFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr DraftFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_DRAFTFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/DraftFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/DraftFeatureInput.h new file mode 100644 index 0000000..58419dc --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/DraftFeatureInput.h @@ -0,0 +1,228 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_DRAFTFEATUREINPUT_CPP__ +# define ADSK_FUSION_DRAFTFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_DRAFTFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_DRAFTFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class BRepFace; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a draft +/// feature. +class DraftFeatureInput : public core::Base { +public: + + /// Gets and sets the input faces. + /// If IsTangentChain is true, all the faces that are tangentially connected to the input faces (if any) will also be included. + std::vector> inputFaces() const; + bool inputFaces(const std::vector>& value); + + /// Gets and sets the plane that defines the direction in which the draft is applied. This can be a planar BrepFace, or a ConstructionPlane. + core::Ptr plane() const; + bool plane(const core::Ptr& value); + + /// Gets and sets if any faces that are tangentially connected to any of + /// the input faces will also be included in setting InputEntities. It defaults to true. + bool isTangentChain() const; + bool isTangentChain(bool value); + + /// Gets and sets if the direction of the draft is flipped. + bool isDirectionFlipped() const; + bool isDirectionFlipped(bool value); + + /// Defines the draft to be defined so that a single angle is used for all drafts. + /// If the isSymmetric is true then the faces are split along the parting plane and drafted + /// independently using the same angle. + /// isSymmetric : Set to 'true' if the faces are to be split along the plane and drafted symmetrically. This + /// will have the side effect of setting the isSymmetric property to the same value. + /// angle : The ValueInput object that defines the angle of the draft. This can be a positive or negative + /// value which will affect the direction of the draft along with the isDirectionFlipped property. + /// Returns true if successful + bool setSingleAngle(bool isSymmetric, const core::Ptr& angle); + + /// Defines both angles to use when the surfaces are split along the draft plane and + /// the faces on each side of the plane are drafted independently from the other side. + /// angleOne : The ValueInput object that defines the angle for the faces on the first side of the draft plane. + /// angleTwo : The ValueInput object that defines the angle for the faces on the second side of the draft plane. + /// Returns true if successful + bool setTwoAngles(const core::Ptr& angleOne, const core::Ptr& angleTwo); + + /// Gets the first, or the only angle in the case of a single angle definition. + core::Ptr angleOne() const; + + /// Gets the second angle. This can be null in the case where a single angle definition is used. + core::Ptr angleTwo() const; + + /// Gets if the draft is symmetric from the draft plane. This only applies in the case where two + /// angles have been specified and should be ignored otherwise. + bool isSymmetric() const; + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_DRAFTFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_DRAFTFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_DRAFTFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_DRAFTFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepFace** inputFaces_raw(size_t& return_size) const = 0; + virtual bool inputFaces_raw(BRepFace** value, size_t value_size) = 0; + virtual core::Base* plane_raw() const = 0; + virtual bool plane_raw(core::Base* value) = 0; + virtual bool isTangentChain_raw() const = 0; + virtual bool isTangentChain_raw(bool value) = 0; + virtual bool isDirectionFlipped_raw() const = 0; + virtual bool isDirectionFlipped_raw(bool value) = 0; + virtual bool setSingleAngle_raw(bool isSymmetric, core::ValueInput* angle) = 0; + virtual bool setTwoAngles_raw(core::ValueInput* angleOne, core::ValueInput* angleTwo) = 0; + virtual core::ValueInput* angleOne_raw() const = 0; + virtual core::ValueInput* angleTwo_raw() const = 0; + virtual bool isSymmetric_raw() const = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline std::vector> DraftFeatureInput::inputFaces() const +{ + std::vector> res; + size_t s; + + BRepFace** p= inputFaces_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool DraftFeatureInput::inputFaces(const std::vector>& value) +{ + BRepFace** value_ = new BRepFace*[value.size()]; + for(size_t i=0; i DraftFeatureInput::plane() const +{ + core::Ptr res = plane_raw(); + return res; +} + +inline bool DraftFeatureInput::plane(const core::Ptr& value) +{ + return plane_raw(value.get()); +} + +inline bool DraftFeatureInput::isTangentChain() const +{ + bool res = isTangentChain_raw(); + return res; +} + +inline bool DraftFeatureInput::isTangentChain(bool value) +{ + return isTangentChain_raw(value); +} + +inline bool DraftFeatureInput::isDirectionFlipped() const +{ + bool res = isDirectionFlipped_raw(); + return res; +} + +inline bool DraftFeatureInput::isDirectionFlipped(bool value) +{ + return isDirectionFlipped_raw(value); +} + +inline bool DraftFeatureInput::setSingleAngle(bool isSymmetric, const core::Ptr& angle) +{ + bool res = setSingleAngle_raw(isSymmetric, angle.get()); + return res; +} + +inline bool DraftFeatureInput::setTwoAngles(const core::Ptr& angleOne, const core::Ptr& angleTwo) +{ + bool res = setTwoAngles_raw(angleOne.get(), angleTwo.get()); + return res; +} + +inline core::Ptr DraftFeatureInput::angleOne() const +{ + core::Ptr res = angleOne_raw(); + return res; +} + +inline core::Ptr DraftFeatureInput::angleTwo() const +{ + core::Ptr res = angleTwo_raw(); + return res; +} + +inline bool DraftFeatureInput::isSymmetric() const +{ + bool res = isSymmetric_raw(); + return res; +} + +inline core::Ptr DraftFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool DraftFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_DRAFTFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/DraftFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/DraftFeatures.h new file mode 100644 index 0000000..7496954 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/DraftFeatures.h @@ -0,0 +1,141 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_DRAFTFEATURES_CPP__ +# define ADSK_FUSION_DRAFTFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_DRAFTFEATURES_API +# endif +#else +# define ADSK_FUSION_DRAFTFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepFace; + class DraftFeature; + class DraftFeatureInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing draft features in a component +/// and supports the ability to create new draft features. +class DraftFeatures : public core::Base { +public: + + /// Function that returns the specified draft feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of draft features in the collection. + size_t count() const; + + /// Creates a DraftFeatureInput object. Use properties and methods on this object + /// to define the draft you want to create and then use the Add method, passing in + /// the DraftFeatureInput object. + /// inputFaces : BRepFace array that contains the faces to which draft will be applied. + /// The picked point on face is always the point returned from pointOnFace property of the first BRepFace in this collection. + /// plane : Input object that defines the direction in which the draft is applied. This can be a planar BrepFace, or a ConstructionPlane. + /// isTangentChain : A boolean value for setting whether or not faces that are tangentially connected to + /// any of the input faces (if any) will also be included. It defaults to true. + /// Returns the newly created DraftFeatureInput object or null if the creation failed. + core::Ptr createInput(const std::vector>& inputFaces, const core::Ptr& plane, bool isTangentChain = true) const; + + /// Creates a new draft feature. + /// input : A DraftFeatureInput object that defines the desired draft. Use the createInput + /// method to create a new DraftFeatureInput object and then use methods on it + /// (the DraftFeatureInput object) to define the draft. + /// Returns the newly created DraftFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified draft feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef DraftFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_DRAFTFEATURES_API static const char* classType(); + ADSK_FUSION_DRAFTFEATURES_API const char* objectType() const override; + ADSK_FUSION_DRAFTFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_DRAFTFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual DraftFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual DraftFeatureInput* createInput_raw(BRepFace** inputFaces, size_t inputFaces_size, core::Base* plane, bool isTangentChain) const = 0; + virtual DraftFeature* add_raw(DraftFeatureInput* input) = 0; + virtual DraftFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr DraftFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t DraftFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr DraftFeatures::createInput(const std::vector>& inputFaces, const core::Ptr& plane, bool isTangentChain) const +{ + BRepFace** inputFaces_ = new BRepFace*[inputFaces.size()]; + for(size_t i=0; i res = createInput_raw(inputFaces_, inputFaces.size(), plane.get(), isTangentChain); + delete[] inputFaces_; + return res; +} + +inline core::Ptr DraftFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr DraftFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void DraftFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_DRAFTFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/EqualDistanceChamferEdgeSet.h b/usr/autodesk/CPP/include/Fusion/Features/EqualDistanceChamferEdgeSet.h new file mode 100644 index 0000000..72e5df4 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/EqualDistanceChamferEdgeSet.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ChamferEdgeSet.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_EQUALDISTANCECHAMFEREDGESET_CPP__ +# define ADSK_FUSION_EQUALDISTANCECHAMFEREDGESET_API XI_EXPORT +# else +# define ADSK_FUSION_EQUALDISTANCECHAMFEREDGESET_API +# endif +#else +# define ADSK_FUSION_EQUALDISTANCECHAMFEREDGESET_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the edges and the parameter associated with a equal distance offset chamfer. +class EqualDistanceChamferEdgeSet : public ChamferEdgeSet { +public: + + /// Gets and sets the edges that will be chamfered. This collection can contain BRepEdge, BRepFace, + /// and Feature objects. If BRepFace or Feature are objects are provided, all of the edges associated + /// with those objects will be chamfered. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr edges() const; + bool edges(const core::Ptr& value); + + /// Returns the model parameter that controls the offset distance of the chamfer. You can edit + /// the distance by using the properties on the returned ModelParameter object. + core::Ptr distance() const; + + ADSK_FUSION_EQUALDISTANCECHAMFEREDGESET_API static const char* classType(); + ADSK_FUSION_EQUALDISTANCECHAMFEREDGESET_API const char* objectType() const override; + ADSK_FUSION_EQUALDISTANCECHAMFEREDGESET_API void* queryInterface(const char* id) const override; + ADSK_FUSION_EQUALDISTANCECHAMFEREDGESET_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* edges_raw() const = 0; + virtual bool edges_raw(core::ObjectCollection* value) = 0; + virtual ModelParameter* distance_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr EqualDistanceChamferEdgeSet::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline bool EqualDistanceChamferEdgeSet::edges(const core::Ptr& value) +{ + return edges_raw(value.get()); +} + +inline core::Ptr EqualDistanceChamferEdgeSet::distance() const +{ + core::Ptr res = distance_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_EQUALDISTANCECHAMFEREDGESET_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/EqualDistanceChamferTypeDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/EqualDistanceChamferTypeDefinition.h new file mode 100644 index 0000000..12b13c6 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/EqualDistanceChamferTypeDefinition.h @@ -0,0 +1,63 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ChamferTypeDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_EQUALDISTANCECHAMFERTYPEDEFINITION_CPP__ +# define ADSK_FUSION_EQUALDISTANCECHAMFERTYPEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_EQUALDISTANCECHAMFERTYPEDEFINITION_API +# endif +#else +# define ADSK_FUSION_EQUALDISTANCECHAMFERTYPEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; +}} + +namespace adsk { namespace fusion { + +/// Provides information to create a chamfer that is defined by a single distance and has an equal offset from the edge. +class EqualDistanceChamferTypeDefinition : public ChamferTypeDefinition { +public: + + /// Returns the parameter controlling the distance. You can edit the distance + /// by editing the value of the parameter object. + core::Ptr distance() const; + + ADSK_FUSION_EQUALDISTANCECHAMFERTYPEDEFINITION_API static const char* classType(); + ADSK_FUSION_EQUALDISTANCECHAMFERTYPEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_EQUALDISTANCECHAMFERTYPEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_EQUALDISTANCECHAMFERTYPEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ModelParameter* distance_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr EqualDistanceChamferTypeDefinition::distance() const +{ + core::Ptr res = distance_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_EQUALDISTANCECHAMFERTYPEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ExtendFeature.h b/usr/autodesk/CPP/include/Fusion/Features/ExtendFeature.h new file mode 100644 index 0000000..aeafc6f --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ExtendFeature.h @@ -0,0 +1,177 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_EXTENDFEATURE_CPP__ +# define ADSK_FUSION_EXTENDFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_EXTENDFEATURE_API +# endif +#else +# define ADSK_FUSION_EXTENDFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; + class Occurrence; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing extend feature in a design. +class ExtendFeature : public Feature { +public: + + /// Sets the edges for the extend feature. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// edges : The surface edges to extend. + /// Only the surface edges from an open body can be extended. + /// The edges must all be from the same open body. + /// isChainingEnabled : An optional boolean argument whose default is true. If this argument is set to true, all edges that are + /// tangent or curvature continuous, and end point connected, will be found automatically and extended. + /// Returns true if successful + bool setInputEntities(const core::Ptr& edges, bool isChainingEnabled = true); + + /// Gets the edges that were extended. In many cases the extend operation results in + /// the edges being consumed so they're no longer available after the feature is created. + /// in this case you need to reposition the timeline marker to just before this feature + /// when the edges do exist. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr edges() const; + + /// Returns the parameter controlling the extend distance. You can edit the distance + /// by editing the value of the parameter object. + core::Ptr distance() const; + + /// Gets and sets surface extend type to use. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + SurfaceExtendTypes extendType() const; + bool extendType(SurfaceExtendTypes value); + + /// Gets if all edges that are tangent or curvature continuous, and end point connected, will be found + /// automatically and extended. + bool isChainingEnabled() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Gets and sets surface extend alignment to use. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + SurfaceExtendAlignment extendAlignment() const; + bool extendAlignment(SurfaceExtendAlignment value); + + ADSK_FUSION_EXTENDFEATURE_API static const char* classType(); + ADSK_FUSION_EXTENDFEATURE_API const char* objectType() const override; + ADSK_FUSION_EXTENDFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_EXTENDFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool setInputEntities_raw(core::ObjectCollection* edges, bool isChainingEnabled) = 0; + virtual core::ObjectCollection* edges_raw() const = 0; + virtual ModelParameter* distance_raw() const = 0; + virtual SurfaceExtendTypes extendType_raw() const = 0; + virtual bool extendType_raw(SurfaceExtendTypes value) = 0; + virtual bool isChainingEnabled_raw() const = 0; + virtual ExtendFeature* nativeObject_raw() const = 0; + virtual ExtendFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual SurfaceExtendAlignment extendAlignment_raw() const = 0; + virtual bool extendAlignment_raw(SurfaceExtendAlignment value) = 0; +}; + +// Inline wrappers + +inline bool ExtendFeature::setInputEntities(const core::Ptr& edges, bool isChainingEnabled) +{ + bool res = setInputEntities_raw(edges.get(), isChainingEnabled); + return res; +} + +inline core::Ptr ExtendFeature::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline core::Ptr ExtendFeature::distance() const +{ + core::Ptr res = distance_raw(); + return res; +} + +inline SurfaceExtendTypes ExtendFeature::extendType() const +{ + SurfaceExtendTypes res = extendType_raw(); + return res; +} + +inline bool ExtendFeature::extendType(SurfaceExtendTypes value) +{ + return extendType_raw(value); +} + +inline bool ExtendFeature::isChainingEnabled() const +{ + bool res = isChainingEnabled_raw(); + return res; +} + +inline core::Ptr ExtendFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr ExtendFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline SurfaceExtendAlignment ExtendFeature::extendAlignment() const +{ + SurfaceExtendAlignment res = extendAlignment_raw(); + return res; +} + +inline bool ExtendFeature::extendAlignment(SurfaceExtendAlignment value) +{ + return extendAlignment_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_EXTENDFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ExtendFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/ExtendFeatureInput.h new file mode 100644 index 0000000..501f08f --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ExtendFeatureInput.h @@ -0,0 +1,166 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_EXTENDFEATUREINPUT_CPP__ +# define ADSK_FUSION_EXTENDFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_EXTENDFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_EXTENDFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a extend feature. +class ExtendFeatureInput : public core::Base { +public: + + /// Gets and sets the edges to extend + core::Ptr edges() const; + bool edges(const core::Ptr& value); + + /// Gets and sets the ValueInput object that defines the extend distance + core::Ptr distance() const; + bool distance(const core::Ptr& value); + + /// Gets and sets surface extend type to use + SurfaceExtendTypes extendType() const; + bool extendType(SurfaceExtendTypes value); + + /// Gets and sets if all edges that are tangent or curvature continuous, and end point connected, will be found + /// automatically and extended. + bool isChainingEnabled() const; + bool isChainingEnabled(bool value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + /// Gets and sets surface extend alignment to use. + SurfaceExtendAlignment extendAlignment() const; + bool extendAlignment(SurfaceExtendAlignment value); + + ADSK_FUSION_EXTENDFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_EXTENDFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_EXTENDFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_EXTENDFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* edges_raw() const = 0; + virtual bool edges_raw(core::ObjectCollection* value) = 0; + virtual core::ValueInput* distance_raw() const = 0; + virtual bool distance_raw(core::ValueInput* value) = 0; + virtual SurfaceExtendTypes extendType_raw() const = 0; + virtual bool extendType_raw(SurfaceExtendTypes value) = 0; + virtual bool isChainingEnabled_raw() const = 0; + virtual bool isChainingEnabled_raw(bool value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; + virtual SurfaceExtendAlignment extendAlignment_raw() const = 0; + virtual bool extendAlignment_raw(SurfaceExtendAlignment value) = 0; +}; + +// Inline wrappers + +inline core::Ptr ExtendFeatureInput::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline bool ExtendFeatureInput::edges(const core::Ptr& value) +{ + return edges_raw(value.get()); +} + +inline core::Ptr ExtendFeatureInput::distance() const +{ + core::Ptr res = distance_raw(); + return res; +} + +inline bool ExtendFeatureInput::distance(const core::Ptr& value) +{ + return distance_raw(value.get()); +} + +inline SurfaceExtendTypes ExtendFeatureInput::extendType() const +{ + SurfaceExtendTypes res = extendType_raw(); + return res; +} + +inline bool ExtendFeatureInput::extendType(SurfaceExtendTypes value) +{ + return extendType_raw(value); +} + +inline bool ExtendFeatureInput::isChainingEnabled() const +{ + bool res = isChainingEnabled_raw(); + return res; +} + +inline bool ExtendFeatureInput::isChainingEnabled(bool value) +{ + return isChainingEnabled_raw(value); +} + +inline core::Ptr ExtendFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool ExtendFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} + +inline SurfaceExtendAlignment ExtendFeatureInput::extendAlignment() const +{ + SurfaceExtendAlignment res = extendAlignment_raw(); + return res; +} + +inline bool ExtendFeatureInput::extendAlignment(SurfaceExtendAlignment value) +{ + return extendAlignment_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_EXTENDFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ExtendFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/ExtendFeatures.h new file mode 100644 index 0000000..ed45147 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ExtendFeatures.h @@ -0,0 +1,149 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_EXTENDFEATURES_CPP__ +# define ADSK_FUSION_EXTENDFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_EXTENDFEATURES_API +# endif +#else +# define ADSK_FUSION_EXTENDFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ExtendFeature; + class ExtendFeatureInput; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing Extend features in a component +/// and supports the ability to create new Extend features. +class ExtendFeatures : public core::Base { +public: + + /// Function that returns the specified extend feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of Extend features in the collection. + size_t count() const; + + /// Creates a ExtendFeatureInput object. Use properties and methods on this object + /// to define the extend feature you want to create and then use the Add method, passing in + /// the ExtendFeatureInput object. + /// edges : The surface edges to extend. + /// Only the outer edges from an open body can be extended. The edges must all be from the same body. + /// Depending on the extend type there can also be some limitations on the edges being input as described below + /// for the extendType argument. + /// distance : ValueInput object that defines the distance to extend the face/s. + /// Natural and Tangent Extend types require a positive distance value. + /// Perpendicular Extend Type supports either a positive or negative value to + /// control the direction of the extend. A positive number results in the + /// perpendicular extension being in the same direction as the positive normal + /// of the connected faces. + /// extendType : The extension type to use when extending the face(s). + /// Input edges must be connected at endpoints when Tangent or Perpendicular Extend Types are used. + /// Input edges need not be connected when Natural Extend type is used. + /// isChainingEnabled : An optional boolean argument whose default is true. If this argument is true, all edges that are + /// tangent or curvature continuous, and end point connected, will be found automatically and include + /// in the set of edges to extend. + /// Returns the newly created ExtendFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& edges, const core::Ptr& distance, SurfaceExtendTypes extendType, bool isChainingEnabled = true) const; + + /// Creates a new extend feature. + /// input : An ExtendFeatureInput object that defines the desired extend feature. Use the createInput + /// method to create a new ExtendFeatureInput object and then use methods on it + /// (the ExtendFeatureInput object) to define the desired options for the extent feature. + /// Returns the newly created ExtendFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified extend feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef ExtendFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_EXTENDFEATURES_API static const char* classType(); + ADSK_FUSION_EXTENDFEATURES_API const char* objectType() const override; + ADSK_FUSION_EXTENDFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_EXTENDFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ExtendFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual ExtendFeatureInput* createInput_raw(core::ObjectCollection* edges, core::ValueInput* distance, SurfaceExtendTypes extendType, bool isChainingEnabled) const = 0; + virtual ExtendFeature* add_raw(ExtendFeatureInput* input) = 0; + virtual ExtendFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr ExtendFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t ExtendFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr ExtendFeatures::createInput(const core::Ptr& edges, const core::Ptr& distance, SurfaceExtendTypes extendType, bool isChainingEnabled) const +{ + core::Ptr res = createInput_raw(edges.get(), distance.get(), extendType, isChainingEnabled); + return res; +} + +inline core::Ptr ExtendFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr ExtendFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void ExtendFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_EXTENDFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ExtentDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/ExtentDefinition.h new file mode 100644 index 0000000..d55f5e4 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ExtentDefinition.h @@ -0,0 +1,95 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_EXTENTDEFINITION_CPP__ +# define ADSK_FUSION_EXTENTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_EXTENTDEFINITION_API +# endif +#else +# define ADSK_FUSION_EXTENTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Feature; +}} + +namespace adsk { namespace fusion { + +/// The base class for the various definition objects used to define the extent of a feature. +class ExtentDefinition : public core::Base { +public: + + /// Returns the parent feature that this definition is associated with. If this definition has been created + /// statically and is not associated with a feature this property will return null. + core::Ptr parentFeature() const; + + ADSK_FUSION_EXTENTDEFINITION_API static const char* classType(); + ADSK_FUSION_EXTENTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_EXTENTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_EXTENTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Feature* parentFeature_raw() const = 0; + virtual void placeholderExtentDefinition0() {} + virtual void placeholderExtentDefinition1() {} + virtual void placeholderExtentDefinition2() {} + virtual void placeholderExtentDefinition3() {} + virtual void placeholderExtentDefinition4() {} + virtual void placeholderExtentDefinition5() {} + virtual void placeholderExtentDefinition6() {} + virtual void placeholderExtentDefinition7() {} + virtual void placeholderExtentDefinition8() {} + virtual void placeholderExtentDefinition9() {} + virtual void placeholderExtentDefinition10() {} + virtual void placeholderExtentDefinition11() {} + virtual void placeholderExtentDefinition12() {} + virtual void placeholderExtentDefinition13() {} + virtual void placeholderExtentDefinition14() {} + virtual void placeholderExtentDefinition15() {} + virtual void placeholderExtentDefinition16() {} + virtual void placeholderExtentDefinition17() {} + virtual void placeholderExtentDefinition18() {} + virtual void placeholderExtentDefinition19() {} + virtual void placeholderExtentDefinition20() {} + virtual void placeholderExtentDefinition21() {} + virtual void placeholderExtentDefinition22() {} + virtual void placeholderExtentDefinition23() {} + virtual void placeholderExtentDefinition24() {} + virtual void placeholderExtentDefinition25() {} + virtual void placeholderExtentDefinition26() {} + virtual void placeholderExtentDefinition27() {} + virtual void placeholderExtentDefinition28() {} + virtual void placeholderExtentDefinition29() {} + virtual void placeholderExtentDefinition30() {} +}; + +// Inline wrappers + +inline core::Ptr ExtentDefinition::parentFeature() const +{ + core::Ptr res = parentFeature_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_EXTENTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ExtrudeFeature.h b/usr/autodesk/CPP/include/Fusion/Features/ExtrudeFeature.h new file mode 100644 index 0000000..6d9231b --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ExtrudeFeature.h @@ -0,0 +1,592 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_EXTRUDEFEATURE_CPP__ +# define ADSK_FUSION_EXTRUDEFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_EXTRUDEFEATURE_API +# endif +#else +# define ADSK_FUSION_EXTRUDEFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class BRepFaces; + class ExtentDefinition; + class ModelParameter; + class Occurrence; + class SymmetricExtentDefinition; +}} +namespace adsk { namespace core { + class ValueInput; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing extrude feature in a design. +class ExtrudeFeature : public Feature { +public: + + /// Gets and sets the profiles or planar faces used to define the shape of the extrude. + /// This property can return or be set with a single Profile, a single planar face, or + /// an ObjectCollection consisting of multiple profiles and planar faces. When an + /// ObjectCollection is used all of the profiles and faces must be co-planar. + /// When setting this property of a surface (non-solid) extrusion, you can use the + /// createOpenProfile and createBRepEdgeProfile methods of the Component object to create + /// an open profile. + /// This property returns null in the case where the feature is non-parametric. + core::Ptr profile() const; + bool profile(const core::Ptr& value); + + /// Returns the parameter controlling the taper angle of the extrusion. To + /// edit the taper angle use properties on the parameter to edit its value. + /// This property returns nothing in the case where the feature is non-parametric. + core::Ptr taperAngle() const; + + /// Gets and sets the type of operation performed by the extrusion. + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// Gets the ExtentDefinition object that defines the extent of the extrude. Modifying the + /// properties of the returned extent definition object will cause the extrude to recompute. + /// Various types of objects can be returned depending on the type of extent currently defined for + /// the extrusion. This property returns nothing in the case where the feature is non-parametric. + core::Ptr extentDefinition() const; + + /// Sets the extrusion extents option to 'Distance'. + /// isSymmetric : Set to 'true' for an extrusion symmetrical about the profile plane + /// distance : ValueInput object that defines the extrude distance. + /// If the isSymmetric argument is 'false', a positive or negative distance can be used to control the direction. + /// Returns true if successful + bool setDistanceExtent(bool isSymmetric, const core::Ptr& distance); + + /// Sets the extrusion extents option to 'Two Side'. + /// This method will fail in the case of a non-parametric extrusion. + /// distanceOne : ValueInput object that defines the extrude distance for the first side. + /// distanceTwo : ValueInput object that defines the extrude distance for the second side. + /// Returns true if successful + bool setTwoSidesDistanceExtent(const core::Ptr& distanceOne, const core::Ptr& distanceTwo); + + /// Sets the extrusion extents option to 'All' (i.e. the extrusion is through-all, in both directions.) + /// This method will fail in the case of a non-parametric extrusion. + /// direction : The direction can be either positive, negative, or symmetric. + /// Returns true if successful + bool setAllExtent(ExtentDirections direction); + + /// Sets the extrusion Direction option to 'One Side' and the Extents option to 'To' (a specified face) + /// toEntity : The entity that defines the "to" extent. The valid types of entities can vary depending on + /// the type of feature this is being used with. For an extrude it can be a BRepBody, BRepFace, + /// BRepVertex, ConstructionPlane, or ConstructionPoint. + /// matchShape : If the matchShape argument is 'true', the toEntity is extended to fully intersect the extrusion. + /// directionHint : Specifies the direction of the extrusion. This is only used in the case where there are two possible solutions and the extrusion can + /// hit the toEntity in either direction. An example is if the profile of the extrusion is within a hole. + /// The extrusion will intersect the cylinder of the hole in either direction. + /// Typically there is only a single solution and the direction is determined automatically. + /// Returns true if successful. + bool setOneSideToExtent(const core::Ptr& toEntity, bool matchShape, const core::Ptr& directionHint = NULL); + + /// Set the extrusion Direction option to 'Two Side' + /// This method will fail in the case of a non-parametric extrusion. + /// toEntityOne : The first entity that defines the "to" extent. The valid types of entities can vary depending on + /// the type of feature this is being used with. For an extrude it can be a BRepBody, BRepFace, + /// BRepVertex, ConstructionPlane, or ConstructionPoint. + /// toEntityTwo : The second entity that defines the "to" extent. The valid types of entities can vary depending on + /// the type of feature this is being used with. For an extrude it can be a BRepBody, BRepFace, + /// BRepVertex, ConstructionPlane, or ConstructionPoint. + /// matchShape : If the matchShape argument is 'true', the toEntity is extended to fully intersect the extrusion. + /// Returns true if successful. + bool setTwoSidesToExtent(const core::Ptr& toEntityOne, const core::Ptr& toEntityTwo, bool matchShape); + + /// Property that returns the set of faces that cap the end of the extrusion and are coincident + /// with the sketch plane. In the case of a symmetric extrusion, these faces are the ones on the + /// positive normal side of the sketch plane. In the case where there are no start faces, + /// this property will return null. + core::Ptr startFaces() const; + + /// Property that returns the set of faces that cap the end of the extrusion, opposite the + /// start faces. In the case where there are no end faces, this property will return null. + core::Ptr endFaces() const; + + /// Property that returns all of the side faces (i.e. those running perpendicular to the extrude direction) + /// of the feature. + core::Ptr sideFaces() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Indicates if this feature was initially created as a solid or a surface. + bool isSolid() const; + + /// Gets and sets the extent used to define the start of the extrusion. You can set this property + /// with either a ProfilePlaneStartDefinition, ProfilePlaneWithOffsetStartDefinition or a + /// EntityStartDefinition object. You can get any of those objects by using the static create method on the class. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr startExtent() const; + bool startExtent(const core::Ptr& value); + + /// Redefines the extrusion to go in one direction from the profile. The extent of the extrusion is + /// defined by the extent argument. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// extent : An ExtentDefinition object that defines how the extent of the extrusion is defined. This can be + /// a specified distance (DistanceExtentDefinition), to an entity (ToEntityExtent), or through-all (AllExtentDefinition). + /// These objects can be obtained by using the static create method on the appropriate class. + /// direction : Specifies the direction of the extrusion. PositiveExtentDirection and NegativeExtentDirection + /// are valid values. PositiveExtentDirection is in the same direction as the normal of the profile's + /// parent sketch plane. + /// taperAngle : Optional argument that specifies the taper angle. If omitted a taper angle of 0 is used. + /// Returns true is setting the input to a one sided extent was successful. + bool setOneSideExtent(const core::Ptr& extent, ExtentDirections direction, const core::Ptr& taperAngle = NULL); + + /// Redefines the extrusion to go in both directions from the profile. The extent is defined independently + /// for each direction using the input arguments. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// sideOneExtent : An ExtentDefinition object that defines how the extent of the extrusion towards side one is defined. This can be + /// a specified distance (DistanceExtentDefinition), to an entity (ToEntityExtent), or through-all (AllExtentDefinition). + /// These objects can be obtained by using the static create method on the appropriate class. + /// sideTwoExtent : An ExtentDefinition object that defines how the extent of the extrusion towards side two is defined. This can be + /// a specified distance (DistanceExtentDefinition), to an entity (ToEntityExtent), or through-all (AllExtentDefinition). + /// These objects can be obtained by using the static create method on the appropriate class. + /// sideOneTaperAngle : Optional argument that specifies the taper angle for side one. If omitted a taper angle of 0 is used. + /// sideTwoTaperAngle : Optional argument that specifies the taper angle for side two. If omitted a taper angle of 0 is used. + /// Returns true, if the call was successful. + bool setTwoSidesExtent(const core::Ptr& sideOneExtent, const core::Ptr& sideTwoExtent, const core::Ptr& sideOneTaperAngle = NULL, const core::Ptr& sideTwoTaperAngle = NULL); + + /// Redefines the extrusion to go symmetrically in both directions from the profile. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// distance : The distance of the extrusions. This is either the full length of half of the length of the final extrusion + /// depending on the value of the isFullLength property. + /// isFullLength : Defines if the value defines the full length of the extrusion or half of the length. A value of true indicates + /// it defines the full length. + /// taperAngle : Optional argument that specifies the taper angle. The same taper angle is used for both sides for a symmetric + /// extrusion. If omitted a taper angle of 0 is used. + /// Returns true, if the call was successful. + bool setSymmetricExtent(const core::Ptr& distance, bool isFullLength, const core::Ptr& taperAngle = NULL); + + /// Gets and sets the extent used for a single sided extrude or side one of a two-sided extrusion. Valid + /// inputs are DistanceExtentDefinition, ToEntityExtentDefinition, and ThroughAllExtentDefinition object, + /// which can be created statically using the create method on the classes. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr extentOne() const; + bool extentOne(const core::Ptr& value); + + /// Gets and sets the extent used for side two of the extrusion. If the extrude is a single sided extrude this + /// property will return null and will fail if set. The hasTwoExtents property can be used to determine if + /// there are two sides or not. When setting this property, valid inputs are DistanceExtentDefinition, + /// ToEntityExtentDefinition, and ThroughAllExtentDefinition object, which can be created + /// statically using the create method on the classes. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr extentTwo() const; + bool extentTwo(const core::Ptr& value); + + /// Gets the parameter controlling the taper angle for a single sided extrusion or side one of a two-sided + /// extrusion. To edit the angle, use properties on the parameter to change the value of the parameter. + core::Ptr taperAngleOne() const; + + /// Gets the parameter controlling the taper angle for side two of a two-sided extrusion. if the extrusion is + /// single-sided, this property will return null. The hasTwoExtents property can be used to determine if there + /// are two sides or not. To edit the angle, use properties on the parameter to change the value of the parameter. + core::Ptr taperAngleTwo() const; + + /// Property that indicates if the extrusion is a single or two-sided extrusion. If false, the extentTwo + /// and taperAngleTwo properties should not be used. + bool hasTwoExtents() const; + + /// Gets and sets the list of bodies that will participate in the feature when the operation is a cut or intersection. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + std::vector> participantBodies() const; + bool participantBodies(const std::vector>& value); + + /// Returns a value indicating how the extent is defined for this extrude. + FeatureExtentTypes extentType() const; + + /// If the current extent of the feature is defined as a symmetric extent, this property + /// returns the SymmericExtentDefinition object that provides access to the information + /// defining the symmetric extent. If the current extent is not symmetric, this property + /// returns null. You can determine the type of extent by using the extentType property. + /// To change the extent of a feature to symmetric extent you can use the setSymmetricExtent + /// method. + core::Ptr symmetricExtent() const; + + /// Sets or returns whether the extrude is a thin extrude. + /// Setting it as false will make it a regular extrude. + bool isThinExtrude() const; + bool isThinExtrude(bool value); + + /// Changes the extrude feature to be a thin extrude. This is only valid if the isThinExtrude property + /// is False. If the extrusion is already a thin extrude, you can use the properties on the ExtrudeFeature + /// to modify the thin extrude specific values. + /// thinExtrudeWallLocationOne : Specifies the position of the thin wall extrude with respect to the profile being extruded. This defines + /// the direction for a single sided thin extrude or side one of a two-sided extrusion. + /// thinExtrudeWallThicknessOne : A ValueInput object that defines the thickness for a single sided thin extrude or side one of a two-sided + /// extrusion . + /// thinExtrudeWallLocationTwo : Optional argument that specifies the position of side two of a two-sided extrusion. This argument is ignored + /// for a single sided thin extrude. + /// thinExtrudeWallThicknessTwo : Optional argument that is a ValueInput object that defines the thickness for side two of a + /// two-sided extrusion. This argument is ignored for a single sided thin extrude. + /// Returns true if successful. + bool setThinExtrude(ThinExtrudeWallLocation thinExtrudeWallLocationOne, const core::Ptr& thinExtrudeWallThicknessOne, ThinExtrudeWallLocation thinExtrudeWallLocationTwo = adsk::fusion::Side1, const core::Ptr& thinExtrudeWallThicknessTwo = NULL); + + /// Gets and sets the wall location for a one sided thin extrude or side one of a two sided thin extrude + ThinExtrudeWallLocation thinExtrudeWallLocationOne() const; + bool thinExtrudeWallLocationOne(ThinExtrudeWallLocation value); + + /// Gets and sets the wall location for side two of a two sided thin extrude + ThinExtrudeWallLocation thinExtrudeWallLocationTwo() const; + bool thinExtrudeWallLocationTwo(ThinExtrudeWallLocation value); + + /// Gets and sets the wall thickness for a one sided thin extrude or side one of a two sided thin extrude + core::Ptr thinExtrudeWallThicknessOne() const; + + /// Gets and sets the wall thickness for side two of a two sided thin extrude + core::Ptr thinExtrudeWallThicknessTwo() const; + + ADSK_FUSION_EXTRUDEFEATURE_API static const char* classType(); + ADSK_FUSION_EXTRUDEFEATURE_API const char* objectType() const override; + ADSK_FUSION_EXTRUDEFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_EXTRUDEFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* profile_raw() const = 0; + virtual bool profile_raw(core::Base* value) = 0; + virtual ModelParameter* taperAngle_raw() const = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual ExtentDefinition* extentDefinition_raw() const = 0; + virtual bool setDistanceExtent_raw(bool isSymmetric, core::ValueInput* distance) = 0; + virtual bool setTwoSidesDistanceExtent_raw(core::ValueInput* distanceOne, core::ValueInput* distanceTwo) = 0; + virtual bool setAllExtent_raw(ExtentDirections direction) = 0; + virtual bool setOneSideToExtent_raw(core::Base* toEntity, bool matchShape, core::Vector3D* directionHint) = 0; + virtual bool setTwoSidesToExtent_raw(core::Base* toEntityOne, core::Base* toEntityTwo, bool matchShape) = 0; + virtual BRepFaces* startFaces_raw() const = 0; + virtual BRepFaces* endFaces_raw() const = 0; + virtual BRepFaces* sideFaces_raw() const = 0; + virtual ExtrudeFeature* nativeObject_raw() const = 0; + virtual ExtrudeFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual bool isSolid_raw() const = 0; + virtual ExtentDefinition* startExtent_raw() const = 0; + virtual bool startExtent_raw(ExtentDefinition* value) = 0; + virtual bool setOneSideExtent_raw(ExtentDefinition* extent, ExtentDirections direction, core::ValueInput* taperAngle) = 0; + virtual bool setTwoSidesExtent_raw(ExtentDefinition* sideOneExtent, ExtentDefinition* sideTwoExtent, core::ValueInput* sideOneTaperAngle, core::ValueInput* sideTwoTaperAngle) = 0; + virtual bool setSymmetricExtent_raw(core::ValueInput* distance, bool isFullLength, core::ValueInput* taperAngle) = 0; + virtual ExtentDefinition* extentOne_raw() const = 0; + virtual bool extentOne_raw(ExtentDefinition* value) = 0; + virtual ExtentDefinition* extentTwo_raw() const = 0; + virtual bool extentTwo_raw(ExtentDefinition* value) = 0; + virtual ModelParameter* taperAngleOne_raw() const = 0; + virtual ModelParameter* taperAngleTwo_raw() const = 0; + virtual bool hasTwoExtents_raw() const = 0; + virtual BRepBody** participantBodies_raw(size_t& return_size) const = 0; + virtual bool participantBodies_raw(BRepBody** value, size_t value_size) = 0; + virtual FeatureExtentTypes extentType_raw() const = 0; + virtual SymmetricExtentDefinition* symmetricExtent_raw() const = 0; + virtual bool isThinExtrude_raw() const = 0; + virtual bool isThinExtrude_raw(bool value) = 0; + virtual bool setThinExtrude_raw(ThinExtrudeWallLocation thinExtrudeWallLocationOne, core::ValueInput* thinExtrudeWallThicknessOne, ThinExtrudeWallLocation thinExtrudeWallLocationTwo, core::ValueInput* thinExtrudeWallThicknessTwo) = 0; + virtual ThinExtrudeWallLocation thinExtrudeWallLocationOne_raw() const = 0; + virtual bool thinExtrudeWallLocationOne_raw(ThinExtrudeWallLocation value) = 0; + virtual ThinExtrudeWallLocation thinExtrudeWallLocationTwo_raw() const = 0; + virtual bool thinExtrudeWallLocationTwo_raw(ThinExtrudeWallLocation value) = 0; + virtual ModelParameter* thinExtrudeWallThicknessOne_raw() const = 0; + virtual ModelParameter* thinExtrudeWallThicknessTwo_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ExtrudeFeature::profile() const +{ + core::Ptr res = profile_raw(); + return res; +} + +inline bool ExtrudeFeature::profile(const core::Ptr& value) +{ + return profile_raw(value.get()); +} + +inline core::Ptr ExtrudeFeature::taperAngle() const +{ + core::Ptr res = taperAngle_raw(); + return res; +} + +inline FeatureOperations ExtrudeFeature::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool ExtrudeFeature::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline core::Ptr ExtrudeFeature::extentDefinition() const +{ + core::Ptr res = extentDefinition_raw(); + return res; +} + +inline bool ExtrudeFeature::setDistanceExtent(bool isSymmetric, const core::Ptr& distance) +{ + bool res = setDistanceExtent_raw(isSymmetric, distance.get()); + return res; +} + +inline bool ExtrudeFeature::setTwoSidesDistanceExtent(const core::Ptr& distanceOne, const core::Ptr& distanceTwo) +{ + bool res = setTwoSidesDistanceExtent_raw(distanceOne.get(), distanceTwo.get()); + return res; +} + +inline bool ExtrudeFeature::setAllExtent(ExtentDirections direction) +{ + bool res = setAllExtent_raw(direction); + return res; +} + +inline bool ExtrudeFeature::setOneSideToExtent(const core::Ptr& toEntity, bool matchShape, const core::Ptr& directionHint) +{ + bool res = setOneSideToExtent_raw(toEntity.get(), matchShape, directionHint.get()); + return res; +} + +inline bool ExtrudeFeature::setTwoSidesToExtent(const core::Ptr& toEntityOne, const core::Ptr& toEntityTwo, bool matchShape) +{ + bool res = setTwoSidesToExtent_raw(toEntityOne.get(), toEntityTwo.get(), matchShape); + return res; +} + +inline core::Ptr ExtrudeFeature::startFaces() const +{ + core::Ptr res = startFaces_raw(); + return res; +} + +inline core::Ptr ExtrudeFeature::endFaces() const +{ + core::Ptr res = endFaces_raw(); + return res; +} + +inline core::Ptr ExtrudeFeature::sideFaces() const +{ + core::Ptr res = sideFaces_raw(); + return res; +} + +inline core::Ptr ExtrudeFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr ExtrudeFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline bool ExtrudeFeature::isSolid() const +{ + bool res = isSolid_raw(); + return res; +} + +inline core::Ptr ExtrudeFeature::startExtent() const +{ + core::Ptr res = startExtent_raw(); + return res; +} + +inline bool ExtrudeFeature::startExtent(const core::Ptr& value) +{ + return startExtent_raw(value.get()); +} + +inline bool ExtrudeFeature::setOneSideExtent(const core::Ptr& extent, ExtentDirections direction, const core::Ptr& taperAngle) +{ + bool res = setOneSideExtent_raw(extent.get(), direction, taperAngle.get()); + return res; +} + +inline bool ExtrudeFeature::setTwoSidesExtent(const core::Ptr& sideOneExtent, const core::Ptr& sideTwoExtent, const core::Ptr& sideOneTaperAngle, const core::Ptr& sideTwoTaperAngle) +{ + bool res = setTwoSidesExtent_raw(sideOneExtent.get(), sideTwoExtent.get(), sideOneTaperAngle.get(), sideTwoTaperAngle.get()); + return res; +} + +inline bool ExtrudeFeature::setSymmetricExtent(const core::Ptr& distance, bool isFullLength, const core::Ptr& taperAngle) +{ + bool res = setSymmetricExtent_raw(distance.get(), isFullLength, taperAngle.get()); + return res; +} + +inline core::Ptr ExtrudeFeature::extentOne() const +{ + core::Ptr res = extentOne_raw(); + return res; +} + +inline bool ExtrudeFeature::extentOne(const core::Ptr& value) +{ + return extentOne_raw(value.get()); +} + +inline core::Ptr ExtrudeFeature::extentTwo() const +{ + core::Ptr res = extentTwo_raw(); + return res; +} + +inline bool ExtrudeFeature::extentTwo(const core::Ptr& value) +{ + return extentTwo_raw(value.get()); +} + +inline core::Ptr ExtrudeFeature::taperAngleOne() const +{ + core::Ptr res = taperAngleOne_raw(); + return res; +} + +inline core::Ptr ExtrudeFeature::taperAngleTwo() const +{ + core::Ptr res = taperAngleTwo_raw(); + return res; +} + +inline bool ExtrudeFeature::hasTwoExtents() const +{ + bool res = hasTwoExtents_raw(); + return res; +} + +inline std::vector> ExtrudeFeature::participantBodies() const +{ + std::vector> res; + size_t s; + + BRepBody** p= participantBodies_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool ExtrudeFeature::participantBodies(const std::vector>& value) +{ + BRepBody** value_ = new BRepBody*[value.size()]; + for(size_t i=0; i ExtrudeFeature::symmetricExtent() const +{ + core::Ptr res = symmetricExtent_raw(); + return res; +} + +inline bool ExtrudeFeature::isThinExtrude() const +{ + bool res = isThinExtrude_raw(); + return res; +} + +inline bool ExtrudeFeature::isThinExtrude(bool value) +{ + return isThinExtrude_raw(value); +} + +inline bool ExtrudeFeature::setThinExtrude(ThinExtrudeWallLocation thinExtrudeWallLocationOne, const core::Ptr& thinExtrudeWallThicknessOne, ThinExtrudeWallLocation thinExtrudeWallLocationTwo, const core::Ptr& thinExtrudeWallThicknessTwo) +{ + bool res = setThinExtrude_raw(thinExtrudeWallLocationOne, thinExtrudeWallThicknessOne.get(), thinExtrudeWallLocationTwo, thinExtrudeWallThicknessTwo.get()); + return res; +} + +inline ThinExtrudeWallLocation ExtrudeFeature::thinExtrudeWallLocationOne() const +{ + ThinExtrudeWallLocation res = thinExtrudeWallLocationOne_raw(); + return res; +} + +inline bool ExtrudeFeature::thinExtrudeWallLocationOne(ThinExtrudeWallLocation value) +{ + return thinExtrudeWallLocationOne_raw(value); +} + +inline ThinExtrudeWallLocation ExtrudeFeature::thinExtrudeWallLocationTwo() const +{ + ThinExtrudeWallLocation res = thinExtrudeWallLocationTwo_raw(); + return res; +} + +inline bool ExtrudeFeature::thinExtrudeWallLocationTwo(ThinExtrudeWallLocation value) +{ + return thinExtrudeWallLocationTwo_raw(value); +} + +inline core::Ptr ExtrudeFeature::thinExtrudeWallThicknessOne() const +{ + core::Ptr res = thinExtrudeWallThicknessOne_raw(); + return res; +} + +inline core::Ptr ExtrudeFeature::thinExtrudeWallThicknessTwo() const +{ + core::Ptr res = thinExtrudeWallThicknessTwo_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_EXTRUDEFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ExtrudeFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/ExtrudeFeatureInput.h new file mode 100644 index 0000000..6b363c2 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ExtrudeFeatureInput.h @@ -0,0 +1,542 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_EXTRUDEFEATUREINPUT_CPP__ +# define ADSK_FUSION_EXTRUDEFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_EXTRUDEFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_EXTRUDEFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class BRepBody; + class ExtentDefinition; + class Occurrence; +}} +namespace adsk { namespace core { + class ValueInput; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of an extrude +/// feature. This class also provides properties for setting/getting the Profile and Operation +/// of the extrude. The Profile and Operation are defined when the ExtrudeFeatures.createInput +/// method is called so they do not exist as properties on this class. +class ExtrudeFeatureInput : public core::Base { +public: + + /// Gets and sets the profiles or planar faces used to define the shape of the extrude. + /// This property can return or be set with a single profile, a single planar face, or + /// an ObjectCollection consisting of multiple profiles and planar faces. When an + /// ObjectCollection is used all of the profiles and faces must be co-planar. + /// To create a surface (non-solid) extrusion, you can use the createOpenProfile and createBRepEdgeProfile + /// methods of the Component object to create an open profile. The isSolid property of the + /// ExtrudeFeatureInput property must also be False. + core::Ptr profile() const; + bool profile(const core::Ptr& value); + + /// Gets and sets the type of operation performed by the extrusion. + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// Gets and sets the taper angle of the extrusion. This is used to define the + /// taper angle for a single sided and symmetric and defines the angle for side one + /// of a two sided extrusion. This property is initialized with a taper angle of zero. + /// A negative angle will taper the extrusion inward while a positive value will taper + /// the extrusion outward. This property is valid for both parametric and non-parametric extrusions. + core::Ptr taperAngle() const; + bool taperAngle(const core::Ptr& value); + + /// Sets the extrusion extents option to 'Distance'. + /// isSymmetric : Set to 'true' for an extrusion symmetrical about the profile plane + /// distance : ValueInput object that defines the extrude distance. + /// If the isSymmetric argument is 'false', a positive or negative distance can be used to control the direction. + /// Returns true if successful + bool setDistanceExtent(bool isSymmetric, const core::Ptr& distance); + + /// Sets the extrusion extents option to 'Two Side'. + /// This method will fail in the case of a non-parametric extrusion. + /// distanceOne : ValueInput object that defines the extrude distance for the first side. + /// distanceTwo : ValueInput object that defines the extrude distance for the second side. + /// Returns true if successful + bool setTwoSidesDistanceExtent(const core::Ptr& distanceOne, const core::Ptr& distanceTwo); + + /// Sets the extrusion extents option to 'All' (i.e. the extrusion is through-all, in both directions.) + /// This method will fail in the case of a non-parametric extrusion. + /// direction : The direction can be either positive, negative, or symmetric. + /// Returns true if successful + bool setAllExtent(ExtentDirections direction); + + /// Sets the extrusion Direction option to 'One Side' and the Extents option to 'To' (a specified face) + /// toEntity : The entity that defines the "to" extent. The valid types of entities can vary depending on + /// the type of feature this is being used with. For an extrude it can be a BRepBody, BRepFace, + /// BRepVertex, ConstructionPlane, or ConstructionPoint. + /// matchShape : If the matchShape argument is 'true', the toEntity is extended to fully intersect the extrusion. + /// directionHint : Specifies the direction of the extrusion. This is only used in the case where there are two possible solutions and the extrusion can + /// hit the toEntity in either direction. An example is if the profile of the extrusion is within a hole. + /// The extrusion will intersect the cylinder of the hole in either direction. + /// Typically there is only a single solution and the direction is determined automatically. + /// Returns true if successful. + bool setOneSideToExtent(const core::Ptr& toEntity, bool matchShape, const core::Ptr& directionHint = NULL); + + /// Set the extrusion Direction option to 'Two Side' + /// This method will fail in the case of a non-parametric extrusion. + /// toEntityOne : The first entity that defines the "to" extent. The valid types of entities can vary depending on + /// the type of feature this is being used with. For an extrude it can be a BRepBody, BRepFace, + /// BRepVertex, ConstructionPlane, or ConstructionPoint. + /// toEntityTwo : The second entity that defines the "to" extent. The valid types of entities can vary depending on + /// the type of feature this is being used with. For an extrude it can be a BRepBody, BRepFace, + /// BRepVertex, ConstructionPlane, or ConstructionPoint. + /// matchShape : If the matchShape argument is 'true', the toEntity is extended to fully intersect the extrusion. + /// Returns true if successful. + bool setTwoSidesToExtent(const core::Ptr& toEntityOne, const core::Ptr& toEntityTwo, bool matchShape); + + /// In order for geometry to be transformed correctly, an Occurrence for creation needs to be + /// specified when the Extrusion is created based on geometry (e.g. a profile and/or face(s)) + /// in another component AND (the Extrusion) is not in the root component. + /// The CreationOccurrence is analogous to the active occurrence in the UI + core::Ptr creationOccurrence() const; + bool creationOccurrence(const core::Ptr& value); + + /// Specifies if the extrusion should be created as a solid or surface. If + /// it's a surface then there aren't any end caps and it's open. When a ExtrudeFeature + /// input is created, this is initialized to true so a solid will be created if it's not changed. + bool isSolid() const; + bool isSolid(bool value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + /// Gets and sets the extent used to define the start of the extrusion. When a new ExtrudeFeatureInput + /// object is created the start extent is initialized to be the profile plane but you can change it + /// to a profile plane with offset or from an object by setting this property with either a + /// ProfilePlaneWithOffsetStartDefinition or a EntityStartDefinition object. You can get either one + /// of those objects by using the static create method on the class. + core::Ptr startExtent() const; + bool startExtent(const core::Ptr& value); + + /// Defines the extrusion to go in one direction from the profile. The extent of the extrusion is + /// defined by the extent argument. + /// extent : An ExtentDefinition object that defines how the extent of the extrusion is defined. This can be + /// a specified distance (DistanceExtentDefinition), to an entity (ToEntityExtent), or through-all (AllExtentDefinition). + /// These objects can be obtained by using the static create method on the appropriate class. + /// direction : Specifies the direction of the extrusion. PositiveExtentDirection and NegativeExtentDirection + /// are valid values. PositiveExtentDirection is in the same direction as the normal of the profile's + /// parent sketch plane. + /// taperAngle : Optional argument that specifies the taper angle. If omitted a taper angle of 0 is used. + /// Returns true is setting the input to a one sided extent was successful. + bool setOneSideExtent(const core::Ptr& extent, ExtentDirections direction, const core::Ptr& taperAngle = NULL); + + /// Defines the extrusion to go in both directions from the profile. The extent is defined independently + /// for each direction using the input arguments. + /// sideOneExtent : An ExtentDefinition object that defines how the extent of the extrusion towards side one is defined. This can be + /// a specified distance (DistanceExtentDefinition), to an entity (ToEntityExtent), or through-all (AllExtentDefinition). + /// These objects can be obtained by using the static create method on the appropriate class. + /// sideTwoExtent : An ExtentDefinition object that defines how the extent of the extrusion towards side two is defined. This can be + /// a specified distance (DistanceExtentDefinition), to an entity (ToEntityExtent), or through-all (AllExtentDefinition). + /// These objects can be obtained by using the static create method on the appropriate class. + /// sideOneTaperAngle : Optional argument that specifies the taper angle for side one. If omitted a taper angle of 0 is used. + /// sideTwoTaperAngle : Optional argument that specifies the taper angle for side two. If omitted a taper angle of 0 is used. + /// Returns true is setting the extent was successful. + bool setTwoSidesExtent(const core::Ptr& sideOneExtent, const core::Ptr& sideTwoExtent, const core::Ptr& sideOneTaperAngle = NULL, const core::Ptr& sideTwoTaperAngle = NULL); + + /// Defines the extrusion to go symmetrically in both directions from the profile. + /// distance : The distance of the extrusions. This is either the full length of half of the length of the final extrusion + /// depending on the value of the isFullLength property. + /// isFullLength : Defines if the value defines the full length of the extrusion or half of the length. A value of true indicates + /// it defines the full length. + /// taperAngle : Optional argument that specifies the taper angle. The same taper angle is used for both sides for a symmetric + /// extrusion. If omitted a taper angle of 0 is used. + /// Returns true is setting the extent was successful. + bool setSymmetricExtent(const core::Ptr& distance, bool isFullLength, const core::Ptr& taperAngle = NULL); + + /// Gets the extent assigned for a single sided extrude or side one of a two-sided extrusion. To set the extent, use + /// one of the set methods on the ExtrudeFeatureInput object. + core::Ptr extentOne() const; + + /// Gets the extent assigned for side two of the extrusion. If the extrude is single sided extrude this + /// property will return null. The hasTwoExtents property can be used to determine if there + /// are two sides or not. To set the extent, use one of the set methods on the ExtrudeFeatureInput object. + core::Ptr extentTwo() const; + + /// Gets the value that will be used as the taper angle for a single sided extrusion or side one of a two-sided + /// extrusion. To set the taper angle, use one of the set methods on the ExtrudeFeatureInput object. + core::Ptr taperAngleOne() const; + + /// Gets the value that will be used as the taper angle for side two of a two-sided extrusion. If the extrusion is + /// single-sided, this property will return null. The hasTwoExtents property can be used to determine if there + /// are two sides or not. To set the taper angle, use one of the set methods on the ExtrudeFeatureInput object. + core::Ptr taperAngleTwo() const; + + /// Property that indicates if the extrusion is a single or two-sided extrusion. If false, the extentTwo + /// and taperAngleTwo properties should not be used. + bool hasTwoExtents() const; + + /// Gets and sets the list of bodies that will participate in the feature when the operation is a cut or intersection. + /// If this property has not been set, the default behavior is that all bodies that are intersected by the + /// feature will participate. + /// This property can return null in the case where the feature has not been fully defined so that + /// possible intersecting bodies can be computed. + std::vector> participantBodies() const; + bool participantBodies(const std::vector>& value); + + /// Sets or returns whether the extrude is a thin extrude. + /// Setting it as false will make it a regular extrude. + bool isThinExtrude() const; + bool isThinExtrude(bool value); + + /// Changes the extrude feature to be a thin extrude. This is only valid if the isThinExtrude property + /// is False. If the extrusion is already a thin extrude, you can use the properties on the ExtrudeFeature + /// to modify the thin extrude specific values. + /// thinExtrudeWallLocationOne : Specifies the position of the thin wall extrude with respect to the profile being extruded. This defines + /// the direction for a single sided thin extrude or side one of a two-sided extrusion. + /// thinExtrudeWallThicknessOne : A ValueInput object that defines the thickness for a single sided thin extrude or side one of a two-sided + /// extrusion . + /// thinExtrudeWallLocationTwo : Optional argument that specifies the position of side two of a two-sided extrusion. This argument is ignored + /// for a single sided thin extrude. + /// thinExtrudeWallThicknessTwo : Optional argument that is a ValueInput object that defines the thickness for side two of a + /// two-sided extrusion. This argument is ignored for a single sided thin extrude. + /// Returns true if successful. + bool setThinExtrude(ThinExtrudeWallLocation thinExtrudeWallLocationOne, const core::Ptr& thinExtrudeWallThicknessOne, ThinExtrudeWallLocation thinExtrudeWallLocationTwo = adsk::fusion::Side1, const core::Ptr& thinExtrudeWallThicknessTwo = NULL); + + /// Gets and sets the wall location for a one sided thin extrude or side one of a two sided thin extrude + ThinExtrudeWallLocation thinExtrudeWallLocationOne() const; + bool thinExtrudeWallLocationOne(ThinExtrudeWallLocation value); + + /// Gets and sets the wall location for side two of a two sided thin extrude + ThinExtrudeWallLocation thinExtrudeWallLocationTwo() const; + bool thinExtrudeWallLocationTwo(ThinExtrudeWallLocation value); + + /// Gets and sets the wall thickness for a one sided thin extrude or side one of a two sided thin extrude + core::Ptr thinExtrudeWallThicknessOne() const; + bool thinExtrudeWallThicknessOne(const core::Ptr& value); + + /// Gets and sets the wall thickness for side two of a two sided thin extrude + core::Ptr thinExtrudeWallThicknessTwo() const; + bool thinExtrudeWallThicknessTwo(const core::Ptr& value); + + ADSK_FUSION_EXTRUDEFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_EXTRUDEFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_EXTRUDEFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_EXTRUDEFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* profile_raw() const = 0; + virtual bool profile_raw(core::Base* value) = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual core::ValueInput* taperAngle_raw() const = 0; + virtual bool taperAngle_raw(core::ValueInput* value) = 0; + virtual bool setDistanceExtent_raw(bool isSymmetric, core::ValueInput* distance) = 0; + virtual bool setTwoSidesDistanceExtent_raw(core::ValueInput* distanceOne, core::ValueInput* distanceTwo) = 0; + virtual bool setAllExtent_raw(ExtentDirections direction) = 0; + virtual bool setOneSideToExtent_raw(core::Base* toEntity, bool matchShape, core::Vector3D* directionHint) = 0; + virtual bool setTwoSidesToExtent_raw(core::Base* toEntityOne, core::Base* toEntityTwo, bool matchShape) = 0; + virtual Occurrence* creationOccurrence_raw() const = 0; + virtual bool creationOccurrence_raw(Occurrence* value) = 0; + virtual bool isSolid_raw() const = 0; + virtual bool isSolid_raw(bool value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; + virtual ExtentDefinition* startExtent_raw() const = 0; + virtual bool startExtent_raw(ExtentDefinition* value) = 0; + virtual bool setOneSideExtent_raw(ExtentDefinition* extent, ExtentDirections direction, core::ValueInput* taperAngle) = 0; + virtual bool setTwoSidesExtent_raw(ExtentDefinition* sideOneExtent, ExtentDefinition* sideTwoExtent, core::ValueInput* sideOneTaperAngle, core::ValueInput* sideTwoTaperAngle) = 0; + virtual bool setSymmetricExtent_raw(core::ValueInput* distance, bool isFullLength, core::ValueInput* taperAngle) = 0; + virtual ExtentDefinition* extentOne_raw() const = 0; + virtual ExtentDefinition* extentTwo_raw() const = 0; + virtual core::ValueInput* taperAngleOne_raw() const = 0; + virtual core::ValueInput* taperAngleTwo_raw() const = 0; + virtual bool hasTwoExtents_raw() const = 0; + virtual BRepBody** participantBodies_raw(size_t& return_size) const = 0; + virtual bool participantBodies_raw(BRepBody** value, size_t value_size) = 0; + virtual bool isThinExtrude_raw() const = 0; + virtual bool isThinExtrude_raw(bool value) = 0; + virtual bool setThinExtrude_raw(ThinExtrudeWallLocation thinExtrudeWallLocationOne, core::ValueInput* thinExtrudeWallThicknessOne, ThinExtrudeWallLocation thinExtrudeWallLocationTwo, core::ValueInput* thinExtrudeWallThicknessTwo) = 0; + virtual ThinExtrudeWallLocation thinExtrudeWallLocationOne_raw() const = 0; + virtual bool thinExtrudeWallLocationOne_raw(ThinExtrudeWallLocation value) = 0; + virtual ThinExtrudeWallLocation thinExtrudeWallLocationTwo_raw() const = 0; + virtual bool thinExtrudeWallLocationTwo_raw(ThinExtrudeWallLocation value) = 0; + virtual core::ValueInput* thinExtrudeWallThicknessOne_raw() const = 0; + virtual bool thinExtrudeWallThicknessOne_raw(core::ValueInput* value) = 0; + virtual core::ValueInput* thinExtrudeWallThicknessTwo_raw() const = 0; + virtual bool thinExtrudeWallThicknessTwo_raw(core::ValueInput* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr ExtrudeFeatureInput::profile() const +{ + core::Ptr res = profile_raw(); + return res; +} + +inline bool ExtrudeFeatureInput::profile(const core::Ptr& value) +{ + return profile_raw(value.get()); +} + +inline FeatureOperations ExtrudeFeatureInput::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool ExtrudeFeatureInput::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline core::Ptr ExtrudeFeatureInput::taperAngle() const +{ + core::Ptr res = taperAngle_raw(); + return res; +} + +inline bool ExtrudeFeatureInput::taperAngle(const core::Ptr& value) +{ + return taperAngle_raw(value.get()); +} + +inline bool ExtrudeFeatureInput::setDistanceExtent(bool isSymmetric, const core::Ptr& distance) +{ + bool res = setDistanceExtent_raw(isSymmetric, distance.get()); + return res; +} + +inline bool ExtrudeFeatureInput::setTwoSidesDistanceExtent(const core::Ptr& distanceOne, const core::Ptr& distanceTwo) +{ + bool res = setTwoSidesDistanceExtent_raw(distanceOne.get(), distanceTwo.get()); + return res; +} + +inline bool ExtrudeFeatureInput::setAllExtent(ExtentDirections direction) +{ + bool res = setAllExtent_raw(direction); + return res; +} + +inline bool ExtrudeFeatureInput::setOneSideToExtent(const core::Ptr& toEntity, bool matchShape, const core::Ptr& directionHint) +{ + bool res = setOneSideToExtent_raw(toEntity.get(), matchShape, directionHint.get()); + return res; +} + +inline bool ExtrudeFeatureInput::setTwoSidesToExtent(const core::Ptr& toEntityOne, const core::Ptr& toEntityTwo, bool matchShape) +{ + bool res = setTwoSidesToExtent_raw(toEntityOne.get(), toEntityTwo.get(), matchShape); + return res; +} + +inline core::Ptr ExtrudeFeatureInput::creationOccurrence() const +{ + core::Ptr res = creationOccurrence_raw(); + return res; +} + +inline bool ExtrudeFeatureInput::creationOccurrence(const core::Ptr& value) +{ + return creationOccurrence_raw(value.get()); +} + +inline bool ExtrudeFeatureInput::isSolid() const +{ + bool res = isSolid_raw(); + return res; +} + +inline bool ExtrudeFeatureInput::isSolid(bool value) +{ + return isSolid_raw(value); +} + +inline core::Ptr ExtrudeFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool ExtrudeFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} + +inline core::Ptr ExtrudeFeatureInput::startExtent() const +{ + core::Ptr res = startExtent_raw(); + return res; +} + +inline bool ExtrudeFeatureInput::startExtent(const core::Ptr& value) +{ + return startExtent_raw(value.get()); +} + +inline bool ExtrudeFeatureInput::setOneSideExtent(const core::Ptr& extent, ExtentDirections direction, const core::Ptr& taperAngle) +{ + bool res = setOneSideExtent_raw(extent.get(), direction, taperAngle.get()); + return res; +} + +inline bool ExtrudeFeatureInput::setTwoSidesExtent(const core::Ptr& sideOneExtent, const core::Ptr& sideTwoExtent, const core::Ptr& sideOneTaperAngle, const core::Ptr& sideTwoTaperAngle) +{ + bool res = setTwoSidesExtent_raw(sideOneExtent.get(), sideTwoExtent.get(), sideOneTaperAngle.get(), sideTwoTaperAngle.get()); + return res; +} + +inline bool ExtrudeFeatureInput::setSymmetricExtent(const core::Ptr& distance, bool isFullLength, const core::Ptr& taperAngle) +{ + bool res = setSymmetricExtent_raw(distance.get(), isFullLength, taperAngle.get()); + return res; +} + +inline core::Ptr ExtrudeFeatureInput::extentOne() const +{ + core::Ptr res = extentOne_raw(); + return res; +} + +inline core::Ptr ExtrudeFeatureInput::extentTwo() const +{ + core::Ptr res = extentTwo_raw(); + return res; +} + +inline core::Ptr ExtrudeFeatureInput::taperAngleOne() const +{ + core::Ptr res = taperAngleOne_raw(); + return res; +} + +inline core::Ptr ExtrudeFeatureInput::taperAngleTwo() const +{ + core::Ptr res = taperAngleTwo_raw(); + return res; +} + +inline bool ExtrudeFeatureInput::hasTwoExtents() const +{ + bool res = hasTwoExtents_raw(); + return res; +} + +inline std::vector> ExtrudeFeatureInput::participantBodies() const +{ + std::vector> res; + size_t s; + + BRepBody** p= participantBodies_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool ExtrudeFeatureInput::participantBodies(const std::vector>& value) +{ + BRepBody** value_ = new BRepBody*[value.size()]; + for(size_t i=0; i& thinExtrudeWallThicknessOne, ThinExtrudeWallLocation thinExtrudeWallLocationTwo, const core::Ptr& thinExtrudeWallThicknessTwo) +{ + bool res = setThinExtrude_raw(thinExtrudeWallLocationOne, thinExtrudeWallThicknessOne.get(), thinExtrudeWallLocationTwo, thinExtrudeWallThicknessTwo.get()); + return res; +} + +inline ThinExtrudeWallLocation ExtrudeFeatureInput::thinExtrudeWallLocationOne() const +{ + ThinExtrudeWallLocation res = thinExtrudeWallLocationOne_raw(); + return res; +} + +inline bool ExtrudeFeatureInput::thinExtrudeWallLocationOne(ThinExtrudeWallLocation value) +{ + return thinExtrudeWallLocationOne_raw(value); +} + +inline ThinExtrudeWallLocation ExtrudeFeatureInput::thinExtrudeWallLocationTwo() const +{ + ThinExtrudeWallLocation res = thinExtrudeWallLocationTwo_raw(); + return res; +} + +inline bool ExtrudeFeatureInput::thinExtrudeWallLocationTwo(ThinExtrudeWallLocation value) +{ + return thinExtrudeWallLocationTwo_raw(value); +} + +inline core::Ptr ExtrudeFeatureInput::thinExtrudeWallThicknessOne() const +{ + core::Ptr res = thinExtrudeWallThicknessOne_raw(); + return res; +} + +inline bool ExtrudeFeatureInput::thinExtrudeWallThicknessOne(const core::Ptr& value) +{ + return thinExtrudeWallThicknessOne_raw(value.get()); +} + +inline core::Ptr ExtrudeFeatureInput::thinExtrudeWallThicknessTwo() const +{ + core::Ptr res = thinExtrudeWallThicknessTwo_raw(); + return res; +} + +inline bool ExtrudeFeatureInput::thinExtrudeWallThicknessTwo(const core::Ptr& value) +{ + return thinExtrudeWallThicknessTwo_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_EXTRUDEFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ExtrudeFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/ExtrudeFeatures.h new file mode 100644 index 0000000..ddc594b --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ExtrudeFeatures.h @@ -0,0 +1,160 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_EXTRUDEFEATURES_CPP__ +# define ADSK_FUSION_EXTRUDEFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_EXTRUDEFEATURES_API +# endif +#else +# define ADSK_FUSION_EXTRUDEFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ExtrudeFeature; + class ExtrudeFeatureInput; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing extrude features in a design +/// and supports the ability to create new extrude features. +class ExtrudeFeatures : public core::Base { +public: + + /// Function that returns the specified extrude feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of extrude features in the collection. + size_t count() const; + + /// Creates a new ExtrudeFeatureInput object that is used to specify the input needed + /// to create a new extrude feature. + /// profile : The profile argument can be a single Profile, a single planar face, a single SketchText object, + /// or an ObjectCollection consisting of multiple profiles, planar faces, and sketch texts. + /// When an ObjectCollection is used all of the profiles, faces, and sketch texts must be co-planar. + /// To create a surface (non-solid) extrusion, you can use the createOpenProfile and createBRepEdgeProfile + /// methods of the Component object to create an open profile. You also need to set the isSolid property + /// of the returned ExtrudeFeatureInput property to False. + /// operation : The feature operation to perform. + /// Returns the newly created ExtrudeFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& profile, FeatureOperations operation) const; + + /// Creates a new extrude feature based on the information defined by the provided ExtrudeFeatureInput object. + /// To create a new extrusion use the createInput function to create a new input object and use the methods and + /// properties on that object to define the required input for an extrusion. Once the information is defined on the + /// input object you can pass it to the Add method to create the extrusion. + /// input : The ExtrudeFeatureInput object that specifies the input needed to create a new extrude + /// feature. + /// Returns the newly created ExtrudeFeature or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified extrude feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// Creates a basic extrusion that goes from the profile plane the specified distance. + /// profile : The profile argument can be a single Profile, a single planar face, a single SketchText object, + /// or an ObjectCollection consisting of multiple profiles, planar faces, and sketch texts. + /// When an ObjectCollection is used all of the profiles, faces, and sketch texts must be co-planar. + /// To create a surface (non-solid) extrusion, you can use the createOpenProfile and createBRepEdgeProfile + /// methods of the Component object to create an open profile. You also need to set the isSolid property + /// of the returned ExtrudeFeatureInput property to False. + /// distance : ValueInput object that defines the extrude distance. A positive value extrudes in the positive direction + /// of the sketch plane and negative value is in the opposite direction. + /// operation : The feature operation to perform. + /// Returns the newly created ExtrudeFeature or null if the creation failed. + core::Ptr addSimple(const core::Ptr& profile, const core::Ptr& distance, FeatureOperations operation); + + typedef ExtrudeFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_EXTRUDEFEATURES_API static const char* classType(); + ADSK_FUSION_EXTRUDEFEATURES_API const char* objectType() const override; + ADSK_FUSION_EXTRUDEFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_EXTRUDEFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ExtrudeFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual ExtrudeFeatureInput* createInput_raw(core::Base* profile, FeatureOperations operation) const = 0; + virtual ExtrudeFeature* add_raw(ExtrudeFeatureInput* input) = 0; + virtual ExtrudeFeature* itemByName_raw(const char * name) const = 0; + virtual ExtrudeFeature* addSimple_raw(core::Base* profile, core::ValueInput* distance, FeatureOperations operation) = 0; +}; + +// Inline wrappers + +inline core::Ptr ExtrudeFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t ExtrudeFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr ExtrudeFeatures::createInput(const core::Ptr& profile, FeatureOperations operation) const +{ + core::Ptr res = createInput_raw(profile.get(), operation); + return res; +} + +inline core::Ptr ExtrudeFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr ExtrudeFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline core::Ptr ExtrudeFeatures::addSimple(const core::Ptr& profile, const core::Ptr& distance, FeatureOperations operation) +{ + core::Ptr res = addSimple_raw(profile.get(), distance.get(), operation); + return res; +} + +template inline void ExtrudeFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_EXTRUDEFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/Feature.h b/usr/autodesk/CPP/include/Fusion/Features/Feature.h new file mode 100644 index 0000000..ef7fa17 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/Feature.h @@ -0,0 +1,341 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FEATURE_CPP__ +# define ADSK_FUSION_FEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_FEATURE_API +# endif +#else +# define ADSK_FUSION_FEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class BRepBodies; + class BRepFaces; + class Component; + class FeatureList; + class Occurrence; + class TimelineObject; +}} +namespace adsk { namespace core { + class Attributes; +}} + +namespace adsk { namespace fusion { + +/// Base class object representing all features. +class Feature : public core::Base { +public: + + /// Returns the name of the feature as seen in the browser (non-parametric) or in the timeline (parametric). + std::string name() const; + bool name(const std::string& value); + + /// Deletes the feature. + /// This works for both parametric and non-parametric features. + /// Returns a bool indicating if the delete was successful or not. + bool deleteMe(); + + /// Dissolves the feature so that the feature information is lost + /// and only the B-Rep geometry defined by the feature remains. + /// This is only valid for non-parametric features. + /// Returns a bool indicating if the dissolve was successful or not. + bool dissolve(); + + /// Gets and sets if this feature is suppressed. This is only valid + /// for parametric features. + bool isSuppressed() const; + bool isSuppressed(bool value); + + /// Indicates if this feature is parametric or not. + bool isParametric() const; + + /// Returns the faces that were created by this feature. + /// This works for both parametric and non-parametric features. + core::Ptr faces() const; + + /// Returns the parent component that owns this feature. + core::Ptr parentComponent() const; + + /// Returns the set of features that are linked to this feature. The set of linked features + /// are all of the features that were created in various components as the result of a + /// single feature being created in the user interface. + core::Ptr linkedFeatures() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this object + /// in an assembly. This is only valid in the case where this is acting + /// as a proxy in an assembly. Returns null in the case where the object + /// is not in the context of an assembly but is already the native object. + core::Ptr assemblyContext() const; + + /// Returns the timeline object associated with this feature. + core::Ptr timelineObject() const; + + /// Returns the bodies that were modified or created by this feature. + /// This property works for both parametric and non-parametric features. + /// For a BaseFeature, this property has two different behaviors depending + /// on if the BaseFeature is active for edit or not. When the base feature is + /// active, this property returns the bodies owned by the base feature or the + /// source bodies. When the base feature is not active, this property returns + /// the result bodies. + /// When a body is added to a base feature, that body is owned by the base feature + /// and is only seen in the UI when the base feature is active. This body is referred + /// to as a "source body". Fusion creates a parametric copy of the body when you + /// exit the base feature. This copy is referred to as the "result body," and it + /// is used for subsequent modeling operations. + /// You can map between the source and result bodies by using their position + /// within the bodies returned. To get a valid list of result bodies, you should + /// roll the timeline to immediately after the base feature node in the timeline. + /// Otherwise, subsequent operations could have done something to cause one or + /// more bodies to no longer be available. + core::Ptr bodies() const; + + /// Returns the collection of attributes associated with this face. + core::Ptr attributes() const; + + /// If this feature is associated with a base feature, this property will return that base feature. + /// If it's not associated with a base feature, this property will return null. + core::Ptr baseFeature() const; + + /// Returns the current health state of the feature. + FeatureHealthStates healthState() const; + + /// Returns the error or warning message in the case where the healthState property returns either + /// WarningFeatureHealthState or ErrorFeatureHealthState. Otherwise this property returns an empty string. + std::string errorOrWarningMessage() const; + + /// Returns a token for the Feature object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same feature. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + ADSK_FUSION_FEATURE_API static const char* classType(); + ADSK_FUSION_FEATURE_API const char* objectType() const override; + ADSK_FUSION_FEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* name_raw() const = 0; + virtual bool deleteMe_raw() = 0; + virtual bool dissolve_raw() = 0; + virtual bool isSuppressed_raw() const = 0; + virtual bool isSuppressed_raw(bool value) = 0; + virtual bool isParametric_raw() const = 0; + virtual BRepFaces* faces_raw() const = 0; + virtual Component* parentComponent_raw() const = 0; + virtual FeatureList* linkedFeatures_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual TimelineObject* timelineObject_raw() const = 0; + virtual BRepBodies* bodies_raw() const = 0; + virtual bool name__raw(const char * value) = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual BaseFeature* baseFeature_raw() const = 0; + virtual FeatureHealthStates healthState_raw() const = 0; + virtual char* errorOrWarningMessage_raw() const = 0; + virtual char* entityToken_raw() const = 0; + virtual void placeholderFeature0() {} + virtual void placeholderFeature1() {} + virtual void placeholderFeature2() {} + virtual void placeholderFeature3() {} + virtual void placeholderFeature4() {} + virtual void placeholderFeature5() {} + virtual void placeholderFeature6() {} + virtual void placeholderFeature7() {} + virtual void placeholderFeature8() {} + virtual void placeholderFeature9() {} + virtual void placeholderFeature10() {} + virtual void placeholderFeature11() {} + virtual void placeholderFeature12() {} + virtual void placeholderFeature13() {} + virtual void placeholderFeature14() {} + virtual void placeholderFeature15() {} + virtual void placeholderFeature16() {} + virtual void placeholderFeature17() {} + virtual void placeholderFeature18() {} + virtual void placeholderFeature19() {} + virtual void placeholderFeature20() {} + virtual void placeholderFeature21() {} + virtual void placeholderFeature22() {} + virtual void placeholderFeature23() {} + virtual void placeholderFeature24() {} + virtual void placeholderFeature25() {} + virtual void placeholderFeature26() {} + virtual void placeholderFeature27() {} + virtual void placeholderFeature28() {} + virtual void placeholderFeature29() {} + virtual void placeholderFeature30() {} + virtual void placeholderFeature31() {} + virtual void placeholderFeature32() {} + virtual void placeholderFeature33() {} + virtual void placeholderFeature34() {} + virtual void placeholderFeature35() {} + virtual void placeholderFeature36() {} + virtual void placeholderFeature37() {} + virtual void placeholderFeature38() {} + virtual void placeholderFeature39() {} + virtual void placeholderFeature40() {} + virtual void placeholderFeature41() {} + virtual void placeholderFeature42() {} + virtual void placeholderFeature43() {} + virtual void placeholderFeature44() {} + virtual void placeholderFeature45() {} +}; + +// Inline wrappers + +inline std::string Feature::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool Feature::name(const std::string& value) +{ + return name__raw(value.c_str()); +} + +inline bool Feature::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline bool Feature::dissolve() +{ + bool res = dissolve_raw(); + return res; +} + +inline bool Feature::isSuppressed() const +{ + bool res = isSuppressed_raw(); + return res; +} + +inline bool Feature::isSuppressed(bool value) +{ + return isSuppressed_raw(value); +} + +inline bool Feature::isParametric() const +{ + bool res = isParametric_raw(); + return res; +} + +inline core::Ptr Feature::faces() const +{ + core::Ptr res = faces_raw(); + return res; +} + +inline core::Ptr Feature::parentComponent() const +{ + core::Ptr res = parentComponent_raw(); + return res; +} + +inline core::Ptr Feature::linkedFeatures() const +{ + core::Ptr res = linkedFeatures_raw(); + return res; +} + +inline core::Ptr Feature::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr Feature::timelineObject() const +{ + core::Ptr res = timelineObject_raw(); + return res; +} + +inline core::Ptr Feature::bodies() const +{ + core::Ptr res = bodies_raw(); + return res; +} + +inline core::Ptr Feature::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline core::Ptr Feature::baseFeature() const +{ + core::Ptr res = baseFeature_raw(); + return res; +} + +inline FeatureHealthStates Feature::healthState() const +{ + FeatureHealthStates res = healthState_raw(); + return res; +} + +inline std::string Feature::errorOrWarningMessage() const +{ + std::string res; + + char* p= errorOrWarningMessage_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string Feature::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/FeatureList.h b/usr/autodesk/CPP/include/Fusion/Features/FeatureList.h new file mode 100644 index 0000000..b586b52 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/FeatureList.h @@ -0,0 +1,88 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FEATURELIST_CPP__ +# define ADSK_FUSION_FEATURELIST_API XI_EXPORT +# else +# define ADSK_FUSION_FEATURELIST_API +# endif +#else +# define ADSK_FUSION_FEATURELIST_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Feature; +}} + +namespace adsk { namespace fusion { + +/// Provides access to a list of features. This is used in the API to return +/// a list of features from an API call. +class FeatureList : public core::Base { +public: + + /// Returns the specified folder. + /// index : The index of the feature to return. The first feature in the list has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of features in this collection. + size_t count() const; + + typedef Feature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_FEATURELIST_API static const char* classType(); + ADSK_FUSION_FEATURELIST_API const char* objectType() const override; + ADSK_FUSION_FEATURELIST_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FEATURELIST_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Feature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr FeatureList::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t FeatureList::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void FeatureList::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FEATURELIST_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/Features.h b/usr/autodesk/CPP/include/Fusion/Features/Features.h new file mode 100644 index 0000000..6836678 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/Features.h @@ -0,0 +1,747 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FEATURES_CPP__ +# define ADSK_FUSION_FEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_FEATURES_API +# endif +#else +# define ADSK_FUSION_FEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeatures; + class BoundaryFillFeatures; + class BoxFeatures; + class ChamferFeatures; + class CircularPatternFeatures; + class CoilFeatures; + class CombineFeatures; + class CopyPasteBodies; + class CustomFeatures; + class CutPasteBodies; + class CylinderFeatures; + class DeleteFaceFeatures; + class DraftFeatures; + class ExtendFeatures; + class ExtrudeFeatures; + class Feature; + class FilletFeatures; + class FlangeFeatures; + class FormFeatures; + class HoleFeatures; + class LoftFeatures; + class MirrorFeatures; + class MoveFeatures; + class OffsetFacesFeatures; + class OffsetFeatures; + class PatchFeatures; + class Path; + class PathPatternFeatures; + class PipeFeatures; + class RectangularPatternFeatures; + class RefoldFeatures; + class RemoveFeatures; + class ReplaceFaceFeatures; + class ReverseNormalFeatures; + class RevolveFeatures; + class RibFeatures; + class RuledSurfaceFeatures; + class RuleFilletFeatures; + class ScaleFeatures; + class ShellFeatures; + class SilhouetteSplitFeatures; + class SphereFeatures; + class SplitBodyFeatures; + class SplitFaceFeatures; + class StitchFeatures; + class SurfaceDeleteFaceFeatures; + class SweepFeatures; + class ThickenFeatures; + class ThreadFeatures; + class TorusFeatures; + class TrimFeatures; + class UnfoldFeatures; + class UnstitchFeatures; + class UntrimFeatures; + class WebFeatures; +}} + +namespace adsk { namespace fusion { + +/// The features collection which provides access to all existing features. This collection +/// provides direct access to all features regardless of type. It also provides access +/// to type specific collections where you can get features of a specific type and also create +/// new features of that type. +class Features : public core::Base { +public: + + /// Function that returns the specified feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of bodies in the collection. + size_t count() const; + + /// Returns the collection that provides access to the extrude features within the component + /// and supports the creation of new extrude features. + core::Ptr extrudeFeatures() const; + + /// Returns the collection that provides access to the revolve features within the component + /// and supports the creation of new revolved features. + core::Ptr revolveFeatures() const; + + /// Returns the collection that provides access to the hole features within the component + /// and supports the creation of new hole features. + core::Ptr holeFeatures() const; + + /// Returns the collection that provides access to the fillet features within the component + /// and supports the creation of new fillet features. + core::Ptr filletFeatures() const; + + /// Returns the collection that provides access to the sweep features within the component + /// and supports the creation of new sweep features. + core::Ptr sweepFeatures() const; + + /// Returns the collection that provides access to the chamfer features within the component + /// and supports the creation of new chamfer features. + core::Ptr chamferFeatures() const; + + /// Returns the collection that provides access to the shell features within the component + /// and supports the creation of new shell features. + core::Ptr shellFeatures() const; + + /// Returns the collection that provides access to the mirror features within the component + /// and supports the creation of new mirror features. + core::Ptr mirrorFeatures() const; + + /// Returns the collection that provides access to the circular pattern features within the component + /// and supports the creation of new circular pattern features. + core::Ptr circularPatternFeatures() const; + + /// Returns the collection that provides access to the rectangular pattern features within the component + /// and supports the creation of new rectangular pattern features. + core::Ptr rectangularPatternFeatures() const; + + /// Returns the collection that provides access to the path pattern features within the component + /// and supports the creation of new path pattern features. + core::Ptr pathPatternFeatures() const; + + /// Returns the collection that provides access to the combine features within the component + /// and supports the creation of new combine features. + core::Ptr combineFeatures() const; + + /// Returns the collection that provides access to the thread features within the component + /// and supports the creation of new thread features. + core::Ptr threadFeatures() const; + + /// Returns the collection that provides access to the draft features within the component + /// and supports the creation of new draft features. + core::Ptr draftFeatures() const; + + /// Returns the collection that provides access to the scale features within the component + /// and supports the creation of new scale features. + core::Ptr scaleFeatures() const; + + /// Method that creates a Path used to define the shape of a Sweep feature. A Path is a contiguous + /// set of curves that can be a combination of sketch curves and model edges. + /// curve : A SketchCurve or an ObjectCollection containing multiple sketch entities and/or BRepEdge objects. If a single sketch curve + /// or edge is input the isChain argument is checked to determine if connected curves (they do not need to be tangent) + /// should be automatically found. If multiple curves are provided the isChain argument is always + /// treated as false so you must provide all of the curves in the object collection that you want included in the path. + /// The provided curves must all connect together in a single path. + /// The input curves can be from multiple sketches and bodies and they need to geometrically connect for + /// a valid path to be created. + /// isChain : Optional argument, that defaults to true. If this argument is set to true, all curves and edges that are end point + /// connected to the single input curve will be found and used to create the path. + /// This argument is only used when the first argument is a single SketchCurve/BRepEdge object. + /// Returns the newly created Path. + core::Ptr createPath(const core::Ptr& curve, bool isChain = true); + + /// Returns the collection that provides access to the replaceFace features within the component + /// and supports the creation of new replaceFace features. + core::Ptr replaceFaceFeatures() const; + + /// Returns the collection that provides access to the Move features within the component + /// and supports the creation of new Move features. + core::Ptr moveFeatures() const; + + /// Returns the collection that provides access to the SplitFace features within the component and supports the creation + /// of new SplitFace features + core::Ptr splitFaceFeatures() const; + + /// Returns the collection that provides access to the SplitBody features within the component and supports the creation + /// of new SplitBody features + core::Ptr splitBodyFeatures() const; + + /// Returns the collection that provides access to the Parting Line Split features within the component and supports + /// the creation of new Parting Line Split features + core::Ptr silhouetteSplitFeatures() const; + + /// Returns the collection that provides access to the Offset features within the component + /// and supports the creation of new Offset features. + core::Ptr offsetFeatures() const; + + /// Returns the collection that provides access to the Extend features within the component + /// and supports the creation of new Extend features. + core::Ptr extendFeatures() const; + + /// Returns the collection that provides access to the Stitch features within the component + /// and supports the creation of new Stitch features. + core::Ptr stitchFeatures() const; + + /// Returns the collection that provides access to the Boundary Fill features within the component + /// and supports the creation of new Boundary Fill features. + core::Ptr boundaryFillFeatures() const; + + /// Returns the collection that provides access to the Trim features within the component + /// and supports the creation of new Trim features. + core::Ptr trimFeatures() const; + + /// Returns the collection that provides access to the Thicken features within the component + /// and supports the creation of new Thicken features. + core::Ptr thickenFeatures() const; + + /// Returns the collection that provides access to the Unstitch features within the component + /// and supports the creation of new Unstitch features. + core::Ptr unstitchFeatures() const; + + /// Returns the collection that provides access to the Remove features within the component + /// and supports the creation of new Remove features. + core::Ptr removeFeatures() const; + + /// Returns the collection that provides access to the existing base features + /// and supports the creation of new base features. A base feature represents + /// a body that is non-parametric. + core::Ptr baseFeatures() const; + + /// Returns the collection that provides access to the Coil Primitive features within the component. + core::Ptr coilFeatures() const; + + /// Returns the collection that provides access to the existing box features. + core::Ptr boxFeatures() const; + + /// Returns the collection that provides access to the existing cylinder features. + core::Ptr cylinderFeatures() const; + + /// Returns the collection that provides access to the existing sphere features. + core::Ptr sphereFeatures() const; + + /// Returns the collection that provides access to the existing torus features. + core::Ptr torusFeatures() const; + + /// Returns the collection that provides access to the existing pipe features. + core::Ptr pipeFeatues() const; + + /// Returns the collection that provides access to the existing rib features. + core::Ptr ribFeatures() const; + + /// Returns the collection that provides access to the existing web features. + core::Ptr webFeatures() const; + + /// Returns the collection that provides access to the existing form features. + core::Ptr formFeatures() const; + + /// Returns the collection that provides access to the Reverse Normal features within the component + /// and supports the creation of new Reverse Normal features. + core::Ptr reverseNormalFeatures() const; + + /// Returns the collection that provides access to the Patch features within the component + /// and supports the creation of new Patch features. + core::Ptr patchFeatures() const; + + /// Returns the collection that provides access to the existing loft features and + /// supports the creation of new loft features. + core::Ptr loftFeatures() const; + + /// Returns the collection that provides access to the existing form features. + core::Ptr ruleFilletFeatures() const; + + /// Function that returns the specified feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the same name seen in the timeline. + /// Returns the specified item or null if a feature matching the name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// Returns the collection that provides access to the existing Surface Delete Face features. + core::Ptr surfaceDeleteFaceFeatures() const; + + /// Returns the collection that provides access to the existing Delete Face features. + core::Ptr deleteFaceFeatures() const; + + /// Returns the collection that provides access to the existing Offset Face features. + core::Ptr offsetFacesFeatures() const; + + /// Returns the collection that provides access to the existing copy-paste features + /// and supports the creation of new copy-paste features. + core::Ptr copyPasteBodies() const; + + /// Returns the collection that provides access to the existing cut-paste features + /// and supports the creation of new cut-paste features. + core::Ptr cutPasteBodies() const; + + /// Returns the collection that provides access to the existing flange features. + core::Ptr flangeFeatures() const; + + /// Returns the collection that provides access to the existing unfold features. + core::Ptr unfoldFeatures() const; + + /// Returns the collection that provides access to the existing refold features. + core::Ptr refoldFeatures() const; + + /// Returns the collection that provides access to the Ruled Surface features within the component + /// and supports the creation of new Ruled Surface features. + core::Ptr ruledSurfaceFeatures() const; + + /// Returns the collection that provides access to the custom features within the component + /// and supports the creation of new custom features. + core::Ptr customFeatures() const; + + /// Returns the collection that provides access to the Untrim features within the component + /// and supports the creation of new Untrim features. + core::Ptr untrimFeatures() const; + + typedef Feature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_FEATURES_API static const char* classType(); + ADSK_FUSION_FEATURES_API const char* objectType() const override; + ADSK_FUSION_FEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Feature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual ExtrudeFeatures* extrudeFeatures_raw() const = 0; + virtual RevolveFeatures* revolveFeatures_raw() const = 0; + virtual HoleFeatures* holeFeatures_raw() const = 0; + virtual FilletFeatures* filletFeatures_raw() const = 0; + virtual SweepFeatures* sweepFeatures_raw() const = 0; + virtual ChamferFeatures* chamferFeatures_raw() const = 0; + virtual ShellFeatures* shellFeatures_raw() const = 0; + virtual MirrorFeatures* mirrorFeatures_raw() const = 0; + virtual CircularPatternFeatures* circularPatternFeatures_raw() const = 0; + virtual RectangularPatternFeatures* rectangularPatternFeatures_raw() const = 0; + virtual PathPatternFeatures* pathPatternFeatures_raw() const = 0; + virtual CombineFeatures* combineFeatures_raw() const = 0; + virtual ThreadFeatures* threadFeatures_raw() const = 0; + virtual DraftFeatures* draftFeatures_raw() const = 0; + virtual ScaleFeatures* scaleFeatures_raw() const = 0; + virtual Path* createPath_raw(core::Base* curve, bool isChain) = 0; + virtual ReplaceFaceFeatures* replaceFaceFeatures_raw() const = 0; + virtual MoveFeatures* moveFeatures_raw() const = 0; + virtual SplitFaceFeatures* splitFaceFeatures_raw() const = 0; + virtual SplitBodyFeatures* splitBodyFeatures_raw() const = 0; + virtual SilhouetteSplitFeatures* silhouetteSplitFeatures_raw() const = 0; + virtual OffsetFeatures* offsetFeatures_raw() const = 0; + virtual ExtendFeatures* extendFeatures_raw() const = 0; + virtual StitchFeatures* stitchFeatures_raw() const = 0; + virtual BoundaryFillFeatures* boundaryFillFeatures_raw() const = 0; + virtual TrimFeatures* trimFeatures_raw() const = 0; + virtual ThickenFeatures* thickenFeatures_raw() const = 0; + virtual UnstitchFeatures* unstitchFeatures_raw() const = 0; + virtual RemoveFeatures* removeFeatures_raw() const = 0; + virtual BaseFeatures* baseFeatures_raw() const = 0; + virtual CoilFeatures* coilFeatures_raw() const = 0; + virtual BoxFeatures* boxFeatures_raw() const = 0; + virtual CylinderFeatures* cylinderFeatures_raw() const = 0; + virtual SphereFeatures* sphereFeatures_raw() const = 0; + virtual TorusFeatures* torusFeatures_raw() const = 0; + virtual PipeFeatures* pipeFeatues_raw() const = 0; + virtual RibFeatures* ribFeatures_raw() const = 0; + virtual WebFeatures* webFeatures_raw() const = 0; + virtual FormFeatures* formFeatures_raw() const = 0; + virtual ReverseNormalFeatures* reverseNormalFeatures_raw() const = 0; + virtual PatchFeatures* patchFeatures_raw() const = 0; + virtual LoftFeatures* loftFeatures_raw() const = 0; + virtual RuleFilletFeatures* ruleFilletFeatures_raw() const = 0; + virtual Feature* itemByName_raw(const char * name) const = 0; + virtual SurfaceDeleteFaceFeatures* surfaceDeleteFaceFeatures_raw() const = 0; + virtual DeleteFaceFeatures* deleteFaceFeatures_raw() const = 0; + virtual OffsetFacesFeatures* offsetFacesFeatures_raw() const = 0; + virtual CopyPasteBodies* copyPasteBodies_raw() const = 0; + virtual CutPasteBodies* cutPasteBodies_raw() const = 0; + virtual FlangeFeatures* flangeFeatures_raw() const = 0; + virtual UnfoldFeatures* unfoldFeatures_raw() const = 0; + virtual RefoldFeatures* refoldFeatures_raw() const = 0; + virtual RuledSurfaceFeatures* ruledSurfaceFeatures_raw() const = 0; + virtual CustomFeatures* customFeatures_raw() const = 0; + virtual UntrimFeatures* untrimFeatures_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr Features::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t Features::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr Features::extrudeFeatures() const +{ + core::Ptr res = extrudeFeatures_raw(); + return res; +} + +inline core::Ptr Features::revolveFeatures() const +{ + core::Ptr res = revolveFeatures_raw(); + return res; +} + +inline core::Ptr Features::holeFeatures() const +{ + core::Ptr res = holeFeatures_raw(); + return res; +} + +inline core::Ptr Features::filletFeatures() const +{ + core::Ptr res = filletFeatures_raw(); + return res; +} + +inline core::Ptr Features::sweepFeatures() const +{ + core::Ptr res = sweepFeatures_raw(); + return res; +} + +inline core::Ptr Features::chamferFeatures() const +{ + core::Ptr res = chamferFeatures_raw(); + return res; +} + +inline core::Ptr Features::shellFeatures() const +{ + core::Ptr res = shellFeatures_raw(); + return res; +} + +inline core::Ptr Features::mirrorFeatures() const +{ + core::Ptr res = mirrorFeatures_raw(); + return res; +} + +inline core::Ptr Features::circularPatternFeatures() const +{ + core::Ptr res = circularPatternFeatures_raw(); + return res; +} + +inline core::Ptr Features::rectangularPatternFeatures() const +{ + core::Ptr res = rectangularPatternFeatures_raw(); + return res; +} + +inline core::Ptr Features::pathPatternFeatures() const +{ + core::Ptr res = pathPatternFeatures_raw(); + return res; +} + +inline core::Ptr Features::combineFeatures() const +{ + core::Ptr res = combineFeatures_raw(); + return res; +} + +inline core::Ptr Features::threadFeatures() const +{ + core::Ptr res = threadFeatures_raw(); + return res; +} + +inline core::Ptr Features::draftFeatures() const +{ + core::Ptr res = draftFeatures_raw(); + return res; +} + +inline core::Ptr Features::scaleFeatures() const +{ + core::Ptr res = scaleFeatures_raw(); + return res; +} + +inline core::Ptr Features::createPath(const core::Ptr& curve, bool isChain) +{ + core::Ptr res = createPath_raw(curve.get(), isChain); + return res; +} + +inline core::Ptr Features::replaceFaceFeatures() const +{ + core::Ptr res = replaceFaceFeatures_raw(); + return res; +} + +inline core::Ptr Features::moveFeatures() const +{ + core::Ptr res = moveFeatures_raw(); + return res; +} + +inline core::Ptr Features::splitFaceFeatures() const +{ + core::Ptr res = splitFaceFeatures_raw(); + return res; +} + +inline core::Ptr Features::splitBodyFeatures() const +{ + core::Ptr res = splitBodyFeatures_raw(); + return res; +} + +inline core::Ptr Features::silhouetteSplitFeatures() const +{ + core::Ptr res = silhouetteSplitFeatures_raw(); + return res; +} + +inline core::Ptr Features::offsetFeatures() const +{ + core::Ptr res = offsetFeatures_raw(); + return res; +} + +inline core::Ptr Features::extendFeatures() const +{ + core::Ptr res = extendFeatures_raw(); + return res; +} + +inline core::Ptr Features::stitchFeatures() const +{ + core::Ptr res = stitchFeatures_raw(); + return res; +} + +inline core::Ptr Features::boundaryFillFeatures() const +{ + core::Ptr res = boundaryFillFeatures_raw(); + return res; +} + +inline core::Ptr Features::trimFeatures() const +{ + core::Ptr res = trimFeatures_raw(); + return res; +} + +inline core::Ptr Features::thickenFeatures() const +{ + core::Ptr res = thickenFeatures_raw(); + return res; +} + +inline core::Ptr Features::unstitchFeatures() const +{ + core::Ptr res = unstitchFeatures_raw(); + return res; +} + +inline core::Ptr Features::removeFeatures() const +{ + core::Ptr res = removeFeatures_raw(); + return res; +} + +inline core::Ptr Features::baseFeatures() const +{ + core::Ptr res = baseFeatures_raw(); + return res; +} + +inline core::Ptr Features::coilFeatures() const +{ + core::Ptr res = coilFeatures_raw(); + return res; +} + +inline core::Ptr Features::boxFeatures() const +{ + core::Ptr res = boxFeatures_raw(); + return res; +} + +inline core::Ptr Features::cylinderFeatures() const +{ + core::Ptr res = cylinderFeatures_raw(); + return res; +} + +inline core::Ptr Features::sphereFeatures() const +{ + core::Ptr res = sphereFeatures_raw(); + return res; +} + +inline core::Ptr Features::torusFeatures() const +{ + core::Ptr res = torusFeatures_raw(); + return res; +} + +inline core::Ptr Features::pipeFeatues() const +{ + core::Ptr res = pipeFeatues_raw(); + return res; +} + +inline core::Ptr Features::ribFeatures() const +{ + core::Ptr res = ribFeatures_raw(); + return res; +} + +inline core::Ptr Features::webFeatures() const +{ + core::Ptr res = webFeatures_raw(); + return res; +} + +inline core::Ptr Features::formFeatures() const +{ + core::Ptr res = formFeatures_raw(); + return res; +} + +inline core::Ptr Features::reverseNormalFeatures() const +{ + core::Ptr res = reverseNormalFeatures_raw(); + return res; +} + +inline core::Ptr Features::patchFeatures() const +{ + core::Ptr res = patchFeatures_raw(); + return res; +} + +inline core::Ptr Features::loftFeatures() const +{ + core::Ptr res = loftFeatures_raw(); + return res; +} + +inline core::Ptr Features::ruleFilletFeatures() const +{ + core::Ptr res = ruleFilletFeatures_raw(); + return res; +} + +inline core::Ptr Features::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline core::Ptr Features::surfaceDeleteFaceFeatures() const +{ + core::Ptr res = surfaceDeleteFaceFeatures_raw(); + return res; +} + +inline core::Ptr Features::deleteFaceFeatures() const +{ + core::Ptr res = deleteFaceFeatures_raw(); + return res; +} + +inline core::Ptr Features::offsetFacesFeatures() const +{ + core::Ptr res = offsetFacesFeatures_raw(); + return res; +} + +inline core::Ptr Features::copyPasteBodies() const +{ + core::Ptr res = copyPasteBodies_raw(); + return res; +} + +inline core::Ptr Features::cutPasteBodies() const +{ + core::Ptr res = cutPasteBodies_raw(); + return res; +} + +inline core::Ptr Features::flangeFeatures() const +{ + core::Ptr res = flangeFeatures_raw(); + return res; +} + +inline core::Ptr Features::unfoldFeatures() const +{ + core::Ptr res = unfoldFeatures_raw(); + return res; +} + +inline core::Ptr Features::refoldFeatures() const +{ + core::Ptr res = refoldFeatures_raw(); + return res; +} + +inline core::Ptr Features::ruledSurfaceFeatures() const +{ + core::Ptr res = ruledSurfaceFeatures_raw(); + return res; +} + +inline core::Ptr Features::customFeatures() const +{ + core::Ptr res = customFeatures_raw(); + return res; +} + +inline core::Ptr Features::untrimFeatures() const +{ + core::Ptr res = untrimFeatures_raw(); + return res; +} + +template inline void Features::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/FilletEdgeSet.h b/usr/autodesk/CPP/include/Fusion/Features/FilletEdgeSet.h new file mode 100644 index 0000000..921f62a --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/FilletEdgeSet.h @@ -0,0 +1,96 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FILLETEDGESET_CPP__ +# define ADSK_FUSION_FILLETEDGESET_API XI_EXPORT +# else +# define ADSK_FUSION_FILLETEDGESET_API +# endif +#else +# define ADSK_FUSION_FILLETEDGESET_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// The base class for the classes that define the different types of fillet edge sets. +class FilletEdgeSet : public core::Base { +public: + + /// Gets and sets the Tangent chain for fillet. This enables tangent chain option for fillet. + bool isTangentChain() const; + bool isTangentChain(bool value); + + ADSK_FUSION_FILLETEDGESET_API static const char* classType(); + ADSK_FUSION_FILLETEDGESET_API const char* objectType() const override; + ADSK_FUSION_FILLETEDGESET_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FILLETEDGESET_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool isTangentChain_raw() const = 0; + virtual bool isTangentChain_raw(bool value) = 0; + virtual void placeholderFilletEdgeSet0() {} + virtual void placeholderFilletEdgeSet1() {} + virtual void placeholderFilletEdgeSet2() {} + virtual void placeholderFilletEdgeSet3() {} + virtual void placeholderFilletEdgeSet4() {} + virtual void placeholderFilletEdgeSet5() {} + virtual void placeholderFilletEdgeSet6() {} + virtual void placeholderFilletEdgeSet7() {} + virtual void placeholderFilletEdgeSet8() {} + virtual void placeholderFilletEdgeSet9() {} + virtual void placeholderFilletEdgeSet10() {} + virtual void placeholderFilletEdgeSet11() {} + virtual void placeholderFilletEdgeSet12() {} + virtual void placeholderFilletEdgeSet13() {} + virtual void placeholderFilletEdgeSet14() {} + virtual void placeholderFilletEdgeSet15() {} + virtual void placeholderFilletEdgeSet16() {} + virtual void placeholderFilletEdgeSet17() {} + virtual void placeholderFilletEdgeSet18() {} + virtual void placeholderFilletEdgeSet19() {} + virtual void placeholderFilletEdgeSet20() {} + virtual void placeholderFilletEdgeSet21() {} + virtual void placeholderFilletEdgeSet22() {} + virtual void placeholderFilletEdgeSet23() {} + virtual void placeholderFilletEdgeSet24() {} + virtual void placeholderFilletEdgeSet25() {} + virtual void placeholderFilletEdgeSet26() {} + virtual void placeholderFilletEdgeSet27() {} + virtual void placeholderFilletEdgeSet28() {} + virtual void placeholderFilletEdgeSet29() {} +}; + +// Inline wrappers + +inline bool FilletEdgeSet::isTangentChain() const +{ + bool res = isTangentChain_raw(); + return res; +} + +inline bool FilletEdgeSet::isTangentChain(bool value) +{ + return isTangentChain_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FILLETEDGESET_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/FilletEdgeSets.h b/usr/autodesk/CPP/include/Fusion/Features/FilletEdgeSets.h new file mode 100644 index 0000000..1bf33e0 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/FilletEdgeSets.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FILLETEDGESETS_CPP__ +# define ADSK_FUSION_FILLETEDGESETS_API XI_EXPORT +# else +# define ADSK_FUSION_FILLETEDGESETS_API +# endif +#else +# define ADSK_FUSION_FILLETEDGESETS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class FilletEdgeSet; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing fillet edge sets associated with a fillet feature. +class FilletEdgeSets : public core::Base { +public: + + /// Function that returns the specified fillet edge set using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of fillet edge sets in the collection. + size_t count() const; + + typedef FilletEdgeSet iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_FILLETEDGESETS_API static const char* classType(); + ADSK_FUSION_FILLETEDGESETS_API const char* objectType() const override; + ADSK_FUSION_FILLETEDGESETS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FILLETEDGESETS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual FilletEdgeSet* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr FilletEdgeSets::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t FilletEdgeSets::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void FilletEdgeSets::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FILLETEDGESETS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/FilletFeature.h b/usr/autodesk/CPP/include/Fusion/Features/FilletFeature.h new file mode 100644 index 0000000..655a539 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/FilletFeature.h @@ -0,0 +1,144 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FILLETFEATURE_CPP__ +# define ADSK_FUSION_FILLETFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_FILLETFEATURE_API +# endif +#else +# define ADSK_FUSION_FILLETFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class FilletEdgeSets; + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing fillet feature in a design. +class FilletFeature : public Feature { +public: + + /// Returns the edge sets collection associated with this fillet. + core::Ptr edgeSets() const; + + /// Gets and sets if the fillet uses the G2 (curvature-continuity) surface quality option. + bool isG2() const; + bool isG2(bool value); + + /// Gets and sets if a rolling ball solution is to be used in any corners. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isRollingBallCorner() const; + bool isRollingBallCorner(bool value); + + /// Gets and sets whether or not edges that are tangentially connected to + /// the input edges (if any) will also be filleted. + bool isTangentChain() const; + bool isTangentChain(bool value); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of its parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_FILLETFEATURE_API static const char* classType(); + ADSK_FUSION_FILLETFEATURE_API const char* objectType() const override; + ADSK_FUSION_FILLETFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FILLETFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual FilletEdgeSets* edgeSets_raw() const = 0; + virtual bool isG2_raw() const = 0; + virtual bool isG2_raw(bool value) = 0; + virtual bool isRollingBallCorner_raw() const = 0; + virtual bool isRollingBallCorner_raw(bool value) = 0; + virtual bool isTangentChain_raw() const = 0; + virtual bool isTangentChain_raw(bool value) = 0; + virtual FilletFeature* nativeObject_raw() const = 0; + virtual FilletFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr FilletFeature::edgeSets() const +{ + core::Ptr res = edgeSets_raw(); + return res; +} + +inline bool FilletFeature::isG2() const +{ + bool res = isG2_raw(); + return res; +} + +inline bool FilletFeature::isG2(bool value) +{ + return isG2_raw(value); +} + +inline bool FilletFeature::isRollingBallCorner() const +{ + bool res = isRollingBallCorner_raw(); + return res; +} + +inline bool FilletFeature::isRollingBallCorner(bool value) +{ + return isRollingBallCorner_raw(value); +} + +inline bool FilletFeature::isTangentChain() const +{ + bool res = isTangentChain_raw(); + return res; +} + +inline bool FilletFeature::isTangentChain(bool value) +{ + return isTangentChain_raw(value); +} + +inline core::Ptr FilletFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr FilletFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FILLETFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/FilletFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/FilletFeatureInput.h new file mode 100644 index 0000000..7616595 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/FilletFeatureInput.h @@ -0,0 +1,219 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FILLETFEATUREINPUT_CPP__ +# define ADSK_FUSION_FILLETFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_FILLETFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_FILLETFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a fillet +/// feature. +class FilletFeatureInput : public core::Base { +public: + + /// Adds a set of edges with a constant radius to this input. + /// edges : An ObjectCollection containing the edges to be filleted. If the isTangentChain argument is true + /// additional edges may also get filleted if they are tangentially connected to any of the + /// input edges. + /// radius : A ValueInput object that defines the radius of the fillet. If the ValueInput uses + /// a real then it is interpreted as centimeters. If it is a string then the units + /// can be defined as part of the string (i.e. "2 in") or if no units are specified + /// it is interpreted using the current default units for length. + /// isTangentChain : A boolean value for setting whether or not edges that are tangentially connected to + /// the input edges (if any) will also be filleted. + /// Returns true if the set of edges was successfully added to the FilletFeatureInput. + bool addConstantRadiusEdgeSet(const core::Ptr& edges, const core::Ptr& radius, bool isTangentChain); + + /// Adds a single edge or set of tangent edges along with variable radius information to this input. + /// tangentEdges : An object collection containing a single edge or multiple edges. Multiple edges + /// must be tangentially connected and added to the collection in order. + /// startRadius : A ValueInput object that defines the starting radius of the fillet. If a single edge is + /// being filleted, the start radius is at the start end of the edge. If multiple tangent + /// edges are being filleted the start radius is the open end of the first edge in the + /// collection. + /// If the ValueInput uses a real then it is interpreted as centimeters. If it is a string then + /// the units can be defined as part of the string (i.e. "2 in") or if no units are specified + /// it is interpreted using the current default units for length. + /// endRadius : A ValueInput object that defines the ending radius of the fillet. If a single edge is + /// being filleted, the end radius is at the end of the edge. If multiple tangent + /// edges are being filleted the end radius is the open end of the last edge in the + /// collection. + /// If the ValueInput uses a real then it is interpreted as centimeters. If it is a string then + /// the units can be defined as part of the string (i.e. "2 in") or if no units are specified + /// it is interpreted using the current default units for length. + /// positions : An array of ValueInput objects that defines the positions of any additional radii + /// along the edge(s). The value must be between 0 and 1 and defines the percentage along the + /// curve where a radius is defined. The value is unitless. This array must have the same + /// number of values as the array passed in for the radii argument. + /// radii : An array of ValueInput objects that define the radii at positions along the edge(s). + /// This array must have the same number of values as the array passed in for + /// the positions argument. If the ValueInput uses a real then it is interpreted as centimeters. + /// If it is a string then the units can be defined as part of the string (i.e. "2 in"). + /// If no units are specified it will be interpreted using the current default units for length. + /// Returns true if the edge set was successfully added to the FilletFeatureInput. + bool addVariableRadiusEdgeSet(const core::Ptr& tangentEdges, const core::Ptr& startRadius, const core::Ptr& endRadius, const std::vector>& positions, const std::vector>& radii); + + /// Gets and sets if the fillet uses the G2 (curvature-continuity) surface quality option . + bool isG2() const; + bool isG2(bool value); + + /// Gets and sets if a rolling ball or setback solution is to be used in any corners. + bool isRollingBallCorner() const; + bool isRollingBallCorner(bool value); + + /// Gets and sets if any edges that are tangentially connected to any of filleted + /// edges will also be included in the fillet. + bool isTangentChain() const; + bool isTangentChain(bool value); + + /// Adds a set of edges with a chord length to this input. + /// edges : An ObjectCollection containing the edges to be filleted. If the isTangentChain argument is true + /// additional edges may also get filleted if they are tangentially connected to any of the + /// input edges. + /// chordLength : A ValueInput object that defines the chord length of the fillet. If the ValueInput uses + /// a real then it is interpreted as centimeters. If it is a string then the units + /// can be defined as part of the string (i.e. "2 in") or if no units are specified + /// it is interpreted using the current default units for length. + /// isTangentChain : A boolean value for setting whether or not edges that are tangentially connected to + /// the input edges (if any) will also be filleted. + /// Returns true if the set of edges was successfully added to the FilletFeatureInput. + bool addChordLengthEdgeSet(const core::Ptr& edges, const core::Ptr& chordLength, bool isTangentChain); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_FILLETFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_FILLETFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_FILLETFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FILLETFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool addConstantRadiusEdgeSet_raw(core::ObjectCollection* edges, core::ValueInput* radius, bool isTangentChain) = 0; + virtual bool addVariableRadiusEdgeSet_raw(core::ObjectCollection* tangentEdges, core::ValueInput* startRadius, core::ValueInput* endRadius, core::ValueInput** positions, size_t positions_size, core::ValueInput** radii, size_t radii_size) = 0; + virtual bool isG2_raw() const = 0; + virtual bool isG2_raw(bool value) = 0; + virtual bool isRollingBallCorner_raw() const = 0; + virtual bool isRollingBallCorner_raw(bool value) = 0; + virtual bool isTangentChain_raw() const = 0; + virtual bool isTangentChain_raw(bool value) = 0; + virtual bool addChordLengthEdgeSet_raw(core::ObjectCollection* edges, core::ValueInput* chordLength, bool isTangentChain) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline bool FilletFeatureInput::addConstantRadiusEdgeSet(const core::Ptr& edges, const core::Ptr& radius, bool isTangentChain) +{ + bool res = addConstantRadiusEdgeSet_raw(edges.get(), radius.get(), isTangentChain); + return res; +} + +inline bool FilletFeatureInput::addVariableRadiusEdgeSet(const core::Ptr& tangentEdges, const core::Ptr& startRadius, const core::Ptr& endRadius, const std::vector>& positions, const std::vector>& radii) +{ + core::ValueInput** positions_ = new core::ValueInput*[positions.size()]; + for(size_t i=0; i& edges, const core::Ptr& chordLength, bool isTangentChain) +{ + bool res = addChordLengthEdgeSet_raw(edges.get(), chordLength.get(), isTangentChain); + return res; +} + +inline core::Ptr FilletFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool FilletFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FILLETFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/FilletFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/FilletFeatures.h new file mode 100644 index 0000000..6564c5a --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/FilletFeatures.h @@ -0,0 +1,129 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FILLETFEATURES_CPP__ +# define ADSK_FUSION_FILLETFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_FILLETFEATURES_API +# endif +#else +# define ADSK_FUSION_FILLETFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class FilletFeature; + class FilletFeatureInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing fillet features in a component +/// and supports the ability to create new fillet features. +class FilletFeatures : public core::Base { +public: + + /// Function that returns the specified fillet feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of fillet features in the collection. + size_t count() const; + + /// Creates a FilletFeatureInput object. Use properties and methods on this object + /// to define the fillet you want to create and then use the Add method, passing in + /// the FilletFeatureInput object. + /// Returns the newly created FilletFeatureInput object or null if the creation failed. + core::Ptr createInput() const; + + /// Creates a new fillet feature. + /// input : A FilletFeatureInput object that defines the desired fillet. Use the createInput + /// method to create a new FilletFeatureInput object and then use methods on it + /// (the FilletFeatureInput object) to define the fillet. + /// Returns the newly created FilletFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified fillet feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef FilletFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_FILLETFEATURES_API static const char* classType(); + ADSK_FUSION_FILLETFEATURES_API const char* objectType() const override; + ADSK_FUSION_FILLETFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FILLETFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual FilletFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual FilletFeatureInput* createInput_raw() const = 0; + virtual FilletFeature* add_raw(FilletFeatureInput* input) = 0; + virtual FilletFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr FilletFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t FilletFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr FilletFeatures::createInput() const +{ + core::Ptr res = createInput_raw(); + return res; +} + +inline core::Ptr FilletFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr FilletFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void FilletFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FILLETFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/FlangeFeature.h b/usr/autodesk/CPP/include/Fusion/Features/FlangeFeature.h new file mode 100644 index 0000000..81e4eba --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/FlangeFeature.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FLANGEFEATURE_CPP__ +# define ADSK_FUSION_FLANGEFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_FLANGEFEATURE_API +# endif +#else +# define ADSK_FUSION_FLANGEFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Object that represents an existing flange feature in a design. +class FlangeFeature : public Feature { +public: + + ADSK_FUSION_FLANGEFEATURE_API static const char* classType(); + ADSK_FUSION_FLANGEFEATURE_API const char* objectType() const override; + ADSK_FUSION_FLANGEFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FLANGEFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FLANGEFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/FlangeFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/FlangeFeatures.h new file mode 100644 index 0000000..948d17d --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/FlangeFeatures.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FLANGEFEATURES_CPP__ +# define ADSK_FUSION_FLANGEFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_FLANGEFEATURES_API +# endif +#else +# define ADSK_FUSION_FLANGEFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class FlangeFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing flange features in a design. +class FlangeFeatures : public core::Base { +public: + + /// Function that returns the specified flange feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of flange features in the collection. + size_t count() const; + + /// Function that returns the specified flange feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef FlangeFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_FLANGEFEATURES_API static const char* classType(); + ADSK_FUSION_FLANGEFEATURES_API const char* objectType() const override; + ADSK_FUSION_FLANGEFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FLANGEFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual FlangeFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual FlangeFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr FlangeFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t FlangeFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr FlangeFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void FlangeFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FLANGEFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/FormFeature.h b/usr/autodesk/CPP/include/Fusion/Features/FormFeature.h new file mode 100644 index 0000000..608155f --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/FormFeature.h @@ -0,0 +1,86 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FORMFEATURE_CPP__ +# define ADSK_FUSION_FORMFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_FORMFEATURE_API +# endif +#else +# define ADSK_FUSION_FORMFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class TSplineBodies; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing Form feature in a design. +class FormFeature : public Feature { +public: + + /// Returns a TSplineBodies collection where you can access any existing + /// T-Spline bodies and through it create new T-Spline bodies. + core::Ptr tSplineBodies() const; + + /// Set the user-interface so that the form body is in edit mode. + /// Returns true if successful. + bool startEdit(); + + /// Exits from edit mode in the user-interface. If this form feature in not + /// in edit mode, then nothing happens. + /// Returns true if successful. + bool finishEdit(); + + ADSK_FUSION_FORMFEATURE_API static const char* classType(); + ADSK_FUSION_FORMFEATURE_API const char* objectType() const override; + ADSK_FUSION_FORMFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FORMFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual TSplineBodies* tSplineBodies_raw() const = 0; + virtual bool startEdit_raw() = 0; + virtual bool finishEdit_raw() = 0; +}; + +// Inline wrappers + +inline core::Ptr FormFeature::tSplineBodies() const +{ + core::Ptr res = tSplineBodies_raw(); + return res; +} + +inline bool FormFeature::startEdit() +{ + bool res = startEdit_raw(); + return res; +} + +inline bool FormFeature::finishEdit() +{ + bool res = finishEdit_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FORMFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/FormFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/FormFeatures.h new file mode 100644 index 0000000..0a2dbd8 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/FormFeatures.h @@ -0,0 +1,111 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FORMFEATURES_CPP__ +# define ADSK_FUSION_FORMFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_FORMFEATURES_API +# endif +#else +# define ADSK_FUSION_FORMFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class FormFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing Form features in a component. +class FormFeatures : public core::Base { +public: + + /// Function that returns the specified Form feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified form feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of Form features in the collection. + size_t count() const; + + /// Creates a new empty form feature in the parent component. + /// Returns the new FormFeature or null in the case of an error. + core::Ptr add(); + + typedef FormFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_FORMFEATURES_API static const char* classType(); + ADSK_FUSION_FORMFEATURES_API const char* objectType() const override; + ADSK_FUSION_FORMFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FORMFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual FormFeature* item_raw(size_t index) const = 0; + virtual FormFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual FormFeature* add_raw() = 0; +}; + +// Inline wrappers + +inline core::Ptr FormFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr FormFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t FormFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr FormFeatures::add() +{ + core::Ptr res = add_raw(); + return res; +} + +template inline void FormFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FORMFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/FromEntityStartDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/FromEntityStartDefinition.h new file mode 100644 index 0000000..b12f114 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/FromEntityStartDefinition.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExtentDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FROMENTITYSTARTDEFINITION_CPP__ +# define ADSK_FUSION_FROMENTITYSTARTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_FROMENTITYSTARTDEFINITION_API +# endif +#else +# define ADSK_FUSION_FROMENTITYSTARTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// A definition object that is used to define a feature whose start is defined by a specified construction +/// plane or face. If a face is specified it must be large enough to completely contain the projected profile. +class FromEntityStartDefinition : public ExtentDefinition { +public: + + /// Statically creates a new FromEntityStartDefinition object. This is used as input when + /// create a new feature and defining the starting condition. + /// entity : An input construction plane or face that defines the start of the feature. If a face is specified it + /// must be large enough to completely contain the projected profile. + /// offset : An input ValueInput objects that defines the offset distance from the specified entity. The offset can be positive or + /// negative. A positive value indicates an offset in the same direction as the positive normal direction of the face. + /// Returns the newly created FromEntityStartDefinition or null in the case of a failure. + static core::Ptr create(const core::Ptr& entity, const core::Ptr& offset); + + /// Gets the currently defined offset value. If the FromEntityStartDefinition object was + /// created statically and is not associated with a feature, this will return a ValueInput object. + /// if the FromEntityStartDefinition is associated with an existing feature, this will return + /// the parameter that was created when the feature was created. To edit the offset, use properties + /// on the parameter to change the value of the parameter. + core::Ptr offset() const; + + /// Gets and sets the entity defining the start of the feature. + core::Ptr entity() const; + bool entity(const core::Ptr& value); + + ADSK_FUSION_FROMENTITYSTARTDEFINITION_API static const char* classType(); + ADSK_FUSION_FROMENTITYSTARTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_FROMENTITYSTARTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FROMENTITYSTARTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_FROMENTITYSTARTDEFINITION_API static FromEntityStartDefinition* create_raw(core::Base* entity, core::ValueInput* offset); + virtual core::Base* offset_raw() const = 0; + virtual core::Base* entity_raw() const = 0; + virtual bool entity_raw(core::Base* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr FromEntityStartDefinition::create(const core::Ptr& entity, const core::Ptr& offset) +{ + core::Ptr res = create_raw(entity.get(), offset.get()); + return res; +} + +inline core::Ptr FromEntityStartDefinition::offset() const +{ + core::Ptr res = offset_raw(); + return res; +} + +inline core::Ptr FromEntityStartDefinition::entity() const +{ + core::Ptr res = entity_raw(); + return res; +} + +inline bool FromEntityStartDefinition::entity(const core::Ptr& value) +{ + return entity_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FROMENTITYSTARTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/HoleFeature.h b/usr/autodesk/CPP/include/Fusion/Features/HoleFeature.h new file mode 100644 index 0000000..9bec4fa --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/HoleFeature.h @@ -0,0 +1,516 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_HOLEFEATURE_CPP__ +# define ADSK_FUSION_HOLEFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_HOLEFEATURE_API +# endif +#else +# define ADSK_FUSION_HOLEFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class BRepEdge; + class BRepFaces; + class ExtentDefinition; + class HolePositionDefinition; + class ModelParameter; + class Occurrence; + class SketchPoint; +}} +namespace adsk { namespace core { + class ObjectCollection; + class Point3D; + class ValueInput; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing hole feature in a design. +class HoleFeature : public Feature { +public: + + /// Returns the position of the hole. + core::Ptr position() const; + + /// Returns the direction of the hole. + core::Ptr direction() const; + + /// Returns the current type of hole this feature represents. + HoleTypes holeType() const; + + /// Returns the model parameter controlling the hole diameter. The diameter of + /// the hole can be edited through the returned parameter object. + core::Ptr holeDiameter() const; + + /// Returns the model parameter controlling the angle of the tip of the hole. The tip angle of + /// the hole can be edited through the returned parameter object. + core::Ptr tipAngle() const; + + /// Returns the model parameter controlling the counterbore diameter. + /// This will return null in the case the hole type is not a counterbore. + /// The diameter of the counterbore can be edited through the returned parameter. + core::Ptr counterboreDiameter() const; + + /// Returns the model parameter controlling the counterbore depth. + /// This will return null in the case the hole type is not a counterbore. + /// The depth of the counterbore can be edited through the returned parameter. + core::Ptr counterboreDepth() const; + + /// Returns the model parameter controlling the countersink diameter. + /// This will return null in the case the hole type is not a countersink. + /// The diameter of the countersink can be edited through the returned parameter. + core::Ptr countersinkDiameter() const; + + /// Returns the model parameter controlling the countersink angle. + /// This will return null in the case the hole type is not a countersink. + /// The angle of the countersink can be edited through the returned parameter. + core::Ptr countersinkAngle() const; + + /// Gets and sets if the hole is in the default direction or not. + bool isDefaultDirection() const; + bool isDefaultDirection(bool value); + + /// Calling this method will change the hole to a simple hole. + /// Returns true if changing the hole was successful. + bool setToSimple(); + + /// Calling this method will change the hole to a counterbore hole. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// counterboreDiameter : A ValueInput object that defines the counterbore diameter. If the ValueInput uses + /// a real then it is interpreted as centimeters. If it is a string then the units + /// can be defined as part of the string (i.e. "3 in"). If no units are specified + /// it is interpreted using the current default units for length. + /// counterboreDepth : A ValueInput object that defines the counterbore depth. If the ValueInput uses + /// a real then it is interpreted as centimeters. If it is a string then the units + /// can be defined as part of the string (i.e. "3 in"). If no units are specified + /// it is interpreted using the current default units for length. + /// Returns true if changing the hole was successful. + bool setToCounterbore(const core::Ptr& counterboreDiameter, const core::Ptr& counterboreDepth); + + /// Calling this method will change the hole to a countersink hole. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// countersinkDiameter : A ValueInput object that defines the countersink diameter. If the ValueInput uses + /// a real then it is interpreted as centimeters. If it is a string then the units + /// can be defined as part of the string (i.e. "3 in"). If no units are specified + /// it is interpreted using the current default units for length. + /// countersinkAngle : A ValueInput object that defines the countersink angle. If the ValueInput uses + /// a real then it is interpreted as radians. If it is a string then the units + /// can be defined as part of the string (i.e. "120 deg"). If no units are specified + /// it is interpreted using the current default units for length. + /// Returns true if changing the hole was successful. + bool setToCountersink(const core::Ptr& countersinkDiameter, const core::Ptr& countersinkAngle); + + /// Gets the definition object that is defining the extent of the hole. Modifying the + /// definition object will cause the hole to recompute. The extent type of a hole + /// is currently limited to a distance extent. + core::Ptr extentDefinition() const; + + /// Defines the depth of the hole using a specific distance. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// distance : The depth of the hole. If a real is specified the value is in centimeters. If a string is + /// specified the units are derived from the string. If no units are specified, the default + /// units of the document are used. + /// Returns true if setting the extent was successful. + bool setDistanceExtent(const core::Ptr& distance); + + /// Defines the extent of the hole to be through-all. The direction can be + /// either positive, negative. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// direction : The direction of the hole relative to the normal of the sketch plane. + /// Returns true if successful. + bool setAllExtent(ExtentDirections direction); + + /// Sets the extent of the hole to be from the sketch plane to the specified "to" face. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// toEntity : The entity that defines the "to" extent. The valid types of entities can vary depending on + /// the type of feature this is being used with. For a hole it can be a BRepBody, BRepFace, + /// BRepVertex, ConstructionPlane, or ConstructionPoint. + /// matchShape : Indicates if the hole is not contained on the face that the hole should match + /// the shape of the entity as if it extended beyond it's current boundaries. + /// directionHint : Specifies the direction of the hole. This is only used in the case where there are two possible solutions and the hole can + /// hit the toEntity in either direction. + /// Typically there is only a single solution and the direction is determined automatically. + /// Returns true if successful. + bool setOneSideToExtent(const core::Ptr& toEntity, bool matchShape, const core::Ptr& directionHint = NULL); + + /// Property that returns the faces at the bottom of the hole. This will typically be a single face + /// but could return more than one face in the case where the bottom of the hole is uneven. + core::Ptr endFaces() const; + + /// Property that returns all of the side faces of the hole. + core::Ptr sideFaces() const; + + /// Redefines the position of a the hole using a point. The point can be a vertex on the face + /// or it can be a Point3D object to define any location on the face. If a Point3D object is + /// provided it will be projected onto the plane along the planes normal. The orientation of the + /// hole is defined by the planar face or construction plane. If a vertex is used, the position of + /// the hole is associative to that vertex. If a Point3D object is used the position of the hole + /// is not associative. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// planarEntity : The planar BRepFace or ConstructionPlane object that defines the orientation of the hole. + /// The natural direction of the hole will be opposite the normal of the face or construction plane. + /// point : A Point3D object or vertex that defines the position of the hole. The point will be projected + /// onto the plane along the normal of the plane. + /// Returns true if successful. + bool setPositionByPoint(const core::Ptr& planarEntity, const core::Ptr& point); + + /// Redefines the position of the hole at the center of a circular or elliptical edge of the face. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// planarEntity : The planar BRepFace or ConstructionPlane object that defines the orientation of the hole. + /// The natural direction of the hole will be opposite the normal of the face or construction plane. + /// centerEdge : A circular or elliptical edge whose center point will be the position of the hole. + /// Returns true if successful. + bool setPositionAtCenter(const core::Ptr& planarEntity, const core::Ptr& centerEdge); + + /// Redefines the position and orientation of the hole using a sketch point. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// sketchPoint : The sketch point that defines the position of the hole. The orientation is + /// inferred from the normal of the point's parent sketch. The natural direction will be + /// opposite the normal of the sketch. + /// Returns true if successful. + bool setPositionBySketchPoint(const core::Ptr& sketchPoint); + + /// Redefines the position and orientation of the hole using a set of points. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// sketchPoints : A collection of sketch points that defines the positions of the holes. The orientation is + /// inferred from the normal of the point's parent sketch. The natural direction will be + /// opposite the normal of the sketch. All of the points must be in the same sketch. + /// Returns true if successful. + bool setPositionBySketchPoints(const core::Ptr& sketchPoints); + + /// Redefines the orientation of the hole using a planar face or construction plane. + /// The position of the hole is defined by the distance from one or two edges. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// planarEntity : The planar BRepFace or ConstructionPlane object that defines the orientation of the hole. + /// The natural direction of the hole will be opposite the normal of the face or construction plane. + /// point : A Point3D object that defines the approximate initial position of the hole. The point will be + /// projected onto the plane. This point should be close to the final position of the hole and + /// is used to determine which solution out of several possible solutions should be chosen + /// for the hole location. + /// edgeOne : A linear BRepEdge object that the position of the hole will be measured from. The position + /// of the hole will be measured along a perpendicular from this edge. + /// offsetOne : A ValueInput object that defines the offset distance from edgeOne. If the ValueInput uses + /// a real then it is interpreted as centimeters. If it is a string then the units + /// can be defined as part of the string (i.e. "3 in"). If no units are specified + /// it is interpreted using the current default units for length. + /// edgeTwo : You can optionally define a second edge and offset to specify the position of the hole. If you use a + /// second edge it has the same requirements as the edgeOne argument. If you provide a second edge you + /// must also provide the offsetTwo argument. + /// offsetTwo : If edgeTwo is defined, you must provide this argument which is a ValueInput object that + /// defines the offset from the edgeTwo. If the ValueInput uses a real then it is interpreted + /// as centimeters. If it is a string then the units can be defined as part of the string + /// (i.e. "3 in"). If no units are specified it is interpreted using the current default units + /// for length. + /// Returns true if successful. + bool setPositionByPlaneAndOffsets(const core::Ptr& planarEntity, const core::Ptr& point, const core::Ptr& edgeOne, const core::Ptr& offsetOne, const core::Ptr& edgeTwo = NULL, const core::Ptr& offsetTwo = NULL); + + /// Redefines the position and orientation of the hole to be on the start, end or center of an edge. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// planarEntity : The planar BRepFace or ConstructionPlane object that defines the orientation of the hole + /// and start of the hole. The natural direction of the hole will be opposite the normal of + /// the face or construction plane. + /// edge : The edge to position the hole on. + /// position : The position along the edge to place the hole. + /// Returns true if successful. + bool setPositionOnEdge(const core::Ptr& planarEntity, const core::Ptr& edge, HoleEdgePositions position); + + /// Returns a HolePositionDefinition object that provides access to the information used + /// to define the position of the hole. This returns null in the case where IsParametric + /// is false. + core::Ptr holePositionDefinition() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Gets and sets the list of bodies that will participate in the feature when the operation is a cut or intersection. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + std::vector> participantBodies() const; + bool participantBodies(const std::vector>& value); + + ADSK_FUSION_HOLEFEATURE_API static const char* classType(); + ADSK_FUSION_HOLEFEATURE_API const char* objectType() const override; + ADSK_FUSION_HOLEFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_HOLEFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Point3D* position_raw() const = 0; + virtual core::Vector3D* direction_raw() const = 0; + virtual HoleTypes holeType_raw() const = 0; + virtual ModelParameter* holeDiameter_raw() const = 0; + virtual ModelParameter* tipAngle_raw() const = 0; + virtual ModelParameter* counterboreDiameter_raw() const = 0; + virtual ModelParameter* counterboreDepth_raw() const = 0; + virtual ModelParameter* countersinkDiameter_raw() const = 0; + virtual ModelParameter* countersinkAngle_raw() const = 0; + virtual bool isDefaultDirection_raw() const = 0; + virtual bool isDefaultDirection_raw(bool value) = 0; + virtual bool setToSimple_raw() = 0; + virtual bool setToCounterbore_raw(core::ValueInput* counterboreDiameter, core::ValueInput* counterboreDepth) = 0; + virtual bool setToCountersink_raw(core::ValueInput* countersinkDiameter, core::ValueInput* countersinkAngle) = 0; + virtual ExtentDefinition* extentDefinition_raw() const = 0; + virtual bool setDistanceExtent_raw(core::ValueInput* distance) = 0; + virtual bool setAllExtent_raw(ExtentDirections direction) = 0; + virtual bool setOneSideToExtent_raw(core::Base* toEntity, bool matchShape, core::Vector3D* directionHint) = 0; + virtual BRepFaces* endFaces_raw() const = 0; + virtual BRepFaces* sideFaces_raw() const = 0; + virtual bool setPositionByPoint_raw(core::Base* planarEntity, core::Base* point) = 0; + virtual bool setPositionAtCenter_raw(core::Base* planarEntity, BRepEdge* centerEdge) = 0; + virtual bool setPositionBySketchPoint_raw(SketchPoint* sketchPoint) = 0; + virtual bool setPositionBySketchPoints_raw(core::ObjectCollection* sketchPoints) = 0; + virtual bool setPositionByPlaneAndOffsets_raw(core::Base* planarEntity, core::Point3D* point, BRepEdge* edgeOne, core::ValueInput* offsetOne, BRepEdge* edgeTwo, core::ValueInput* offsetTwo) = 0; + virtual bool setPositionOnEdge_raw(core::Base* planarEntity, BRepEdge* edge, HoleEdgePositions position) = 0; + virtual HolePositionDefinition* holePositionDefinition_raw() const = 0; + virtual HoleFeature* nativeObject_raw() const = 0; + virtual HoleFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual BRepBody** participantBodies_raw(size_t& return_size) const = 0; + virtual bool participantBodies_raw(BRepBody** value, size_t value_size) = 0; +}; + +// Inline wrappers + +inline core::Ptr HoleFeature::position() const +{ + core::Ptr res = position_raw(); + return res; +} + +inline core::Ptr HoleFeature::direction() const +{ + core::Ptr res = direction_raw(); + return res; +} + +inline HoleTypes HoleFeature::holeType() const +{ + HoleTypes res = holeType_raw(); + return res; +} + +inline core::Ptr HoleFeature::holeDiameter() const +{ + core::Ptr res = holeDiameter_raw(); + return res; +} + +inline core::Ptr HoleFeature::tipAngle() const +{ + core::Ptr res = tipAngle_raw(); + return res; +} + +inline core::Ptr HoleFeature::counterboreDiameter() const +{ + core::Ptr res = counterboreDiameter_raw(); + return res; +} + +inline core::Ptr HoleFeature::counterboreDepth() const +{ + core::Ptr res = counterboreDepth_raw(); + return res; +} + +inline core::Ptr HoleFeature::countersinkDiameter() const +{ + core::Ptr res = countersinkDiameter_raw(); + return res; +} + +inline core::Ptr HoleFeature::countersinkAngle() const +{ + core::Ptr res = countersinkAngle_raw(); + return res; +} + +inline bool HoleFeature::isDefaultDirection() const +{ + bool res = isDefaultDirection_raw(); + return res; +} + +inline bool HoleFeature::isDefaultDirection(bool value) +{ + return isDefaultDirection_raw(value); +} + +inline bool HoleFeature::setToSimple() +{ + bool res = setToSimple_raw(); + return res; +} + +inline bool HoleFeature::setToCounterbore(const core::Ptr& counterboreDiameter, const core::Ptr& counterboreDepth) +{ + bool res = setToCounterbore_raw(counterboreDiameter.get(), counterboreDepth.get()); + return res; +} + +inline bool HoleFeature::setToCountersink(const core::Ptr& countersinkDiameter, const core::Ptr& countersinkAngle) +{ + bool res = setToCountersink_raw(countersinkDiameter.get(), countersinkAngle.get()); + return res; +} + +inline core::Ptr HoleFeature::extentDefinition() const +{ + core::Ptr res = extentDefinition_raw(); + return res; +} + +inline bool HoleFeature::setDistanceExtent(const core::Ptr& distance) +{ + bool res = setDistanceExtent_raw(distance.get()); + return res; +} + +inline bool HoleFeature::setAllExtent(ExtentDirections direction) +{ + bool res = setAllExtent_raw(direction); + return res; +} + +inline bool HoleFeature::setOneSideToExtent(const core::Ptr& toEntity, bool matchShape, const core::Ptr& directionHint) +{ + bool res = setOneSideToExtent_raw(toEntity.get(), matchShape, directionHint.get()); + return res; +} + +inline core::Ptr HoleFeature::endFaces() const +{ + core::Ptr res = endFaces_raw(); + return res; +} + +inline core::Ptr HoleFeature::sideFaces() const +{ + core::Ptr res = sideFaces_raw(); + return res; +} + +inline bool HoleFeature::setPositionByPoint(const core::Ptr& planarEntity, const core::Ptr& point) +{ + bool res = setPositionByPoint_raw(planarEntity.get(), point.get()); + return res; +} + +inline bool HoleFeature::setPositionAtCenter(const core::Ptr& planarEntity, const core::Ptr& centerEdge) +{ + bool res = setPositionAtCenter_raw(planarEntity.get(), centerEdge.get()); + return res; +} + +inline bool HoleFeature::setPositionBySketchPoint(const core::Ptr& sketchPoint) +{ + bool res = setPositionBySketchPoint_raw(sketchPoint.get()); + return res; +} + +inline bool HoleFeature::setPositionBySketchPoints(const core::Ptr& sketchPoints) +{ + bool res = setPositionBySketchPoints_raw(sketchPoints.get()); + return res; +} + +inline bool HoleFeature::setPositionByPlaneAndOffsets(const core::Ptr& planarEntity, const core::Ptr& point, const core::Ptr& edgeOne, const core::Ptr& offsetOne, const core::Ptr& edgeTwo, const core::Ptr& offsetTwo) +{ + bool res = setPositionByPlaneAndOffsets_raw(planarEntity.get(), point.get(), edgeOne.get(), offsetOne.get(), edgeTwo.get(), offsetTwo.get()); + return res; +} + +inline bool HoleFeature::setPositionOnEdge(const core::Ptr& planarEntity, const core::Ptr& edge, HoleEdgePositions position) +{ + bool res = setPositionOnEdge_raw(planarEntity.get(), edge.get(), position); + return res; +} + +inline core::Ptr HoleFeature::holePositionDefinition() const +{ + core::Ptr res = holePositionDefinition_raw(); + return res; +} + +inline core::Ptr HoleFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr HoleFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline std::vector> HoleFeature::participantBodies() const +{ + std::vector> res; + size_t s; + + BRepBody** p= participantBodies_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool HoleFeature::participantBodies(const std::vector>& value) +{ + BRepBody** value_ = new BRepBody*[value.size()]; + for(size_t i=0; i + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_HOLEFEATUREINPUT_CPP__ +# define ADSK_FUSION_HOLEFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_HOLEFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_HOLEFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class BRepBody; + class BRepEdge; + class Occurrence; + class SketchPoint; +}} +namespace adsk { namespace core { + class ObjectCollection; + class Point3D; + class ValueInput; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a hole +/// feature. +class HoleFeatureInput : public core::Base { +public: + + /// Defines the position of a the hole using a point. The point can be a vertex on the face + /// or it can be a Point3D object to define any location on the face. If a Point3D object is + /// provided it will be projected onto the plane along the planes normal. The orientation of the + /// hole is defined by the planar face or construction plane. If a vertex is used, the position of + /// the hole is associative to that vertex. If a Point3D object is used the position of the hole + /// is not associative. + /// planarEntity : The planar BRepFace or ConstructionPlane object that defines the orientation of the hole. + /// The natural direction of the hole will be opposite the normal of the face or construction plane. + /// point : A Point3D object or vertex that defines the position of the hole. The point will be projected + /// onto the plane along the normal of the plane. + /// Returns true if successful. + bool setPositionByPoint(const core::Ptr& planarEntity, const core::Ptr& point); + + /// Defines the position of the hole at the center of a circular or elliptical edge of the face. + /// planarEntity : The planar BRepFace or ConstructionPlane object that defines the orientation of the hole. + /// The natural direction of the hole will be opposite the normal of the face or construction plane. + /// centerEdge : A circular or elliptical edge whose center point will be the position of the hole. + /// Returns true if successful. + bool setPositionAtCenter(const core::Ptr& planarEntity, const core::Ptr& centerEdge); + + /// Defines the position and orientation of the hole using a sketch point. + /// sketchPoint : The sketch point that defines the position of the hole. The orientation is + /// inferred from the normal of the point's parent sketch. The natural direction will be + /// opposite the normal of the sketch. + /// Returns true if successful. + bool setPositionBySketchPoint(const core::Ptr& sketchPoint); + + /// Defines the orientation of the hole using a planar face or construction plane. + /// The position of the hole is defined by the distance from one or two edges. + /// planarEntity : The planar BRepFace or ConstructionPlane object that defines the orientation of the hole. + /// The natural direction of the hole will be opposite the normal of the face or construction plane. + /// point : A Point3D object that defines the approximate initial position of the hole. The point will be + /// projected onto the plane. This point should be close to the final position of the hole and + /// is used to determine which solution out of several possible solutions should be chosen + /// for the hole location. + /// edgeOne : A linear BRepEdge object that the position of the hole will be measured from. The position + /// of the hole will be measured along a perpendicular from this edge. + /// offsetOne : A ValueInput object that defines the offset distance from edgeOne. If the ValueInput uses + /// a real then it is interpreted as centimeters. If it is a string then the units + /// can be defined as part of the string (i.e. "3 in"). If no units are specified + /// it is interpreted using the current default units for length. + /// edgeTwo : You can optionally define a second edge and offset to specify the position of the hole. If you use a + /// second edge it has the same requirements as the edgeOne argument. If you provide a second edge you + /// must also provide the offsetTwo argument. + /// offsetTwo : If edgeTwo is defined, you must provide this argument which is a ValueInput object that + /// defines the offset from the edgeTwo. If the ValueInput uses a real then it is interpreted + /// as centimeters. If it is a string then the units can be defined as part of the string + /// (i.e. "3 in"). If no units are specified it is interpreted using the current default units + /// for length. + /// Returns true if successful. + bool setPositionByPlaneAndOffsets(const core::Ptr& planarEntity, const core::Ptr& point, const core::Ptr& edgeOne, const core::Ptr& offsetOne, const core::Ptr& edgeTwo = NULL, const core::Ptr& offsetTwo = NULL); + + /// Defines the position and orientation of the hole to be on the start, end or center of an edge. + /// planarEntity : The planar BRepFace or ConstructionPlane object that defines the orientation of the hole + /// and start of the hole. The natural direction of the hole will be opposite the normal of + /// the face or construction plane. + /// edge : The edge to position the hole on. + /// position : The position along the edge to place the hole. + /// Returns true if successful. + bool setPositionOnEdge(const core::Ptr& planarEntity, const core::Ptr& edge, HoleEdgePositions position); + + /// Gets the ValueInput object that defines the angle of the tip of the hole. The default + /// is "118.0 deg" but can be modified by setting it using another Value object. + core::Ptr tipAngle() const; + bool tipAngle(const core::Ptr& value); + + /// Gets or sets if the hole goes in the default direction or is reversed. + bool isDefaultDirection() const; + bool isDefaultDirection(bool value); + + /// Defines the depth of the hole using a specified distance. + /// distance : The depth of the hole. If a real is specified the value is in centimeters. + /// If a string is specified the units are derived from the string. If no units are specified, + /// the default units of the document are used. + /// Returns true if setting the extent was successful. + bool setDistanceExtent(const core::Ptr& distance); + + /// Defines the extent of the hole to be through-all. The direction can be + /// either positive, negative. + /// direction : The direction of the hole relative to the normal of the sketch plane. + /// Returns true if successful. + bool setAllExtent(ExtentDirections direction); + + /// Sets the extent of the hole to be from the sketch plane to the specified "to" face. + /// toEntity : The entity that defines the "to" extent. The valid types of entities can vary depending on + /// the type of feature this is being used with. For a hole it can be a BRepBody, BRepFace, + /// BRepVertex, ConstructionPlane, or ConstructionPoint. + /// matchShape : Indicates if the hole is not contained on the face that the hole should match + /// the shape of the entity as if it extended beyond it's current boundaries. + /// directionHint : Specifies the direction of the hole. This is only used in the case where there are two possible solutions and the hole can + /// hit the toEntity in either direction. + /// Typically there is only a single solution and the direction is determined automatically. + /// Returns true if successful. + bool setOneSideToExtent(const core::Ptr& toEntity, bool matchShape, const core::Ptr& directionHint = NULL); + + /// In order for geometry to be transformed correctly, an Occurrence for creation needs to be + /// specified when the Hole is created based on geometry (e.g. a face or point) + /// in another component AND (the Hole) is not in the root component. + /// The CreationOccurrence is analogous to the active occurrence in the UI + /// A value of null indicates that everything is in the context of a single component. + core::Ptr creationOccurrence() const; + bool creationOccurrence(const core::Ptr& value); + + /// Defines the position and orientation of the hole using a set of sketch points. + /// sketchPoints : A collection of sketch points that defines the positions of the holes. The orientation is + /// inferred from the normal of the point's parent sketch. The natural direction will be + /// opposite the normal of the sketch. The points can be from multiple sketches but they + /// must all be co-planar. + /// Returns true if successful. + bool setPositionBySketchPoints(const core::Ptr& sketchPoints); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + /// Gets and sets the list of bodies that will participate in the hole. + /// If this property has not been set, the default behavior is that all bodies that are intersected by the + /// hole will participate. + /// This property can return null in the case where the feature has not been fully defined so that + /// possible intersecting bodies can be computed. + std::vector> participantBodies() const; + bool participantBodies(const std::vector>& value); + + ADSK_FUSION_HOLEFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_HOLEFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_HOLEFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_HOLEFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool setPositionByPoint_raw(core::Base* planarEntity, core::Base* point) = 0; + virtual bool setPositionAtCenter_raw(core::Base* planarEntity, BRepEdge* centerEdge) = 0; + virtual bool setPositionBySketchPoint_raw(SketchPoint* sketchPoint) = 0; + virtual bool setPositionByPlaneAndOffsets_raw(core::Base* planarEntity, core::Point3D* point, BRepEdge* edgeOne, core::ValueInput* offsetOne, BRepEdge* edgeTwo, core::ValueInput* offsetTwo) = 0; + virtual bool setPositionOnEdge_raw(core::Base* planarEntity, BRepEdge* edge, HoleEdgePositions position) = 0; + virtual core::ValueInput* tipAngle_raw() const = 0; + virtual bool tipAngle_raw(core::ValueInput* value) = 0; + virtual bool isDefaultDirection_raw() const = 0; + virtual bool isDefaultDirection_raw(bool value) = 0; + virtual bool setDistanceExtent_raw(core::ValueInput* distance) = 0; + virtual bool setAllExtent_raw(ExtentDirections direction) = 0; + virtual bool setOneSideToExtent_raw(core::Base* toEntity, bool matchShape, core::Vector3D* directionHint) = 0; + virtual Occurrence* creationOccurrence_raw() const = 0; + virtual bool creationOccurrence_raw(Occurrence* value) = 0; + virtual bool setPositionBySketchPoints_raw(core::ObjectCollection* sketchPoints) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; + virtual BRepBody** participantBodies_raw(size_t& return_size) const = 0; + virtual bool participantBodies_raw(BRepBody** value, size_t value_size) = 0; +}; + +// Inline wrappers + +inline bool HoleFeatureInput::setPositionByPoint(const core::Ptr& planarEntity, const core::Ptr& point) +{ + bool res = setPositionByPoint_raw(planarEntity.get(), point.get()); + return res; +} + +inline bool HoleFeatureInput::setPositionAtCenter(const core::Ptr& planarEntity, const core::Ptr& centerEdge) +{ + bool res = setPositionAtCenter_raw(planarEntity.get(), centerEdge.get()); + return res; +} + +inline bool HoleFeatureInput::setPositionBySketchPoint(const core::Ptr& sketchPoint) +{ + bool res = setPositionBySketchPoint_raw(sketchPoint.get()); + return res; +} + +inline bool HoleFeatureInput::setPositionByPlaneAndOffsets(const core::Ptr& planarEntity, const core::Ptr& point, const core::Ptr& edgeOne, const core::Ptr& offsetOne, const core::Ptr& edgeTwo, const core::Ptr& offsetTwo) +{ + bool res = setPositionByPlaneAndOffsets_raw(planarEntity.get(), point.get(), edgeOne.get(), offsetOne.get(), edgeTwo.get(), offsetTwo.get()); + return res; +} + +inline bool HoleFeatureInput::setPositionOnEdge(const core::Ptr& planarEntity, const core::Ptr& edge, HoleEdgePositions position) +{ + bool res = setPositionOnEdge_raw(planarEntity.get(), edge.get(), position); + return res; +} + +inline core::Ptr HoleFeatureInput::tipAngle() const +{ + core::Ptr res = tipAngle_raw(); + return res; +} + +inline bool HoleFeatureInput::tipAngle(const core::Ptr& value) +{ + return tipAngle_raw(value.get()); +} + +inline bool HoleFeatureInput::isDefaultDirection() const +{ + bool res = isDefaultDirection_raw(); + return res; +} + +inline bool HoleFeatureInput::isDefaultDirection(bool value) +{ + return isDefaultDirection_raw(value); +} + +inline bool HoleFeatureInput::setDistanceExtent(const core::Ptr& distance) +{ + bool res = setDistanceExtent_raw(distance.get()); + return res; +} + +inline bool HoleFeatureInput::setAllExtent(ExtentDirections direction) +{ + bool res = setAllExtent_raw(direction); + return res; +} + +inline bool HoleFeatureInput::setOneSideToExtent(const core::Ptr& toEntity, bool matchShape, const core::Ptr& directionHint) +{ + bool res = setOneSideToExtent_raw(toEntity.get(), matchShape, directionHint.get()); + return res; +} + +inline core::Ptr HoleFeatureInput::creationOccurrence() const +{ + core::Ptr res = creationOccurrence_raw(); + return res; +} + +inline bool HoleFeatureInput::creationOccurrence(const core::Ptr& value) +{ + return creationOccurrence_raw(value.get()); +} + +inline bool HoleFeatureInput::setPositionBySketchPoints(const core::Ptr& sketchPoints) +{ + bool res = setPositionBySketchPoints_raw(sketchPoints.get()); + return res; +} + +inline core::Ptr HoleFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool HoleFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} + +inline std::vector> HoleFeatureInput::participantBodies() const +{ + std::vector> res; + size_t s; + + BRepBody** p= participantBodies_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool HoleFeatureInput::participantBodies(const std::vector>& value) +{ + BRepBody** value_ = new BRepBody*[value.size()]; + for(size_t i=0; i + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_HOLEFEATURES_CPP__ +# define ADSK_FUSION_HOLEFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_HOLEFEATURES_API +# endif +#else +# define ADSK_FUSION_HOLEFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class HoleFeature; + class HoleFeatureInput; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing hole features in a component +/// and supports the ability to create new hole features. +class HoleFeatures : public core::Base { +public: + + /// Function that returns the specified hole feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of hole features in the collection. + size_t count() const; + + /// Creates a HoleFeatureInput object that defines a simple hole (a single diameter). + /// This is not a hole feature, but an object used to create a hole feature. Functionality + /// on the returned HoleFeatureInput object is used to define the position and extent + /// of the hole. + /// holeDiameter : A ValueInput object that defines the diameter of the hole. If the ValueInput uses + /// a real, it is interpreted as centimeters. If it is a string, the units + /// can be defined as part of the string (i.e. "3 in") If no units are specified, + /// it is interpreted using the current default units for length. + /// Returns the newly created HoleFeatureInput object or null if the creation failed. + core::Ptr createSimpleInput(const core::Ptr& holeDiameter) const; + + /// Creates a HoleFeatureInput object that defines a counterbore hole. This is not + /// a hole feature but an object used to create a hole feature. Functionality + /// on the returned HoleFeatureInput object is used to define the position and extent + /// of the hole. + /// holeDiameter : A ValueInput object that defines the diameter of the hole. If the ValueInput uses + /// a real, it is interpreted as centimeters. If it is a string, the units + /// can be defined as part of the string (i.e. "3 in") If no units are specified, + /// it is interpreted using the current default units for length. + /// counterboreDiameter : A ValueInput object that defines the counterbore diameter of the hole. If the ValueInput uses + /// a real, it is interpreted as centimeters. If it is a string, the units + /// can be defined as part of the string (i.e. "3 in") If no units are specified, + /// it is interpreted using the current default units for length. + /// counterboreDepth : A ValueInput object that defines the counterbore depth of the hole. If the ValueInput uses + /// a real, it is interpreted as centimeters. If it is a string, the units + /// can be defined as part of the string (i.e. "3 in") If no units are specified, + /// it is interpreted using the current default units for length. + /// Returns the newly created HoleFeatureInput object or null if the creation failed. + core::Ptr createCounterboreInput(const core::Ptr& holeDiameter, const core::Ptr& counterboreDiameter, const core::Ptr& counterboreDepth) const; + + /// Creates a HoleFeatureInput object that defines a countersink hole. This is not + /// a hole feature but an object used to create a hole feature. Functionality + /// on the returned HoleFeatureInput object is used to define the position and extent of the hole. + /// holeDiameter : A ValueInput object that defines the diameter of the hole. If the ValueInput uses + /// a real, it is interpreted as centimeters. If it is a string, the units + /// can be defined as part of the string (i.e. "3 in") If no units are specified, + /// it is interpreted using the current default units for length. + /// countersinkDiameter : A ValueInput object that defines the diameter of the countersink. If the ValueInput uses + /// a real, it is interpreted as centimeters. If it is a string, the units + /// can be defined as part of the string (i.e. "3 in") If no units are specified, + /// it is interpreted using the current default units for length. + /// countersinkAngle : A ValueInput object that defines the angle of the countersink. If the ValueInput uses + /// a real then it is interpreted as radians. If it is a string then the units + /// can be defined as part of the string (i.e. "120 deg"). If no units are specified + /// it is interpreted using the current default units for angles. + /// Returns the newly created HoleFeatureInput object or null if the creation failed. + core::Ptr createCountersinkInput(const core::Ptr& holeDiameter, const core::Ptr& countersinkDiameter, const core::Ptr& countersinkAngle) const; + + /// Creates a new hole feature based on the information provided by a HoleFeatureInput object. + /// To create a new hole, use one of the createInput functions to define a new input object for + /// the type of hole you want to create. Use the methods and properties on the input object + /// to define any additional input. Once the information is defined on the input object, you + /// can pass it to the Add method to create the hole. + /// input : The HoleFeatureInput object that defines the hole you want to create. + /// Returns the newly created HoleFeature or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified hole feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef HoleFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_HOLEFEATURES_API static const char* classType(); + ADSK_FUSION_HOLEFEATURES_API const char* objectType() const override; + ADSK_FUSION_HOLEFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_HOLEFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual HoleFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual HoleFeatureInput* createSimpleInput_raw(core::ValueInput* holeDiameter) const = 0; + virtual HoleFeatureInput* createCounterboreInput_raw(core::ValueInput* holeDiameter, core::ValueInput* counterboreDiameter, core::ValueInput* counterboreDepth) const = 0; + virtual HoleFeatureInput* createCountersinkInput_raw(core::ValueInput* holeDiameter, core::ValueInput* countersinkDiameter, core::ValueInput* countersinkAngle) const = 0; + virtual HoleFeature* add_raw(HoleFeatureInput* input) = 0; + virtual HoleFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr HoleFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t HoleFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr HoleFeatures::createSimpleInput(const core::Ptr& holeDiameter) const +{ + core::Ptr res = createSimpleInput_raw(holeDiameter.get()); + return res; +} + +inline core::Ptr HoleFeatures::createCounterboreInput(const core::Ptr& holeDiameter, const core::Ptr& counterboreDiameter, const core::Ptr& counterboreDepth) const +{ + core::Ptr res = createCounterboreInput_raw(holeDiameter.get(), counterboreDiameter.get(), counterboreDepth.get()); + return res; +} + +inline core::Ptr HoleFeatures::createCountersinkInput(const core::Ptr& holeDiameter, const core::Ptr& countersinkDiameter, const core::Ptr& countersinkAngle) const +{ + core::Ptr res = createCountersinkInput_raw(holeDiameter.get(), countersinkDiameter.get(), countersinkAngle.get()); + return res; +} + +inline core::Ptr HoleFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr HoleFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void HoleFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_HOLEFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/HolePositionDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/HolePositionDefinition.h new file mode 100644 index 0000000..11e86fc --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/HolePositionDefinition.h @@ -0,0 +1,81 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_HOLEPOSITIONDEFINITION_CPP__ +# define ADSK_FUSION_HOLEPOSITIONDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_HOLEPOSITIONDEFINITION_API +# endif +#else +# define ADSK_FUSION_HOLEPOSITIONDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// The base class for the classes that define how a hole can be positioned. +class HolePositionDefinition : public core::Base { +public: + + ADSK_FUSION_HOLEPOSITIONDEFINITION_API static const char* classType(); + ADSK_FUSION_HOLEPOSITIONDEFINITION_API const char* objectType() const override; + ADSK_FUSION_HOLEPOSITIONDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_HOLEPOSITIONDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual void placeholderHolePositionDefinition0() {} + virtual void placeholderHolePositionDefinition1() {} + virtual void placeholderHolePositionDefinition2() {} + virtual void placeholderHolePositionDefinition3() {} + virtual void placeholderHolePositionDefinition4() {} + virtual void placeholderHolePositionDefinition5() {} + virtual void placeholderHolePositionDefinition6() {} + virtual void placeholderHolePositionDefinition7() {} + virtual void placeholderHolePositionDefinition8() {} + virtual void placeholderHolePositionDefinition9() {} + virtual void placeholderHolePositionDefinition10() {} + virtual void placeholderHolePositionDefinition11() {} + virtual void placeholderHolePositionDefinition12() {} + virtual void placeholderHolePositionDefinition13() {} + virtual void placeholderHolePositionDefinition14() {} + virtual void placeholderHolePositionDefinition15() {} + virtual void placeholderHolePositionDefinition16() {} + virtual void placeholderHolePositionDefinition17() {} + virtual void placeholderHolePositionDefinition18() {} + virtual void placeholderHolePositionDefinition19() {} + virtual void placeholderHolePositionDefinition20() {} + virtual void placeholderHolePositionDefinition21() {} + virtual void placeholderHolePositionDefinition22() {} + virtual void placeholderHolePositionDefinition23() {} + virtual void placeholderHolePositionDefinition24() {} + virtual void placeholderHolePositionDefinition25() {} + virtual void placeholderHolePositionDefinition26() {} + virtual void placeholderHolePositionDefinition27() {} + virtual void placeholderHolePositionDefinition28() {} + virtual void placeholderHolePositionDefinition29() {} + virtual void placeholderHolePositionDefinition30() {} + virtual void placeholderHolePositionDefinition31() {} +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_HOLEPOSITIONDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/LoftCenterLineOrRail.h b/usr/autodesk/CPP/include/Fusion/Features/LoftCenterLineOrRail.h new file mode 100644 index 0000000..f8691dd --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/LoftCenterLineOrRail.h @@ -0,0 +1,92 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_LOFTCENTERLINEORRAIL_CPP__ +# define ADSK_FUSION_LOFTCENTERLINEORRAIL_API XI_EXPORT +# else +# define ADSK_FUSION_LOFTCENTERLINEORRAIL_API +# endif +#else +# define ADSK_FUSION_LOFTCENTERLINEORRAIL_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Represent a centerline or a single rail used by a loft feature. +class LoftCenterLineOrRail : public core::Base { +public: + + /// Indicates if this object is a loft centerline (true) or a rail (false). + bool isCenterLine() const; + + /// Gets and sets the entity that defines the centerline or rail. This can be a single sketch entity, + /// a single BRepEdge, a Path, or a Profile. + /// If this LoftCenterLineOrRail object is associated with a created feature, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr entity() const; + bool entity(const core::Ptr& value); + + /// Deletes the centerline or rail. + /// If this LoftCenterLineOrRail object is associated with a created feature, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// Returns true if the operation was successful. + bool deleteMe(); + + ADSK_FUSION_LOFTCENTERLINEORRAIL_API static const char* classType(); + ADSK_FUSION_LOFTCENTERLINEORRAIL_API const char* objectType() const override; + ADSK_FUSION_LOFTCENTERLINEORRAIL_API void* queryInterface(const char* id) const override; + ADSK_FUSION_LOFTCENTERLINEORRAIL_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool isCenterLine_raw() const = 0; + virtual core::Base* entity_raw() const = 0; + virtual bool entity_raw(core::Base* value) = 0; + virtual bool deleteMe_raw() = 0; +}; + +// Inline wrappers + +inline bool LoftCenterLineOrRail::isCenterLine() const +{ + bool res = isCenterLine_raw(); + return res; +} + +inline core::Ptr LoftCenterLineOrRail::entity() const +{ + core::Ptr res = entity_raw(); + return res; +} + +inline bool LoftCenterLineOrRail::entity(const core::Ptr& value) +{ + return entity_raw(value.get()); +} + +inline bool LoftCenterLineOrRail::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_LOFTCENTERLINEORRAIL_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/LoftCenterLineOrRails.h b/usr/autodesk/CPP/include/Fusion/Features/LoftCenterLineOrRails.h new file mode 100644 index 0000000..eedb419 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/LoftCenterLineOrRails.h @@ -0,0 +1,117 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_LOFTCENTERLINEORRAILS_CPP__ +# define ADSK_FUSION_LOFTCENTERLINEORRAILS_API XI_EXPORT +# else +# define ADSK_FUSION_LOFTCENTERLINEORRAILS_API +# endif +#else +# define ADSK_FUSION_LOFTCENTERLINEORRAILS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class LoftCenterLineOrRail; +}} + +namespace adsk { namespace fusion { + +/// Defines a single centerline or one or more rails for a loft feature. +class LoftCenterLineOrRails : public core::Base { +public: + + /// The number of centerlines or rails in the collection. + size_t count() const; + + /// Function that returns the specified LoftCenterLineOrRail using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(int index) const; + + /// Indicates if a centerline or rails are currently defined. + bool isCenterLine() const; + + /// Adds a centerline. A single centerline can be defined for a loft. If a centerline or rails have already + /// been defined, they will be removed and the input will become the new single centerline. + /// If this LoftCenterLineOrRails object is associated with a created feature, + /// entity : The entity that defines the center line. This can be a single sketch curve, a single BRepEdge, a Path consisting of + /// connected B-Rep edges or sketch curves. + /// Returns the new LoftCenterLineOrRail object or null in the case of a failure. + core::Ptr addCenterLine(const core::Ptr& entity); + + /// Add a rail to the loft definition. Multiple rails can be defined, so each call of this + /// method adds a new rail. + /// If this LoftCenterLineOrRails object is associated with a created feature, you need to position the timeline + /// marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// entity : The entity that defines the rail. This can be a single sketch curve, a single BRepEdge, or a Path consisting of + /// connected B-Rep edges or sketch curves. + /// Returns the new LoftCenterLineOrRail object or null in the case of a failure. + core::Ptr addRail(const core::Ptr& entity); + + ADSK_FUSION_LOFTCENTERLINEORRAILS_API static const char* classType(); + ADSK_FUSION_LOFTCENTERLINEORRAILS_API const char* objectType() const override; + ADSK_FUSION_LOFTCENTERLINEORRAILS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_LOFTCENTERLINEORRAILS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual size_t count_raw() const = 0; + virtual LoftCenterLineOrRail* item_raw(int index) const = 0; + virtual bool isCenterLine_raw() const = 0; + virtual LoftCenterLineOrRail* addCenterLine_raw(core::Base* entity) = 0; + virtual LoftCenterLineOrRail* addRail_raw(core::Base* entity) = 0; +}; + +// Inline wrappers + +inline size_t LoftCenterLineOrRails::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr LoftCenterLineOrRails::item(int index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline bool LoftCenterLineOrRails::isCenterLine() const +{ + bool res = isCenterLine_raw(); + return res; +} + +inline core::Ptr LoftCenterLineOrRails::addCenterLine(const core::Ptr& entity) +{ + core::Ptr res = addCenterLine_raw(entity.get()); + return res; +} + +inline core::Ptr LoftCenterLineOrRails::addRail(const core::Ptr& entity) +{ + core::Ptr res = addRail_raw(entity.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_LOFTCENTERLINEORRAILS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/LoftDirectionEndCondition.h b/usr/autodesk/CPP/include/Fusion/Features/LoftDirectionEndCondition.h new file mode 100644 index 0000000..bd28e6c --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/LoftDirectionEndCondition.h @@ -0,0 +1,76 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "LoftEndCondition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_LOFTDIRECTIONENDCONDITION_CPP__ +# define ADSK_FUSION_LOFTDIRECTIONENDCONDITION_API XI_EXPORT +# else +# define ADSK_FUSION_LOFTDIRECTIONENDCONDITION_API +# endif +#else +# define ADSK_FUSION_LOFTDIRECTIONENDCONDITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Represents a "Direction" loft end condition. +class LoftDirectionEndCondition : public LoftEndCondition { +public: + + /// Gets the valueInput or Parameter that defines the angle of the direction of the loft. + /// If this object was obtained from a LoftFeatureInput object then this will return a + /// valueInput object with the initial value provided. If this object was obtained from + /// an exiting LoftFeature then it returns a Parameter. In the case of a parameter, to change the angle, + /// edit the value of the associated parameter. + core::Ptr angle() const; + + /// Gets the valueInput or Parameter that defines the weight of the loft. + /// If this object was obtained from a LoftFeatureInput object then this will return a + /// valueInput object with the initial value provided. If this object was obtained from + /// an exiting LoftFeature then it returns a Parameter. In the case of a parameter, to change the weight, + /// edit the value of the associated parameter. + core::Ptr weight() const; + + ADSK_FUSION_LOFTDIRECTIONENDCONDITION_API static const char* classType(); + ADSK_FUSION_LOFTDIRECTIONENDCONDITION_API const char* objectType() const override; + ADSK_FUSION_LOFTDIRECTIONENDCONDITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_LOFTDIRECTIONENDCONDITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* angle_raw() const = 0; + virtual core::Base* weight_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr LoftDirectionEndCondition::angle() const +{ + core::Ptr res = angle_raw(); + return res; +} + +inline core::Ptr LoftDirectionEndCondition::weight() const +{ + core::Ptr res = weight_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_LOFTDIRECTIONENDCONDITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/LoftEndCondition.h b/usr/autodesk/CPP/include/Fusion/Features/LoftEndCondition.h new file mode 100644 index 0000000..0814c45 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/LoftEndCondition.h @@ -0,0 +1,78 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_LOFTENDCONDITION_CPP__ +# define ADSK_FUSION_LOFTENDCONDITION_API XI_EXPORT +# else +# define ADSK_FUSION_LOFTENDCONDITION_API +# endif +#else +# define ADSK_FUSION_LOFTENDCONDITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class LoftSection; +}} + +namespace adsk { namespace fusion { + +/// The base class for all loft end conditions. +class LoftEndCondition : public core::Base { +public: + + /// Returns the parent loft section. + core::Ptr parentLoftSection() const; + + ADSK_FUSION_LOFTENDCONDITION_API static const char* classType(); + ADSK_FUSION_LOFTENDCONDITION_API const char* objectType() const override; + ADSK_FUSION_LOFTENDCONDITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_LOFTENDCONDITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual LoftSection* parentLoftSection_raw() const = 0; + virtual void placeholderLoftEndCondition0() {} + virtual void placeholderLoftEndCondition1() {} + virtual void placeholderLoftEndCondition2() {} + virtual void placeholderLoftEndCondition3() {} + virtual void placeholderLoftEndCondition4() {} + virtual void placeholderLoftEndCondition5() {} + virtual void placeholderLoftEndCondition6() {} + virtual void placeholderLoftEndCondition7() {} + virtual void placeholderLoftEndCondition8() {} + virtual void placeholderLoftEndCondition9() {} + virtual void placeholderLoftEndCondition10() {} + virtual void placeholderLoftEndCondition11() {} + virtual void placeholderLoftEndCondition12() {} + virtual void placeholderLoftEndCondition13() {} + virtual void placeholderLoftEndCondition14() {} +}; + +// Inline wrappers + +inline core::Ptr LoftEndCondition::parentLoftSection() const +{ + core::Ptr res = parentLoftSection_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_LOFTENDCONDITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/LoftFeature.h b/usr/autodesk/CPP/include/Fusion/Features/LoftFeature.h new file mode 100644 index 0000000..12cb69e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/LoftFeature.h @@ -0,0 +1,205 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_LOFTFEATURE_CPP__ +# define ADSK_FUSION_LOFTFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_LOFTFEATURE_API +# endif +#else +# define ADSK_FUSION_LOFTFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class BRepFace; + class BRepFaces; + class LoftCenterLineOrRails; + class LoftSections; + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing loft feature in a design. +class LoftFeature : public Feature { +public: + + /// Returns the set of sections that the loft passes through. + /// This property returns null in the case where the feature is non-parametric. + core::Ptr loftSections() const; + + /// Returns the single centerline or the set of rails that define the shape of the loft. + /// This property returns null in the case where the feature is non-parametric. + core::Ptr centerLineOrRails() const; + + /// Property that returns the face that caps the start of the loft and is coincident + /// with the first section. In the case where the loft isn't capped and there isn't + /// a start face, this property will return null. + core::Ptr startFace() const; + + /// Property that returns the face that caps the end of the loft and is coincident + /// with the last section. In the case where the loft isn't capped and there isn't an end face, + /// this property will return null. + core::Ptr endFace() const; + + /// Property that returns all of the side faces (i.e. those running through the sections) + /// of the feature. + core::Ptr sideFaces() const; + + /// Gets and sets the type of operation performed by the extrusion. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// Indicates if this feature was initially created as a solid or a surface. + bool isSolid() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Gets and sets the list of bodies that will participate in the feature when the operation is a cut or intersection. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + std::vector> participantBodies() const; + bool participantBodies(const std::vector>& value); + + ADSK_FUSION_LOFTFEATURE_API static const char* classType(); + ADSK_FUSION_LOFTFEATURE_API const char* objectType() const override; + ADSK_FUSION_LOFTFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_LOFTFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual LoftSections* loftSections_raw() const = 0; + virtual LoftCenterLineOrRails* centerLineOrRails_raw() const = 0; + virtual BRepFace* startFace_raw() const = 0; + virtual BRepFace* endFace_raw() const = 0; + virtual BRepFaces* sideFaces_raw() const = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual bool isSolid_raw() const = 0; + virtual LoftFeature* nativeObject_raw() const = 0; + virtual LoftFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual BRepBody** participantBodies_raw(size_t& return_size) const = 0; + virtual bool participantBodies_raw(BRepBody** value, size_t value_size) = 0; +}; + +// Inline wrappers + +inline core::Ptr LoftFeature::loftSections() const +{ + core::Ptr res = loftSections_raw(); + return res; +} + +inline core::Ptr LoftFeature::centerLineOrRails() const +{ + core::Ptr res = centerLineOrRails_raw(); + return res; +} + +inline core::Ptr LoftFeature::startFace() const +{ + core::Ptr res = startFace_raw(); + return res; +} + +inline core::Ptr LoftFeature::endFace() const +{ + core::Ptr res = endFace_raw(); + return res; +} + +inline core::Ptr LoftFeature::sideFaces() const +{ + core::Ptr res = sideFaces_raw(); + return res; +} + +inline FeatureOperations LoftFeature::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool LoftFeature::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline bool LoftFeature::isSolid() const +{ + bool res = isSolid_raw(); + return res; +} + +inline core::Ptr LoftFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr LoftFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline std::vector> LoftFeature::participantBodies() const +{ + std::vector> res; + size_t s; + + BRepBody** p= participantBodies_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool LoftFeature::participantBodies(const std::vector>& value) +{ + BRepBody** value_ = new BRepBody*[value.size()]; + for(size_t i=0; i + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_LOFTFEATUREINPUT_CPP__ +# define ADSK_FUSION_LOFTFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_LOFTFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_LOFTFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class BRepBody; + class LoftCenterLineOrRails; + class LoftSections; + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// This object defines the all of the input necessary to create a loft feature. It is the +/// programming equivalent to the Loft command dialog. Through this object you provide +/// the input needed to fully define a loft. To create the loft feature you pass +/// this object the LoftFeatures.add method. +class LoftFeatureInput : public core::Base { +public: + + /// The set of sections, (or profiles as they're referred to in the user-interface), that the loft will pass through. Use the add method on the LoftSections + /// object to specify new sections. + core::Ptr loftSections() const; + + /// The single centerline or set of rails that define the shape of the loft. Use methods on the + /// returned LoftCenterLineOrRails object to define the centerline or rails. + core::Ptr centerLineOrRails() const; + + /// Gets and sets the type of operation performed by the loft. + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// In order for geometry to be transformed correctly, an Occurrence for creation needs to be + /// specified when the loft is created based on geometry (e.g. a profile and/or face(s)) + /// when the loft is being created in another component AND the loft is not in the root component. + /// The CreationOccurrence is analogous to the active occurrence in the UI + core::Ptr creationOccurrence() const; + bool creationOccurrence(const core::Ptr& value); + + /// Specifies if the loft should be created as a solid or surface. This is + /// initialized to true so a solid will attempt to be created if it's not changed. + bool isSolid() const; + bool isSolid(bool value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + /// Gets and sets the list of bodies that will participate in the feature when the operation is a cut or intersection. + /// If this property has not been set, the default behavior is that all bodies that are intersected by the + /// feature will participate. + /// This property can return null in the case where the feature has not been fully defined so that + /// possible intersecting bodies can be computed. + std::vector> participantBodies() const; + bool participantBodies(const std::vector>& value); + + ADSK_FUSION_LOFTFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_LOFTFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_LOFTFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_LOFTFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual LoftSections* loftSections_raw() const = 0; + virtual LoftCenterLineOrRails* centerLineOrRails_raw() const = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual Occurrence* creationOccurrence_raw() const = 0; + virtual bool creationOccurrence_raw(Occurrence* value) = 0; + virtual bool isSolid_raw() const = 0; + virtual bool isSolid_raw(bool value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; + virtual BRepBody** participantBodies_raw(size_t& return_size) const = 0; + virtual bool participantBodies_raw(BRepBody** value, size_t value_size) = 0; +}; + +// Inline wrappers + +inline core::Ptr LoftFeatureInput::loftSections() const +{ + core::Ptr res = loftSections_raw(); + return res; +} + +inline core::Ptr LoftFeatureInput::centerLineOrRails() const +{ + core::Ptr res = centerLineOrRails_raw(); + return res; +} + +inline FeatureOperations LoftFeatureInput::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool LoftFeatureInput::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline core::Ptr LoftFeatureInput::creationOccurrence() const +{ + core::Ptr res = creationOccurrence_raw(); + return res; +} + +inline bool LoftFeatureInput::creationOccurrence(const core::Ptr& value) +{ + return creationOccurrence_raw(value.get()); +} + +inline bool LoftFeatureInput::isSolid() const +{ + bool res = isSolid_raw(); + return res; +} + +inline bool LoftFeatureInput::isSolid(bool value) +{ + return isSolid_raw(value); +} + +inline core::Ptr LoftFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool LoftFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} + +inline std::vector> LoftFeatureInput::participantBodies() const +{ + std::vector> res; + size_t s; + + BRepBody** p= participantBodies_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool LoftFeatureInput::participantBodies(const std::vector>& value) +{ + BRepBody** value_ = new BRepBody*[value.size()]; + for(size_t i=0; i + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_LOFTFEATURES_CPP__ +# define ADSK_FUSION_LOFTFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_LOFTFEATURES_API +# endif +#else +# define ADSK_FUSION_LOFTFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class LoftFeature; + class LoftFeatureInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing loft features in a design. +class LoftFeatures : public core::Base { +public: + + /// Function that returns the specified loft feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified loft feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of loft features in the collection. + size_t count() const; + + /// Creates a LoftFeatureInput object. Use properties and methods on the returned LoftFeatureInput + /// object to provide the required input to create a loft feature. The LoftFeatureInput object can then be used as input to the + /// add method to create the loft feature. + /// operation : The feature operation to perform. + /// Returns the newly created LoftFeatureInput object or null if the creation failed. + core::Ptr createInput(FeatureOperations operation) const; + + /// Creates a new loft feature. + /// input : A LoftFeatureInput object that defines the desired loft feature. Use the createInput + /// method to create a new LoftFeatureInput object and then use methods on it + /// (the LoftFeatureInput object) to define the required input. + /// Returns the newly created LoftFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + typedef LoftFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_LOFTFEATURES_API static const char* classType(); + ADSK_FUSION_LOFTFEATURES_API const char* objectType() const override; + ADSK_FUSION_LOFTFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_LOFTFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual LoftFeature* item_raw(size_t index) const = 0; + virtual LoftFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual LoftFeatureInput* createInput_raw(FeatureOperations operation) const = 0; + virtual LoftFeature* add_raw(LoftFeatureInput* input) = 0; +}; + +// Inline wrappers + +inline core::Ptr LoftFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr LoftFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t LoftFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr LoftFeatures::createInput(FeatureOperations operation) const +{ + core::Ptr res = createInput_raw(operation); + return res; +} + +inline core::Ptr LoftFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +template inline void LoftFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_LOFTFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/LoftFreeEndCondition.h b/usr/autodesk/CPP/include/Fusion/Features/LoftFreeEndCondition.h new file mode 100644 index 0000000..fef938c --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/LoftFreeEndCondition.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "LoftEndCondition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_LOFTFREEENDCONDITION_CPP__ +# define ADSK_FUSION_LOFTFREEENDCONDITION_API XI_EXPORT +# else +# define ADSK_FUSION_LOFTFREEENDCONDITION_API +# endif +#else +# define ADSK_FUSION_LOFTFREEENDCONDITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Represents a "Free" loft end condition. +class LoftFreeEndCondition : public LoftEndCondition { +public: + + ADSK_FUSION_LOFTFREEENDCONDITION_API static const char* classType(); + ADSK_FUSION_LOFTFREEENDCONDITION_API const char* objectType() const override; + ADSK_FUSION_LOFTFREEENDCONDITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_LOFTFREEENDCONDITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_LOFTFREEENDCONDITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/LoftPointSharpEndCondition.h b/usr/autodesk/CPP/include/Fusion/Features/LoftPointSharpEndCondition.h new file mode 100644 index 0000000..1050fbd --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/LoftPointSharpEndCondition.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "LoftEndCondition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_LOFTPOINTSHARPENDCONDITION_CPP__ +# define ADSK_FUSION_LOFTPOINTSHARPENDCONDITION_API XI_EXPORT +# else +# define ADSK_FUSION_LOFTPOINTSHARPENDCONDITION_API +# endif +#else +# define ADSK_FUSION_LOFTPOINTSHARPENDCONDITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Represents a "Point Sharp" loft end condition. +class LoftPointSharpEndCondition : public LoftEndCondition { +public: + + ADSK_FUSION_LOFTPOINTSHARPENDCONDITION_API static const char* classType(); + ADSK_FUSION_LOFTPOINTSHARPENDCONDITION_API const char* objectType() const override; + ADSK_FUSION_LOFTPOINTSHARPENDCONDITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_LOFTPOINTSHARPENDCONDITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_LOFTPOINTSHARPENDCONDITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/LoftPointTangentEndCondition.h b/usr/autodesk/CPP/include/Fusion/Features/LoftPointTangentEndCondition.h new file mode 100644 index 0000000..7f63692 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/LoftPointTangentEndCondition.h @@ -0,0 +1,62 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "LoftEndCondition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_LOFTPOINTTANGENTENDCONDITION_CPP__ +# define ADSK_FUSION_LOFTPOINTTANGENTENDCONDITION_API XI_EXPORT +# else +# define ADSK_FUSION_LOFTPOINTTANGENTENDCONDITION_API +# endif +#else +# define ADSK_FUSION_LOFTPOINTTANGENTENDCONDITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Represents a "Point Tangent" loft end condition. +class LoftPointTangentEndCondition : public LoftEndCondition { +public: + + /// Gets the valueInput or Parameter that defines the weight of the loft. + /// If this object was obtained from a LoftFeatureInput object then this will return a + /// valueInput object with the initial value provided. If this object was obtained from + /// an exiting LoftFeature then it returns a Parameter. In the case of a parameter, to change the weight, + /// edit the value of the associated parameter. + core::Ptr weight() const; + + ADSK_FUSION_LOFTPOINTTANGENTENDCONDITION_API static const char* classType(); + ADSK_FUSION_LOFTPOINTTANGENTENDCONDITION_API const char* objectType() const override; + ADSK_FUSION_LOFTPOINTTANGENTENDCONDITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_LOFTPOINTTANGENTENDCONDITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* weight_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr LoftPointTangentEndCondition::weight() const +{ + core::Ptr res = weight_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_LOFTPOINTTANGENTENDCONDITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/LoftSection.h b/usr/autodesk/CPP/include/Fusion/Features/LoftSection.h new file mode 100644 index 0000000..b1d4859 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/LoftSection.h @@ -0,0 +1,235 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_LOFTSECTION_CPP__ +# define ADSK_FUSION_LOFTSECTION_API XI_EXPORT +# else +# define ADSK_FUSION_LOFTSECTION_API +# endif +#else +# define ADSK_FUSION_LOFTSECTION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class LoftEndCondition; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// A single loft section. +class LoftSection : public core::Base { +public: + + /// Get and sets the entity that defines the section of the loft. This can be a BRepFace, Profile, Path, SketchPoint, ConstructionPoint, or an ObjectCollection + /// of contiguous profiles. + /// If this LoftSection object is associated with a created feature, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr entity() const; + bool entity(const core::Ptr& value); + + /// Deletes this LoftSection. + /// If this LoftSection object is associated with a created feature, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// Returns true if the operation was successful. + bool deleteMe(); + + /// The position of this LoftSection within the collection. The first section has an index + /// of 0. This is also the order of how the section will be used in the loft. The order + /// can be modified by using the reorder method. + int index() const; + + /// Repositions this section so that it has the new index specified. + /// If this LoftSection object is associated with a created feature, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// newIndex : The new index value. For example, passing in zero as the new index will make this + /// the first section in the loft and (LoftSections.count - 1) will make it the last section. + /// All other sections will be maintain their existing order but be shifted to allow space + /// for this section. + /// Returns true if the reorder operation was successful. + bool reorder(int newIndex); + + /// Returns the current end condition. This is only valid for the first and last + /// section and when the result is not closed. In other cases this will return null. + /// This returns one of the several objects derived from LoftEndCondition and represents + /// the current end condition. You can edit the existing condition using properties + /// on the returned object. You can change the end condition using one of the set methods + /// on the LoftSection object. + /// If this LoftSection object is associated with a created feature, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr endCondition() const; + + /// Sets the end condition to be a "Free" end condition. This is the default + /// end condition when a new section is added. + /// This is valid for sections defined with all curve types. + /// If this LoftSection object is associated with a created feature, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// Returns true if the operation was successful. + bool setFreeEndCondition(); + + /// Sets the end condition to be defined by a direction and weight. + /// This is valid for sections defined with sketch curves. + /// If this LoftSection object is associated with a created feature, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// angle : Input ValueInput object that specifies the direction by using an angle. This defaults to an angle of 0.0. + /// If the ValueInput object is a string it must be an valid expression that can be evaluated as an angle. + /// If the ValueInput is a value then it is in radians. + /// weight : Input ValueInput object that defines the weight or the amount of influence of end condition on the loft. + /// This defaults to a value of 1.0. If the ValueInput object is a string it must be an valid expression that + /// can be evaluated as a unitless value. In any case, the value must be greater than 0. + /// Returns true if the operation was successful. + bool setDirectionEndCondition(const core::Ptr& angle = NULL, const core::Ptr& weight = NULL); + + /// Sets the end condition to be tangent to the adjacent face. If the section is not defined by a BRepEdge, + /// then this is ignored because there is no face to be tangent to. + /// This is only valid on the first or last profile. + /// If this LoftSection object is associated with a created feature, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// weight : Input ValueInput object that defines the weight or the amount of influence of end condition on the loft. + /// This defaults to a value of 1.0. If the ValueInput object is a string it must be an valid expression that + /// can be evaluated as a unitless value. In any case, the value must be greater than 0. + /// Returns true if the operation was successful. + bool setTangentEndCondition(const core::Ptr& weight); + + /// Sets the end condition to be smooth to the adjacent face. If the end profile is not defined by a BRepEdge, + /// then this is ignored because there is no face to be smooth to. + /// This is only valid on the first or last section. + /// If this LoftSection object is associated with a created feature, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// weight : Input ValueInput object that defines the weight or the amount of influence of end condition on the loft. + /// This defaults to a value of 1.0. If the ValueInput object is a string it must be an valid expression that + /// can be evaluated as a unitless value. In any case, the value must be greater than 0. + /// Returns true if the operation was successful. + bool setSmoothEndCondition(const core::Ptr& weight); + + /// Sets the end condition to be sharp where the section is a point. This is the default condition for a point section. + /// If this LoftSection object is associated with a created feature, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// Returns true if the operation was successful. + bool setPointSharpEndCondition(); + + /// Set the end condition to a tangent condition in the case where the section is a point. + /// If this LoftSection object is associated with a created feature, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// weight : Input ValueInput object that defines the weight or the amount of influence of end condition on the loft. + /// This defaults to a value of 1.0. If the ValueInput object is a string it must be an valid expression that + /// can be evaluated as a unitless value. In any case, the value must be greater than 0. + /// Returns true if the operation was successful. + bool setPointTangentEndCondition(const core::Ptr& weight); + + ADSK_FUSION_LOFTSECTION_API static const char* classType(); + ADSK_FUSION_LOFTSECTION_API const char* objectType() const override; + ADSK_FUSION_LOFTSECTION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_LOFTSECTION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* entity_raw() const = 0; + virtual bool entity_raw(core::Base* value) = 0; + virtual bool deleteMe_raw() = 0; + virtual int index_raw() const = 0; + virtual bool reorder_raw(int newIndex) = 0; + virtual LoftEndCondition* endCondition_raw() const = 0; + virtual bool setFreeEndCondition_raw() = 0; + virtual bool setDirectionEndCondition_raw(core::ValueInput* angle, core::ValueInput* weight) = 0; + virtual bool setTangentEndCondition_raw(core::ValueInput* weight) = 0; + virtual bool setSmoothEndCondition_raw(core::ValueInput* weight) = 0; + virtual bool setPointSharpEndCondition_raw() = 0; + virtual bool setPointTangentEndCondition_raw(core::ValueInput* weight) = 0; +}; + +// Inline wrappers + +inline core::Ptr LoftSection::entity() const +{ + core::Ptr res = entity_raw(); + return res; +} + +inline bool LoftSection::entity(const core::Ptr& value) +{ + return entity_raw(value.get()); +} + +inline bool LoftSection::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline int LoftSection::index() const +{ + int res = index_raw(); + return res; +} + +inline bool LoftSection::reorder(int newIndex) +{ + bool res = reorder_raw(newIndex); + return res; +} + +inline core::Ptr LoftSection::endCondition() const +{ + core::Ptr res = endCondition_raw(); + return res; +} + +inline bool LoftSection::setFreeEndCondition() +{ + bool res = setFreeEndCondition_raw(); + return res; +} + +inline bool LoftSection::setDirectionEndCondition(const core::Ptr& angle, const core::Ptr& weight) +{ + bool res = setDirectionEndCondition_raw(angle.get(), weight.get()); + return res; +} + +inline bool LoftSection::setTangentEndCondition(const core::Ptr& weight) +{ + bool res = setTangentEndCondition_raw(weight.get()); + return res; +} + +inline bool LoftSection::setSmoothEndCondition(const core::Ptr& weight) +{ + bool res = setSmoothEndCondition_raw(weight.get()); + return res; +} + +inline bool LoftSection::setPointSharpEndCondition() +{ + bool res = setPointSharpEndCondition_raw(); + return res; +} + +inline bool LoftSection::setPointTangentEndCondition(const core::Ptr& weight) +{ + bool res = setPointTangentEndCondition_raw(weight.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_LOFTSECTION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/LoftSections.h b/usr/autodesk/CPP/include/Fusion/Features/LoftSections.h new file mode 100644 index 0000000..f169f55 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/LoftSections.h @@ -0,0 +1,93 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_LOFTSECTIONS_CPP__ +# define ADSK_FUSION_LOFTSECTIONS_API XI_EXPORT +# else +# define ADSK_FUSION_LOFTSECTIONS_API +# endif +#else +# define ADSK_FUSION_LOFTSECTIONS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class LoftSection; +}} + +namespace adsk { namespace fusion { + +/// The set of two or more sections used to define the shape of the loft. +class LoftSections : public core::Base { +public: + + /// The number of LoftSections in the collection. + size_t count() const; + + /// Function that returns the specified LoftSection using an index into the collection. They are returned + /// in the same order that they are used in the loft. Their order can be modified using the reorder method + /// of the LoftSection object. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(int index) const; + + /// Adds a new section to the loft. The initial end condition is "Free". Additional methods on the + /// returned LoftSection can be used to further define the section. + /// If this LoftSections object is associated with a created feature, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// entity : Specifies the BRepFace, Profile, Path, SketchPoint, ConstructionPoint, or an ObjectCollection containing + /// a contiguous set of Profile objects that defines the section. + /// Returns the newly created LoftSection object. + core::Ptr add(const core::Ptr& entity); + + ADSK_FUSION_LOFTSECTIONS_API static const char* classType(); + ADSK_FUSION_LOFTSECTIONS_API const char* objectType() const override; + ADSK_FUSION_LOFTSECTIONS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_LOFTSECTIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual size_t count_raw() const = 0; + virtual LoftSection* item_raw(int index) const = 0; + virtual LoftSection* add_raw(core::Base* entity) = 0; +}; + +// Inline wrappers + +inline size_t LoftSections::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr LoftSections::item(int index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr LoftSections::add(const core::Ptr& entity) +{ + core::Ptr res = add_raw(entity.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_LOFTSECTIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/LoftSmoothEndCondition.h b/usr/autodesk/CPP/include/Fusion/Features/LoftSmoothEndCondition.h new file mode 100644 index 0000000..0cad866 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/LoftSmoothEndCondition.h @@ -0,0 +1,62 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "LoftEndCondition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_LOFTSMOOTHENDCONDITION_CPP__ +# define ADSK_FUSION_LOFTSMOOTHENDCONDITION_API XI_EXPORT +# else +# define ADSK_FUSION_LOFTSMOOTHENDCONDITION_API +# endif +#else +# define ADSK_FUSION_LOFTSMOOTHENDCONDITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Represents a "Smooth" loft end condition. +class LoftSmoothEndCondition : public LoftEndCondition { +public: + + /// Gets the valueInput or Parameter that defines the weight of the loft. + /// If this object was obtained from a LoftFeatureInput object then this will return a + /// valueInput object with the initial value provided. If this object was obtained from + /// an exiting LoftFeature then it returns a Parameter. In the case of a parameter, to change the weight, + /// edit the value of the associated parameter. + core::Ptr weight() const; + + ADSK_FUSION_LOFTSMOOTHENDCONDITION_API static const char* classType(); + ADSK_FUSION_LOFTSMOOTHENDCONDITION_API const char* objectType() const override; + ADSK_FUSION_LOFTSMOOTHENDCONDITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_LOFTSMOOTHENDCONDITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* weight_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr LoftSmoothEndCondition::weight() const +{ + core::Ptr res = weight_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_LOFTSMOOTHENDCONDITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/LoftTangentEndCondition.h b/usr/autodesk/CPP/include/Fusion/Features/LoftTangentEndCondition.h new file mode 100644 index 0000000..e238cc9 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/LoftTangentEndCondition.h @@ -0,0 +1,62 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "LoftEndCondition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_LOFTTANGENTENDCONDITION_CPP__ +# define ADSK_FUSION_LOFTTANGENTENDCONDITION_API XI_EXPORT +# else +# define ADSK_FUSION_LOFTTANGENTENDCONDITION_API +# endif +#else +# define ADSK_FUSION_LOFTTANGENTENDCONDITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Represents a "Tangent" loft end condition. +class LoftTangentEndCondition : public LoftEndCondition { +public: + + /// Gets the valueInput or Parameter that defines the weight of the loft. + /// If this object was obtained from a LoftFeatureInput object then this will return a + /// valueInput object with the initial value provided. If this object was obtained from + /// an exiting LoftFeature then it returns a Parameter. In the case of a parameter, to change the weight, + /// edit the value of the associated parameter. + core::Ptr weight() const; + + ADSK_FUSION_LOFTTANGENTENDCONDITION_API static const char* classType(); + ADSK_FUSION_LOFTTANGENTENDCONDITION_API const char* objectType() const override; + ADSK_FUSION_LOFTTANGENTENDCONDITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_LOFTTANGENTENDCONDITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* weight_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr LoftTangentEndCondition::weight() const +{ + core::Ptr res = weight_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_LOFTTANGENTENDCONDITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/MirrorFeature.h b/usr/autodesk/CPP/include/Fusion/Features/MirrorFeature.h new file mode 100644 index 0000000..d16fcc0 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/MirrorFeature.h @@ -0,0 +1,201 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_MIRRORFEATURE_CPP__ +# define ADSK_FUSION_MIRRORFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_MIRRORFEATURE_API +# endif +#else +# define ADSK_FUSION_MIRRORFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; + class Occurrence; + class PatternElements; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing mirror feature in a design. +class MirrorFeature : public Feature { +public: + + /// Gets and sets the entities that are mirrored. It can contain faces, features, bodies, or components. + /// The input must all be of a single type. For example, you can't provide a body and a component but + /// the collection must be either all bodies or all components. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr inputEntities() const; + bool inputEntities(const core::Ptr& value); + + /// Gets and sets the mirror plane. This can be either a planar face or construction plane. + /// This works only for parametric features. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr mirrorPlane() const; + bool mirrorPlane(const core::Ptr& value); + + /// Gets the PatternElements collection that contains the elements created by this pattern. + core::Ptr patternElements() const; + + /// Get the features that were created for this mirror. + /// Returns null in the case where the feature is not parametric. + core::Ptr resultFeatures() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Gets and sets the compute option for this mirror feature. + /// This property only applies when mirroring features and is ignored in the direct modeling environment. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + PatternComputeOptions patternComputeOption() const; + bool patternComputeOption(PatternComputeOptions value); + + /// Gets and sets whether combine is set when doing the Mirror. + /// When true, the mirrored geometry will be Boolean unioned with the original solid or surface body(s) + /// when they connect within the stitch tolerance defined with the stitchTolerance property. If the bodies + /// cannot be unioned or stitched the result will be separate bodies. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isCombine() const; + bool isCombine(bool value); + + /// Returns the parameter controlling the Stitch tolerance to use when stitching mirrored + /// surface bodies with the original bodies. You can edit the tolerance by + /// editing the value of the parameter object. + core::Ptr stitchTolerance() const; + + ADSK_FUSION_MIRRORFEATURE_API static const char* classType(); + ADSK_FUSION_MIRRORFEATURE_API const char* objectType() const override; + ADSK_FUSION_MIRRORFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_MIRRORFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* inputEntities_raw() const = 0; + virtual bool inputEntities_raw(core::ObjectCollection* value) = 0; + virtual core::Base* mirrorPlane_raw() const = 0; + virtual bool mirrorPlane_raw(core::Base* value) = 0; + virtual PatternElements* patternElements_raw() const = 0; + virtual core::ObjectCollection* resultFeatures_raw() const = 0; + virtual MirrorFeature* nativeObject_raw() const = 0; + virtual MirrorFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual PatternComputeOptions patternComputeOption_raw() const = 0; + virtual bool patternComputeOption_raw(PatternComputeOptions value) = 0; + virtual bool isCombine_raw() const = 0; + virtual bool isCombine_raw(bool value) = 0; + virtual ModelParameter* stitchTolerance_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr MirrorFeature::inputEntities() const +{ + core::Ptr res = inputEntities_raw(); + return res; +} + +inline bool MirrorFeature::inputEntities(const core::Ptr& value) +{ + return inputEntities_raw(value.get()); +} + +inline core::Ptr MirrorFeature::mirrorPlane() const +{ + core::Ptr res = mirrorPlane_raw(); + return res; +} + +inline bool MirrorFeature::mirrorPlane(const core::Ptr& value) +{ + return mirrorPlane_raw(value.get()); +} + +inline core::Ptr MirrorFeature::patternElements() const +{ + core::Ptr res = patternElements_raw(); + return res; +} + +inline core::Ptr MirrorFeature::resultFeatures() const +{ + core::Ptr res = resultFeatures_raw(); + return res; +} + +inline core::Ptr MirrorFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr MirrorFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline PatternComputeOptions MirrorFeature::patternComputeOption() const +{ + PatternComputeOptions res = patternComputeOption_raw(); + return res; +} + +inline bool MirrorFeature::patternComputeOption(PatternComputeOptions value) +{ + return patternComputeOption_raw(value); +} + +inline bool MirrorFeature::isCombine() const +{ + bool res = isCombine_raw(); + return res; +} + +inline bool MirrorFeature::isCombine(bool value) +{ + return isCombine_raw(value); +} + +inline core::Ptr MirrorFeature::stitchTolerance() const +{ + core::Ptr res = stitchTolerance_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_MIRRORFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/MirrorFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/MirrorFeatureInput.h new file mode 100644 index 0000000..f857161 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/MirrorFeatureInput.h @@ -0,0 +1,175 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_MIRRORFEATUREINPUT_CPP__ +# define ADSK_FUSION_MIRRORFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_MIRRORFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_MIRRORFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a mirror +/// feature. +class MirrorFeatureInput : public core::Base { +public: + + /// Gets and sets the entities that are mirrored. It can contain faces, features, bodies, or components. + /// The input must all be of a single type. For example, you can't provide a body and a component but + /// the collection must be either all bodies or all components. + core::Ptr inputEntities() const; + bool inputEntities(const core::Ptr& value); + + /// Gets and sets the mirror plane. This can be either a planar face or construction plane. + core::Ptr mirrorPlane() const; + bool mirrorPlane(const core::Ptr& value); + + /// Gets and sets the compute option when mirroring features. The default value for this is AdjustPatternCompute. + /// This property only applies when mirroring features and is ignored in the direct modeling environment. + PatternComputeOptions patternComputeOption() const; + bool patternComputeOption(PatternComputeOptions value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + /// Gets and sets whether the mirrored bodies should be combined with the original bodies. + /// When true, the mirrored geometry will be Boolean unioned with the original solid or surface body(s) + /// when they connect within the stitch tolerance defined with the stitchTolerance property. If the bodies + /// cannot be unioned or stitched the result will be separate bodies. + /// If any input object is not a body, then this setting is ignored. + /// Default is false. + bool isCombine() const; + bool isCombine(bool value); + + /// Gets and sets the ValueInput object that defines the Stitching Tolerance (length) + /// to use when doing a mirror and combine for surface bodies. + core::Ptr stitchTolerance() const; + bool stitchTolerance(const core::Ptr& value); + + ADSK_FUSION_MIRRORFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_MIRRORFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_MIRRORFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_MIRRORFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* inputEntities_raw() const = 0; + virtual bool inputEntities_raw(core::ObjectCollection* value) = 0; + virtual core::Base* mirrorPlane_raw() const = 0; + virtual bool mirrorPlane_raw(core::Base* value) = 0; + virtual PatternComputeOptions patternComputeOption_raw() const = 0; + virtual bool patternComputeOption_raw(PatternComputeOptions value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; + virtual bool isCombine_raw() const = 0; + virtual bool isCombine_raw(bool value) = 0; + virtual core::ValueInput* stitchTolerance_raw() const = 0; + virtual bool stitchTolerance_raw(core::ValueInput* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr MirrorFeatureInput::inputEntities() const +{ + core::Ptr res = inputEntities_raw(); + return res; +} + +inline bool MirrorFeatureInput::inputEntities(const core::Ptr& value) +{ + return inputEntities_raw(value.get()); +} + +inline core::Ptr MirrorFeatureInput::mirrorPlane() const +{ + core::Ptr res = mirrorPlane_raw(); + return res; +} + +inline bool MirrorFeatureInput::mirrorPlane(const core::Ptr& value) +{ + return mirrorPlane_raw(value.get()); +} + +inline PatternComputeOptions MirrorFeatureInput::patternComputeOption() const +{ + PatternComputeOptions res = patternComputeOption_raw(); + return res; +} + +inline bool MirrorFeatureInput::patternComputeOption(PatternComputeOptions value) +{ + return patternComputeOption_raw(value); +} + +inline core::Ptr MirrorFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool MirrorFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} + +inline bool MirrorFeatureInput::isCombine() const +{ + bool res = isCombine_raw(); + return res; +} + +inline bool MirrorFeatureInput::isCombine(bool value) +{ + return isCombine_raw(value); +} + +inline core::Ptr MirrorFeatureInput::stitchTolerance() const +{ + core::Ptr res = stitchTolerance_raw(); + return res; +} + +inline bool MirrorFeatureInput::stitchTolerance(const core::Ptr& value) +{ + return stitchTolerance_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_MIRRORFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/MirrorFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/MirrorFeatures.h new file mode 100644 index 0000000..be200ef --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/MirrorFeatures.h @@ -0,0 +1,136 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_MIRRORFEATURES_CPP__ +# define ADSK_FUSION_MIRRORFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_MIRRORFEATURES_API +# endif +#else +# define ADSK_FUSION_MIRRORFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class MirrorFeature; + class MirrorFeatureInput; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing mirror features in a component +/// and supports the ability to create new mirror features. +class MirrorFeatures : public core::Base { +public: + + /// Function that returns the specified mirror feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of mirror features in the collection. + size_t count() const; + + /// Creates a MirrorFeatureInput object. Use properties and methods on this object + /// to define the mirror you want to create and then use the Add method, passing in + /// the MirrorFeatureInput object. + /// inputEntities : A collection of the entities to mirror. It can contain faces, features, bodies, or components. + /// The input must all be of a single type. For example, you can't provide a body and a component but + /// the collection must be either all bodies or all components. + /// mirrorPlane : Input planar entity that defines the mirror plane. This can be either a planar face or a construction plane. + /// Returns the newly created MirrorFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& inputEntities, const core::Ptr& mirrorPlane) const; + + /// Creates a new mirror feature. + /// input : A MirrorFeatureInput object that defines the desired mirror. Use the createInput + /// method to create a new MirrorFeatureInput object and then use methods on it + /// (the MirrorFeatureInput object) to define the mirror. + /// Returns the newly created MirrorFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified mirror feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef MirrorFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_MIRRORFEATURES_API static const char* classType(); + ADSK_FUSION_MIRRORFEATURES_API const char* objectType() const override; + ADSK_FUSION_MIRRORFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_MIRRORFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual MirrorFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual MirrorFeatureInput* createInput_raw(core::ObjectCollection* inputEntities, core::Base* mirrorPlane) const = 0; + virtual MirrorFeature* add_raw(MirrorFeatureInput* input) = 0; + virtual MirrorFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr MirrorFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t MirrorFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr MirrorFeatures::createInput(const core::Ptr& inputEntities, const core::Ptr& mirrorPlane) const +{ + core::Ptr res = createInput_raw(inputEntities.get(), mirrorPlane.get()); + return res; +} + +inline core::Ptr MirrorFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr MirrorFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void MirrorFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_MIRRORFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/MoveFeature.h b/usr/autodesk/CPP/include/Fusion/Features/MoveFeature.h new file mode 100644 index 0000000..e84ecc7 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/MoveFeature.h @@ -0,0 +1,123 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_MOVEFEATURE_CPP__ +# define ADSK_FUSION_MOVEFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_MOVEFEATURE_API +# endif +#else +# define ADSK_FUSION_MOVEFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; +}} +namespace adsk { namespace core { + class Matrix3D; + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing move feature in a design. +class MoveFeature : public Feature { +public: + + /// Gets and sets the entities to move. This is done by using an ObjectCollection + /// containing the objects to move. For a parametric model, the collection can contain + /// BRepBody or BRepFace objects but not a combination of both. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr inputEntities() const; + bool inputEntities(const core::Ptr& value); + + /// Gets and sets the move transform of the input bodies. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr transform() const; + bool transform(const core::Ptr& value); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_MOVEFEATURE_API static const char* classType(); + ADSK_FUSION_MOVEFEATURE_API const char* objectType() const override; + ADSK_FUSION_MOVEFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_MOVEFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* inputEntities_raw() const = 0; + virtual bool inputEntities_raw(core::ObjectCollection* value) = 0; + virtual core::Matrix3D* transform_raw() const = 0; + virtual bool transform_raw(core::Matrix3D* value) = 0; + virtual MoveFeature* nativeObject_raw() const = 0; + virtual MoveFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr MoveFeature::inputEntities() const +{ + core::Ptr res = inputEntities_raw(); + return res; +} + +inline bool MoveFeature::inputEntities(const core::Ptr& value) +{ + return inputEntities_raw(value.get()); +} + +inline core::Ptr MoveFeature::transform() const +{ + core::Ptr res = transform_raw(); + return res; +} + +inline bool MoveFeature::transform(const core::Ptr& value) +{ + return transform_raw(value.get()); +} + +inline core::Ptr MoveFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr MoveFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_MOVEFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/MoveFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/MoveFeatureInput.h new file mode 100644 index 0000000..0e604de --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/MoveFeatureInput.h @@ -0,0 +1,117 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_MOVEFEATUREINPUT_CPP__ +# define ADSK_FUSION_MOVEFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_MOVEFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_MOVEFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; +}} +namespace adsk { namespace core { + class Matrix3D; + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a move feature. +class MoveFeatureInput : public core::Base { +public: + + /// An ObjectCollection containing the objects to move. The collection can contain + /// BRepBody or BRepFace objects but not a mixture of the two types. + core::Ptr inputEntities() const; + bool inputEntities(const core::Ptr& value); + + /// Gets and sets the tranform to apply to the input entities. This can describe a move (translation) + /// or a rotation. The matrix must define an orthogonal transform. That is the axes remain + /// perpendicular to each other and there isn't any scale or mirror defined. + core::Ptr transform() const; + bool transform(const core::Ptr& value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_MOVEFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_MOVEFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_MOVEFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_MOVEFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* inputEntities_raw() const = 0; + virtual bool inputEntities_raw(core::ObjectCollection* value) = 0; + virtual core::Matrix3D* transform_raw() const = 0; + virtual bool transform_raw(core::Matrix3D* value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr MoveFeatureInput::inputEntities() const +{ + core::Ptr res = inputEntities_raw(); + return res; +} + +inline bool MoveFeatureInput::inputEntities(const core::Ptr& value) +{ + return inputEntities_raw(value.get()); +} + +inline core::Ptr MoveFeatureInput::transform() const +{ + core::Ptr res = transform_raw(); + return res; +} + +inline bool MoveFeatureInput::transform(const core::Ptr& value) +{ + return transform_raw(value.get()); +} + +inline core::Ptr MoveFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool MoveFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_MOVEFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/MoveFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/MoveFeatures.h new file mode 100644 index 0000000..3eec42c --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/MoveFeatures.h @@ -0,0 +1,140 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_MOVEFEATURES_CPP__ +# define ADSK_FUSION_MOVEFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_MOVEFEATURES_API +# endif +#else +# define ADSK_FUSION_MOVEFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class MoveFeature; + class MoveFeatureInput; +}} +namespace adsk { namespace core { + class Matrix3D; + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing move features in a component +/// and supports the ability to create new move features. +class MoveFeatures : public core::Base { +public: + + /// Function that returns the specified move feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of move features in the collection. + size_t count() const; + + /// Creates a MoveFeatureInput object. Use properties and methods on this object + /// to define the move feature you want to create and then use the Add method, passing in + /// the MoveFeatureInput object. + /// inputEntities : An ObjectCollection containing the entities to move. This collection can only contain + /// BRepBody objects in parametric modeling. It can be BRep bodies, T-Spline bodies, + /// mesh bodies mixed or faces and features mixed in non-parametric modeling. + /// transform : The transform to apply to the input entities. This can describe a move (translation) or a rotation. The + /// matrix must define an orthogonal transform. That is the axes must be perpendicular to each other and there + /// can't be any scaling or mirroring defined. + /// Returns the newly created MoveFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& inputEntities, const core::Ptr& transform) const; + + /// Creates a new move feature. + /// input : A MoveFeatureInput object that defines the desired move feature. Use the createInput2 + /// method to create a new MoveFeatureInput object and then use methods on the MoveFeatureInput + /// object to define the move feature. + /// Returns the newly created MoveFeature object or null if the creation failed. + /// Returns nothing in the case where the feature is non-parametric. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified move feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef MoveFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_MOVEFEATURES_API static const char* classType(); + ADSK_FUSION_MOVEFEATURES_API const char* objectType() const override; + ADSK_FUSION_MOVEFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_MOVEFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual MoveFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual MoveFeatureInput* createInput_raw(core::ObjectCollection* inputEntities, core::Matrix3D* transform) const = 0; + virtual MoveFeature* add_raw(MoveFeatureInput* input) = 0; + virtual MoveFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr MoveFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t MoveFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr MoveFeatures::createInput(const core::Ptr& inputEntities, const core::Ptr& transform) const +{ + core::Ptr res = createInput_raw(inputEntities.get(), transform.get()); + return res; +} + +inline core::Ptr MoveFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr MoveFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void MoveFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_MOVEFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/OffsetFacesFeature.h b/usr/autodesk/CPP/include/Fusion/Features/OffsetFacesFeature.h new file mode 100644 index 0000000..524b593 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/OffsetFacesFeature.h @@ -0,0 +1,49 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_OFFSETFACESFEATURE_CPP__ +# define ADSK_FUSION_OFFSETFACESFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_OFFSETFACESFEATURE_API +# endif +#else +# define ADSK_FUSION_OFFSETFACESFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Object that represents an existing Offset Face feature in a design. +/// Offset Face features are created in the UI using the "Press Pull" command. +class OffsetFacesFeature : public Feature { +public: + + ADSK_FUSION_OFFSETFACESFEATURE_API static const char* classType(); + ADSK_FUSION_OFFSETFACESFEATURE_API const char* objectType() const override; + ADSK_FUSION_OFFSETFACESFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_OFFSETFACESFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_OFFSETFACESFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/OffsetFacesFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/OffsetFacesFeatures.h new file mode 100644 index 0000000..e8df428 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/OffsetFacesFeatures.h @@ -0,0 +1,103 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_OFFSETFACESFEATURES_CPP__ +# define ADSK_FUSION_OFFSETFACESFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_OFFSETFACESFEATURES_API +# endif +#else +# define ADSK_FUSION_OFFSETFACESFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class OffsetFacesFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing Offset Face features in a design. +/// Offset Face features are created in the UI using the "Press Pull" command. +class OffsetFacesFeatures : public core::Base { +public: + + /// Function that returns the specified Offset Face feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified Offset Face feature using the name of the feature. + /// Offset Face features are created in the UI using the "Press Pull" command. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of Offset Face features in the collection. + /// Offset Face features are created in the UI using the "Press Pull" command. + size_t count() const; + + typedef OffsetFacesFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_OFFSETFACESFEATURES_API static const char* classType(); + ADSK_FUSION_OFFSETFACESFEATURES_API const char* objectType() const override; + ADSK_FUSION_OFFSETFACESFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_OFFSETFACESFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual OffsetFacesFeature* item_raw(size_t index) const = 0; + virtual OffsetFacesFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr OffsetFacesFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr OffsetFacesFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t OffsetFacesFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void OffsetFacesFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_OFFSETFACESFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/OffsetFeature.h b/usr/autodesk/CPP/include/Fusion/Features/OffsetFeature.h new file mode 100644 index 0000000..3def2a8 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/OffsetFeature.h @@ -0,0 +1,154 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_OFFSETFEATURE_CPP__ +# define ADSK_FUSION_OFFSETFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_OFFSETFEATURE_API +# endif +#else +# define ADSK_FUSION_OFFSETFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; + class Occurrence; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing offset feature in a design. +class OffsetFeature : public Feature { +public: + + /// Sets the faces and sheet bodies to offset. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// entities : An ObjectCollection containing the BRepFace objects to offset. Additional faces may be + /// automatically used depending on the value of the isChainSelection argument. + /// Input faces need not be from the same body. + /// isChainSelection : A boolean value for setting whether or not faces that are tangentially connected to + /// the input faces (if any) will also be offset. The default value is true. + /// Returns true if successful + bool setInputEntities(const core::Ptr& entities, bool isChainSelection = true); + + /// Gets and sets the faces to be offset. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr entities() const; + bool entities(const core::Ptr& value); + + /// Get if the faces that are tangentially connected to the input faces (if any) are also offset. + bool isChainSelection() const; + + /// Returns the parameter controlling the offset distance. You can edit the distance + /// by editing the value of the parameter object. A positive value specifies that the offset + /// is in the same direction as the normal direction of the face. + core::Ptr distance() const; + + /// Gets the feature operation that was performed when the feature was created, + /// (either 'NewBodyFeatureOperation' or 'NewComponentFeatureOperation'. + FeatureOperations operation() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_OFFSETFEATURE_API static const char* classType(); + ADSK_FUSION_OFFSETFEATURE_API const char* objectType() const override; + ADSK_FUSION_OFFSETFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_OFFSETFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool setInputEntities_raw(core::ObjectCollection* entities, bool isChainSelection) = 0; + virtual core::ObjectCollection* entities_raw() const = 0; + virtual bool entities_raw(core::ObjectCollection* value) = 0; + virtual bool isChainSelection_raw() const = 0; + virtual ModelParameter* distance_raw() const = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual OffsetFeature* nativeObject_raw() const = 0; + virtual OffsetFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline bool OffsetFeature::setInputEntities(const core::Ptr& entities, bool isChainSelection) +{ + bool res = setInputEntities_raw(entities.get(), isChainSelection); + return res; +} + +inline core::Ptr OffsetFeature::entities() const +{ + core::Ptr res = entities_raw(); + return res; +} + +inline bool OffsetFeature::entities(const core::Ptr& value) +{ + return entities_raw(value.get()); +} + +inline bool OffsetFeature::isChainSelection() const +{ + bool res = isChainSelection_raw(); + return res; +} + +inline core::Ptr OffsetFeature::distance() const +{ + core::Ptr res = distance_raw(); + return res; +} + +inline FeatureOperations OffsetFeature::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline core::Ptr OffsetFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr OffsetFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_OFFSETFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/OffsetFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/OffsetFeatureInput.h new file mode 100644 index 0000000..446cf91 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/OffsetFeatureInput.h @@ -0,0 +1,149 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_OFFSETFEATUREINPUT_CPP__ +# define ADSK_FUSION_OFFSETFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_OFFSETFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_OFFSETFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a offset feature. +class OffsetFeatureInput : public core::Base { +public: + + /// An ObjectCollection containing the BRepFace objects being offset. + core::Ptr entities() const; + bool entities(const core::Ptr& value); + + /// Get and sets whether faces that are tangentially connected to the input faces will be included in the offset. + bool isChainSelection() const; + bool isChainSelection(bool value); + + /// Gets and sets the ValueInput object that defines the offset distance. A positive distance value results + /// in an offset in the positive normal direction of the faces. + core::Ptr distance() const; + bool distance(const core::Ptr& value); + + /// Gets and sets the feature operation to perform. Can be 'NewBodyFeatureOperation' or 'NewComponentFeatureOperation'. + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_OFFSETFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_OFFSETFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_OFFSETFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_OFFSETFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* entities_raw() const = 0; + virtual bool entities_raw(core::ObjectCollection* value) = 0; + virtual bool isChainSelection_raw() const = 0; + virtual bool isChainSelection_raw(bool value) = 0; + virtual core::ValueInput* distance_raw() const = 0; + virtual bool distance_raw(core::ValueInput* value) = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr OffsetFeatureInput::entities() const +{ + core::Ptr res = entities_raw(); + return res; +} + +inline bool OffsetFeatureInput::entities(const core::Ptr& value) +{ + return entities_raw(value.get()); +} + +inline bool OffsetFeatureInput::isChainSelection() const +{ + bool res = isChainSelection_raw(); + return res; +} + +inline bool OffsetFeatureInput::isChainSelection(bool value) +{ + return isChainSelection_raw(value); +} + +inline core::Ptr OffsetFeatureInput::distance() const +{ + core::Ptr res = distance_raw(); + return res; +} + +inline bool OffsetFeatureInput::distance(const core::Ptr& value) +{ + return distance_raw(value.get()); +} + +inline FeatureOperations OffsetFeatureInput::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool OffsetFeatureInput::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline core::Ptr OffsetFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool OffsetFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_OFFSETFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/OffsetFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/OffsetFeatures.h new file mode 100644 index 0000000..228f323 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/OffsetFeatures.h @@ -0,0 +1,142 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_OFFSETFEATURES_CPP__ +# define ADSK_FUSION_OFFSETFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_OFFSETFEATURES_API +# endif +#else +# define ADSK_FUSION_OFFSETFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class OffsetFeature; + class OffsetFeatureInput; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing Offset features in a component +/// and supports the ability to create new Offset features. +class OffsetFeatures : public core::Base { +public: + + /// Function that returns the specified offset feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of Offset features in the collection. + size_t count() const; + + /// Creates a OffsetFeatureInput object. Use properties and methods on this object + /// to define the offset feature you want to create and then use the Add method, passing in + /// the OffsetFeatureInput object to create the feature. + /// entities : An ObjectCollection containing the BRepFace objects to offset. Additional faces may be + /// automatically used depending on the value of the isChainSelection argument. + /// Input faces need not be from the same body. + /// distance : ValueInput object that defines the offset distance. A positive value is in the positive + /// normal direction of the face being offset. + /// operation : The feature operation to perform. 'NewBodyFeatureOperation' and 'NewComponentFeatureOperation' are the + /// options supported. + /// isChainSelection : A boolean value for setting whether or not faces that are tangentially connected to + /// the input faces (if any) will be included in the offset. The default value is true. + /// Returns the newly created OffsetFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& entities, const core::Ptr& distance, FeatureOperations operation, bool isChainSelection = true) const; + + /// Creates a new offset feature. + /// input : A FeatureInput object that defines the desired offset feature. Use the createInput + /// method to create a new OffsetFeatureInput object and then use methods on it + /// (the OffsetFeatureInput object) to define the offset feature. + /// Returns the newly created OffsetFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified offset feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef OffsetFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_OFFSETFEATURES_API static const char* classType(); + ADSK_FUSION_OFFSETFEATURES_API const char* objectType() const override; + ADSK_FUSION_OFFSETFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_OFFSETFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual OffsetFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual OffsetFeatureInput* createInput_raw(core::ObjectCollection* entities, core::ValueInput* distance, FeatureOperations operation, bool isChainSelection) const = 0; + virtual OffsetFeature* add_raw(OffsetFeatureInput* input) = 0; + virtual OffsetFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr OffsetFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t OffsetFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr OffsetFeatures::createInput(const core::Ptr& entities, const core::Ptr& distance, FeatureOperations operation, bool isChainSelection) const +{ + core::Ptr res = createInput_raw(entities.get(), distance.get(), operation, isChainSelection); + return res; +} + +inline core::Ptr OffsetFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr OffsetFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void OffsetFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_OFFSETFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/OffsetStartDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/OffsetStartDefinition.h new file mode 100644 index 0000000..d2f2079 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/OffsetStartDefinition.h @@ -0,0 +1,93 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExtentDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_OFFSETSTARTDEFINITION_CPP__ +# define ADSK_FUSION_OFFSETSTARTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_OFFSETSTARTDEFINITION_API +# endif +#else +# define ADSK_FUSION_OFFSETSTARTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Plane; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// A definition object that is used to define a feature whose start plane is defined as plane that is +/// offset from the sketch plane of the profile. +class OffsetStartDefinition : public ExtentDefinition { +public: + + /// Statically creates a new OffsetStartDefinition object. This is used as input when + /// create a new feature and defining the starting condition. + /// offset : An input ValueInput objects that defines the offset distance. The offset can be positive or + /// negative. A positive value indicates an offset in the same direction as the z axis of the + /// profile plane. + /// Returns the newly created OffsetStartDefinition object or null in the case of failure. + static core::Ptr create(const core::Ptr& offset); + + /// Gets the currently defined offset value. If the ProfilePlaneWithOffsetDefinition object was + /// created statically and is not associated with a feature, this will return a ValueInput object. + /// if the ProfilePlaneWithOffsetDefinition is associated with an existing feature, this will return + /// the parameter that was created when the feature was created. To edit the offset, use properties + /// on the parameter to change the value of the parameter. + core::Ptr offset() const; + + /// Returns the geometric definition of the profile plane. + core::Ptr profilePlane() const; + + ADSK_FUSION_OFFSETSTARTDEFINITION_API static const char* classType(); + ADSK_FUSION_OFFSETSTARTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_OFFSETSTARTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_OFFSETSTARTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_OFFSETSTARTDEFINITION_API static OffsetStartDefinition* create_raw(core::ValueInput* offset); + virtual core::Base* offset_raw() const = 0; + virtual core::Plane* profilePlane_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr OffsetStartDefinition::create(const core::Ptr& offset) +{ + core::Ptr res = create_raw(offset.get()); + return res; +} + +inline core::Ptr OffsetStartDefinition::offset() const +{ + core::Ptr res = offset_raw(); + return res; +} + +inline core::Ptr OffsetStartDefinition::profilePlane() const +{ + core::Ptr res = profilePlane_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_OFFSETSTARTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/OnEdgeHolePositionDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/OnEdgeHolePositionDefinition.h new file mode 100644 index 0000000..9459901 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/OnEdgeHolePositionDefinition.h @@ -0,0 +1,85 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "HolePositionDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_ONEDGEHOLEPOSITIONDEFINITION_CPP__ +# define ADSK_FUSION_ONEDGEHOLEPOSITIONDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_ONEDGEHOLEPOSITIONDEFINITION_API +# endif +#else +# define ADSK_FUSION_ONEDGEHOLEPOSITIONDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepEdge; +}} + +namespace adsk { namespace fusion { + +/// Provides positioning information for a hole that is positioned +/// on the start, end or center of an edge. +class OnEdgeHolePositionDefinition : public HolePositionDefinition { +public: + + /// Returns the plane that defines the orientation and start of the hole. + core::Ptr planarEntity() const; + + /// Returns the edge the hole is positioned on. + core::Ptr edge() const; + + /// Returns the position of the hole on the edge. + /// The hole can be at the start, midpoint, or end of the edge. + HoleEdgePositions position() const; + + ADSK_FUSION_ONEDGEHOLEPOSITIONDEFINITION_API static const char* classType(); + ADSK_FUSION_ONEDGEHOLEPOSITIONDEFINITION_API const char* objectType() const override; + ADSK_FUSION_ONEDGEHOLEPOSITIONDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_ONEDGEHOLEPOSITIONDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* planarEntity_raw() const = 0; + virtual BRepEdge* edge_raw() const = 0; + virtual HoleEdgePositions position_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr OnEdgeHolePositionDefinition::planarEntity() const +{ + core::Ptr res = planarEntity_raw(); + return res; +} + +inline core::Ptr OnEdgeHolePositionDefinition::edge() const +{ + core::Ptr res = edge_raw(); + return res; +} + +inline HoleEdgePositions OnEdgeHolePositionDefinition::position() const +{ + HoleEdgePositions res = position_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_ONEDGEHOLEPOSITIONDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/OneSideToExtentDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/OneSideToExtentDefinition.h new file mode 100644 index 0000000..baa8524 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/OneSideToExtentDefinition.h @@ -0,0 +1,86 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExtentDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_ONESIDETOEXTENTDEFINITION_CPP__ +# define ADSK_FUSION_ONESIDETOEXTENTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_ONESIDETOEXTENTDEFINITION_API +# endif +#else +# define ADSK_FUSION_ONESIDETOEXTENTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Defines the inputs for a OneSideToExtentDefinition object. +/// This defines a feature extent that goes up to a face or construction plane in one direction. +class OneSideToExtentDefinition : public ExtentDefinition { +public: + + /// Gets and sets the entity that defines the extent. The valid types of entities can vary depending on + /// the type of feature this is being used with. + core::Ptr toEntity() const; + bool toEntity(const core::Ptr& value); + + /// Specifies if the face should be extended or use adjacent faces if necessary to define the termination + /// of the extrusion. + /// When used for a revolve feature this is ignored and is always treated as true. + bool matchShape() const; + bool matchShape(bool value); + + ADSK_FUSION_ONESIDETOEXTENTDEFINITION_API static const char* classType(); + ADSK_FUSION_ONESIDETOEXTENTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_ONESIDETOEXTENTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_ONESIDETOEXTENTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* toEntity_raw() const = 0; + virtual bool toEntity_raw(core::Base* value) = 0; + virtual bool matchShape_raw() const = 0; + virtual bool matchShape_raw(bool value) = 0; +}; + +// Inline wrappers + +inline core::Ptr OneSideToExtentDefinition::toEntity() const +{ + core::Ptr res = toEntity_raw(); + return res; +} + +inline bool OneSideToExtentDefinition::toEntity(const core::Ptr& value) +{ + return toEntity_raw(value.get()); +} + +inline bool OneSideToExtentDefinition::matchShape() const +{ + bool res = matchShape_raw(); + return res; +} + +inline bool OneSideToExtentDefinition::matchShape(bool value) +{ + return matchShape_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_ONESIDETOEXTENTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/PatchFeature.h b/usr/autodesk/CPP/include/Fusion/Features/PatchFeature.h new file mode 100644 index 0000000..2038dec --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/PatchFeature.h @@ -0,0 +1,137 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PATCHFEATURE_CPP__ +# define ADSK_FUSION_PATCHFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_PATCHFEATURE_API +# endif +#else +# define ADSK_FUSION_PATCHFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing patch feature in a design. +class PatchFeature : public Feature { +public: + + /// Returns an ObjectCollection that contains all of the sketch curves or B-Rep edges + /// that define the closed outer boundary of the patch feature. + /// When setting this property, the input can be a sketch profile, a single sketch curve, a single B-Rep edge, + /// or an ObjectCollection of sketch curves or B-Rep edges. + /// If a single sketch curve or B-Rep edge is input, that is not closed, Fusion 360 will automatically find connected sketch curves + /// or B-Rep edges in order to define a closed loop. All sketch curves are valid as input. BRepEdges are valid if they are + /// an "open" edge, which means they are only used by one face. + /// If an ObjectCollection of sketch curves or B-Rep edges is input they must define a closed shape and the B-Rep + /// edges must be valid "open" edges. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr boundaryCurve() const; + bool boundaryCurve(const core::Ptr& value); + + /// Gets the type of operation performed by the patch feature. + FeatureOperations operation() const; + + /// Gets and sets the type of surface continuity used when creating the patch face. This is only used when BRepEdges are input and + /// defines the continuity of how the patch face connects to the face adjacent to each of the input edges. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + SurfaceContinuityTypes continuity() const; + bool continuity(SurfaceContinuityTypes value); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_PATCHFEATURE_API static const char* classType(); + ADSK_FUSION_PATCHFEATURE_API const char* objectType() const override; + ADSK_FUSION_PATCHFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PATCHFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* boundaryCurve_raw() const = 0; + virtual bool boundaryCurve_raw(core::Base* value) = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual SurfaceContinuityTypes continuity_raw() const = 0; + virtual bool continuity_raw(SurfaceContinuityTypes value) = 0; + virtual PatchFeature* nativeObject_raw() const = 0; + virtual PatchFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr PatchFeature::boundaryCurve() const +{ + core::Ptr res = boundaryCurve_raw(); + return res; +} + +inline bool PatchFeature::boundaryCurve(const core::Ptr& value) +{ + return boundaryCurve_raw(value.get()); +} + +inline FeatureOperations PatchFeature::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline SurfaceContinuityTypes PatchFeature::continuity() const +{ + SurfaceContinuityTypes res = continuity_raw(); + return res; +} + +inline bool PatchFeature::continuity(SurfaceContinuityTypes value) +{ + return continuity_raw(value); +} + +inline core::Ptr PatchFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr PatchFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PATCHFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/PatchFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/PatchFeatureInput.h new file mode 100644 index 0000000..53fe709 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/PatchFeatureInput.h @@ -0,0 +1,155 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PATCHFEATUREINPUT_CPP__ +# define ADSK_FUSION_PATCHFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_PATCHFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_PATCHFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a patch feature. +class PatchFeatureInput : public core::Base { +public: + + /// Gets and set the input geometry that will be used to define the boundary. This can be a sketch profile, + /// a single sketch curve, a single B-Rep edge, or a Path object. + /// If a single sketch curve or B-Rep edge is input, that is not closed, Fusion 360 will automatically find connected sketch curves + /// or B-Rep edges in order to define a closed loop. All sketch curves are valid as input. BRepEdges are valid if they are + /// an "open" edge, which means they are only used by one face. + /// If a Path is input it must define a closed shape and the B-Rep edges must be valid "open" edges. + core::Ptr boundaryCurve() const; + bool boundaryCurve(const core::Ptr& value); + + /// Gets and sets the type of operation performed by the patch feature. Only 'NewBodyFeatureOperation' and 'NewComponentFeatureOperation' are + /// valid operations for patch features. + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// Gets and sets type of surface continuity to use when matching boundary edges to face edges. When a new PatchFeatureInput is + /// created, this is initialized to ConnectedSurfaceContinuityType. This value is ignored when creating a patch for sketch curves. + SurfaceContinuityTypes continuity() const; + bool continuity(SurfaceContinuityTypes value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + /// In order for geometry to be transformed correctly, an Occurrence for creation needs to be + /// specified when the Patch feature is created based on geometry (e.g. a profile, edges, faces) + /// in another component AND (the Patch feature) is not in the root component. + /// The CreationOccurrence is analogous to the active occurrence in the UI + core::Ptr creationOccurrence() const; + bool creationOccurrence(const core::Ptr& value); + + ADSK_FUSION_PATCHFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_PATCHFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_PATCHFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PATCHFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* boundaryCurve_raw() const = 0; + virtual bool boundaryCurve_raw(core::Base* value) = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual SurfaceContinuityTypes continuity_raw() const = 0; + virtual bool continuity_raw(SurfaceContinuityTypes value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; + virtual Occurrence* creationOccurrence_raw() const = 0; + virtual bool creationOccurrence_raw(Occurrence* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr PatchFeatureInput::boundaryCurve() const +{ + core::Ptr res = boundaryCurve_raw(); + return res; +} + +inline bool PatchFeatureInput::boundaryCurve(const core::Ptr& value) +{ + return boundaryCurve_raw(value.get()); +} + +inline FeatureOperations PatchFeatureInput::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool PatchFeatureInput::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline SurfaceContinuityTypes PatchFeatureInput::continuity() const +{ + SurfaceContinuityTypes res = continuity_raw(); + return res; +} + +inline bool PatchFeatureInput::continuity(SurfaceContinuityTypes value) +{ + return continuity_raw(value); +} + +inline core::Ptr PatchFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool PatchFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} + +inline core::Ptr PatchFeatureInput::creationOccurrence() const +{ + core::Ptr res = creationOccurrence_raw(); + return res; +} + +inline bool PatchFeatureInput::creationOccurrence(const core::Ptr& value) +{ + return creationOccurrence_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PATCHFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/PatchFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/PatchFeatures.h new file mode 100644 index 0000000..09955c3 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/PatchFeatures.h @@ -0,0 +1,137 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PATCHFEATURES_CPP__ +# define ADSK_FUSION_PATCHFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_PATCHFEATURES_API +# endif +#else +# define ADSK_FUSION_PATCHFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class PatchFeature; + class PatchFeatureInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing Patch features in a component +/// and supports the ability to create new Patch features. +class PatchFeatures : public core::Base { +public: + + /// Function that returns the specified patch feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified patch feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of Patch features in the collection. + size_t count() const; + + /// Creates a PatchFeatureInput object. Use properties and methods on the returned PatchFeatureInput + /// object to set other settings. The PatchFeatureInput object can then be used as input to the + /// add method to create the patch feature. + /// boundaryCurve : Defines the input geometry that will be used to define the boundary. This can be a sketch profile, + /// a single sketch curve, a single B-Rep edge, or a Path object. + /// If a single sketch curve or B-Rep edge is input, that is not closed, Fusion 360 will automatically find connected sketch curves + /// or B-Rep edges in order to define a closed loop. All sketch curves are valid as input. BRepEdges are valid if they are + /// an "open" edge, which means they are only used by one face. + /// If a Path is input it must define a closed shape and the B-Rep edges must be valid "open" edges. + /// operation : The feature operation to perform. Only 'NewBodyFeatureOperation' and 'NewComponentFeatureOperation' are + /// valid operations for patch features. + /// Returns the newly created PatchFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& boundaryCurve, FeatureOperations operation) const; + + /// Creates a new patch feature. + /// input : A PatchFeatureInput object that defines the desired patch feature. Use the createInput + /// method to create a new PatchFeatureInput object and then use methods on it + /// (the PatchFeatureInput object) to define the patch feature. + /// Returns the newly created PatchFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + typedef PatchFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_PATCHFEATURES_API static const char* classType(); + ADSK_FUSION_PATCHFEATURES_API const char* objectType() const override; + ADSK_FUSION_PATCHFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PATCHFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual PatchFeature* item_raw(size_t index) const = 0; + virtual PatchFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual PatchFeatureInput* createInput_raw(core::Base* boundaryCurve, FeatureOperations operation) const = 0; + virtual PatchFeature* add_raw(PatchFeatureInput* input) = 0; +}; + +// Inline wrappers + +inline core::Ptr PatchFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr PatchFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t PatchFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr PatchFeatures::createInput(const core::Ptr& boundaryCurve, FeatureOperations operation) const +{ + core::Ptr res = createInput_raw(boundaryCurve.get(), operation); + return res; +} + +inline core::Ptr PatchFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +template inline void PatchFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PATCHFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/Path.h b/usr/autodesk/CPP/include/Fusion/Features/Path.h new file mode 100644 index 0000000..b04b6b8 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/Path.h @@ -0,0 +1,166 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PATH_CPP__ +# define ADSK_FUSION_PATH_API XI_EXPORT +# else +# define ADSK_FUSION_PATH_API +# endif +#else +# define ADSK_FUSION_PATH_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class PathEntity; +}} + +namespace adsk { namespace fusion { + +/// The Path object represents a single set of connected curves. The order of the objects within the collection is the same as the connection order of the entities. +/// When using a Path to create a feature, the Path serves as a way to pass in the set of sketch entities and edges. When +/// getting the Path of an existing feature it returns the actual path used to define the feature geometry. In cases like a +/// sweep feature, this can result in using portions of the original input sketch curves or edges and the returned path +/// will provide these "partial" curves as the PathEntity objects. +class Path : public core::Base { +public: + + /// Function that returns the specified PathEntity using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of curves in the path. + size_t count() const; + + /// Indicates if the path is closed or not. Returns True in the case of a closed path. + bool isClosed() const; + + /// This property is not supported for the Path object. + core::Ptr assemblyContext() const; + + /// This property is not supported for the Path object. + core::Ptr nativeObject() const; + + /// This method is not supported for the Path object. + /// occurrence : + /// + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Creates a new Path that can be used as input to various features. For example, it is used + /// to create an open set of curves to create surfaces using extrude, revolve, and sweep. + /// It is also used to create the path for a sweep and sections and profiles and rails for lofts. And + /// it is used to define the boundary of a patch feature. + /// Although the creation of a path is very flexible as far as the types of entities and whether they + /// are planar or not, each of the features have specific requirements and the path must meet those + /// requirements. For example, a path for an extrusion can only contain sketch curves and must be planar, + /// whereas the path for a sweep can contain a mix of sketch curves and edges and can be in three dimensions. + /// curves : A SketchCurve, BRepEdge, or an ObjectCollection containing multiple sketch entities and/or BRepEdges. If a single sketch curve + /// or BRepEdge is input the chainCurves argument is used to determine if connected curves or edges (they do not need to be tangent) + /// should be automatically found. Searching for connected curves is only performed within the same sketch or open edges on the same + /// body. If multiple curves are provided the chainCurves argument is treated as false so only the specified input curves are + /// used. The input curves need to geometrically connect for a path to be created. + /// chainOptions : If a single SketchCurve or BRepEdge is input, this argument is used to specify the rules in how chained entities should be found. If + /// an ObjectCollection is input, this argument is ignored. + /// Returns the new Path object or null in the case of a failure. + static core::Ptr create(const core::Ptr& curves, ChainedCurveOptions chainOptions); + + /// Adds additional curves to the existing path. This can be useful when creating a complex path for a sweep and you + /// want to include sets of curves from multiple sketches and edges from multiple bodies. + /// curves : A SketchCurve, BRepEdge, or an ObjectCollection containing multiple sketch entities and/or BRepEdges. If a single sketch curve + /// or BRepEdge is input the chainCurves argument is used to determine if connected curves or edges (they do not need to be tangent) + /// should be automatically found. Searching for connected curves is only performed within the same sketch or open edges on the same + /// body. If multiple curves are provided the chainCurves argument is treated as false so only the specified input curves are + /// used. The input curves need to geometrically connect for a path to be created. + /// chainOptions : If a single SketchCurve or BRepEdge is input, this argument is used to specify the rules in how chained entities should be found. If + /// an ObjectCollection is input, this argument is ignored. + /// Returns a bool indicating if the process was successful or not. + bool addCurves(const core::Ptr& curves, ChainedCurveOptions chainOptions); + + ADSK_FUSION_PATH_API static const char* classType(); + ADSK_FUSION_PATH_API const char* objectType() const override; + ADSK_FUSION_PATH_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PATH_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual PathEntity* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual bool isClosed_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual Path* nativeObject_raw() const = 0; + virtual Path* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + ADSK_FUSION_PATH_API static Path* create_raw(core::Base* curves, ChainedCurveOptions chainOptions); + virtual bool addCurves_raw(core::Base* curves, ChainedCurveOptions chainOptions) = 0; +}; + +// Inline wrappers + +inline core::Ptr Path::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t Path::count() const +{ + size_t res = count_raw(); + return res; +} + +inline bool Path::isClosed() const +{ + bool res = isClosed_raw(); + return res; +} + +inline core::Ptr Path::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr Path::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr Path::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr Path::create(const core::Ptr& curves, ChainedCurveOptions chainOptions) +{ + core::Ptr res = create_raw(curves.get(), chainOptions); + return res; +} + +inline bool Path::addCurves(const core::Ptr& curves, ChainedCurveOptions chainOptions) +{ + bool res = addCurves_raw(curves.get(), chainOptions); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PATH_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/PathEntity.h b/usr/autodesk/CPP/include/Fusion/Features/PathEntity.h new file mode 100644 index 0000000..cd78893 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/PathEntity.h @@ -0,0 +1,142 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/CoreTypeDefs.h" +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PATHENTITY_CPP__ +# define ADSK_FUSION_PATHENTITY_API XI_EXPORT +# else +# define ADSK_FUSION_PATHENTITY_API +# endif +#else +# define ADSK_FUSION_PATHENTITY_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class Path; +}} +namespace adsk { namespace core { + class Curve3D; +}} + +namespace adsk { namespace fusion { + +/// The PathEntity object represents a curve within a path +class PathEntity : public core::Base { +public: + + /// Property that returns the geometry of the entity. + /// This is different from the original path curve if the true start point is not the same as the start point of the original path curve. + core::Ptr curve() const; + + /// Property that returns the type of the curve referenced by the path entity. This property allows you to determine what type of object will be returned by the Curve property. + core::Curve3DTypes curveType() const; + + /// Property that gets the sketch curve or edge this entity was derived from. + core::Ptr entity() const; + + /// Property that returns the parent Path of the entity. + core::Ptr parentPath() const; + + /// This property is not supported for a PathEntity object. + core::Ptr assemblyContext() const; + + /// This property is not supported for a PathEntity object. + core::Ptr nativeObject() const; + + /// This method is not supported for a PathEntity object. + /// occurrence : + /// + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Indicates if the orientation of this PathEntity is in the same direction or opposed to the natural direction + /// of the SketchCurve or BRepEdge object it is derived from. + bool isOpposedToEntity() const; + + ADSK_FUSION_PATHENTITY_API static const char* classType(); + ADSK_FUSION_PATHENTITY_API const char* objectType() const override; + ADSK_FUSION_PATHENTITY_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PATHENTITY_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Curve3D* curve_raw() const = 0; + virtual core::Curve3DTypes curveType_raw() const = 0; + virtual core::Base* entity_raw() const = 0; + virtual Path* parentPath_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual PathEntity* nativeObject_raw() const = 0; + virtual PathEntity* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual bool isOpposedToEntity_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr PathEntity::curve() const +{ + core::Ptr res = curve_raw(); + return res; +} + +inline core::Curve3DTypes PathEntity::curveType() const +{ + core::Curve3DTypes res = curveType_raw(); + return res; +} + +inline core::Ptr PathEntity::entity() const +{ + core::Ptr res = entity_raw(); + return res; +} + +inline core::Ptr PathEntity::parentPath() const +{ + core::Ptr res = parentPath_raw(); + return res; +} + +inline core::Ptr PathEntity::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr PathEntity::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr PathEntity::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline bool PathEntity::isOpposedToEntity() const +{ + bool res = isOpposedToEntity_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PATHENTITY_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/PathPatternFeature.h b/usr/autodesk/CPP/include/Fusion/Features/PathPatternFeature.h new file mode 100644 index 0000000..2f17c83 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/PathPatternFeature.h @@ -0,0 +1,327 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PATHPATTERNFEATURE_CPP__ +# define ADSK_FUSION_PATHPATTERNFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_PATHPATTERNFEATURE_API +# endif +#else +# define ADSK_FUSION_PATHPATTERNFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; + class Occurrence; + class Path; + class PatternElements; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing path pattern feature in a design. +class PathPatternFeature : public Feature { +public: + + /// Gets and sets the input entities. The collection can contain faces, features, bodies or occurrences. + /// All of the entities must be of a single type. For example, it can't contain features and occurrences + /// but only features or occurrences. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr inputEntities() const; + bool inputEntities(const core::Ptr& value); + + /// Gets and sets the path to create the pattern on path. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr path() const; + bool path(const core::Ptr& value); + + /// Gets the quantity of the elements. + /// Edit the value through ModelParameter. + /// Returns nothing in the case where the feature is non-parametric. + core::Ptr quantity() const; + + /// Gets the distance. + /// Edit the value through ModelParameter. + /// Returns nothing in the case where the feature is non-parametric. + core::Ptr distance() const; + + /// Gets and sets the start point on the path to count the distance. + /// It's between 0 and 1. 0 means start point of the path, 1 means end point of the path. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + double startPoint() const; + bool startPoint(double value); + + /// Gets and sets if flip the direction from start point. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isFlipDirection() const; + bool isFlipDirection(bool value); + + /// Gets and sets how the distance between elements is computed. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + PatternDistanceType patternDistanceType() const; + bool patternDistanceType(PatternDistanceType value); + + /// Gets and sets if the pattern is in one direction or symmetric. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isSymmetric() const; + bool isSymmetric(bool value); + + /// Gets and sets if the orientation is along path. + /// If false, the orientation is identical. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isOrientationAlongPath() const; + bool isOrientationAlongPath(bool value); + + /// Gets and sets the id's of the elements to suppress. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + std::vector suppressedElementsIds() const; + bool suppressedElementsIds(const std::vector& value); + + /// Gets the PatternElements collection that contains the elements created by this pattern. + core::Ptr patternElements() const; + + /// Get the features that were created for this mirror. + /// Returns null in the case where the feature is parametric. + core::Ptr resultFeatures() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns the type of entities the pattern consists of. This can be used to help + /// determine the type of results that will be found in the pattern elements. + PatternEntityTypes patternEntityType() const; + + /// Gets and sets the compute option for this pattern feature. + /// This property only applies when patterning features and is ignored in the direct modeling environment. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + PatternComputeOptions patternComputeOption() const; + bool patternComputeOption(PatternComputeOptions value); + + ADSK_FUSION_PATHPATTERNFEATURE_API static const char* classType(); + ADSK_FUSION_PATHPATTERNFEATURE_API const char* objectType() const override; + ADSK_FUSION_PATHPATTERNFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PATHPATTERNFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* inputEntities_raw() const = 0; + virtual bool inputEntities_raw(core::ObjectCollection* value) = 0; + virtual Path* path_raw() const = 0; + virtual bool path_raw(Path* value) = 0; + virtual ModelParameter* quantity_raw() const = 0; + virtual ModelParameter* distance_raw() const = 0; + virtual double startPoint_raw() const = 0; + virtual bool startPoint_raw(double value) = 0; + virtual bool isFlipDirection_raw() const = 0; + virtual bool isFlipDirection_raw(bool value) = 0; + virtual PatternDistanceType patternDistanceType_raw() const = 0; + virtual bool patternDistanceType_raw(PatternDistanceType value) = 0; + virtual bool isSymmetric_raw() const = 0; + virtual bool isSymmetric_raw(bool value) = 0; + virtual bool isOrientationAlongPath_raw() const = 0; + virtual bool isOrientationAlongPath_raw(bool value) = 0; + virtual size_t* suppressedElementsIds_raw(size_t& return_size) const = 0; + virtual bool suppressedElementsIds_raw(const size_t* value, size_t value_size) = 0; + virtual PatternElements* patternElements_raw() const = 0; + virtual core::ObjectCollection* resultFeatures_raw() const = 0; + virtual PathPatternFeature* nativeObject_raw() const = 0; + virtual PathPatternFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual PatternEntityTypes patternEntityType_raw() const = 0; + virtual PatternComputeOptions patternComputeOption_raw() const = 0; + virtual bool patternComputeOption_raw(PatternComputeOptions value) = 0; +}; + +// Inline wrappers + +inline core::Ptr PathPatternFeature::inputEntities() const +{ + core::Ptr res = inputEntities_raw(); + return res; +} + +inline bool PathPatternFeature::inputEntities(const core::Ptr& value) +{ + return inputEntities_raw(value.get()); +} + +inline core::Ptr PathPatternFeature::path() const +{ + core::Ptr res = path_raw(); + return res; +} + +inline bool PathPatternFeature::path(const core::Ptr& value) +{ + return path_raw(value.get()); +} + +inline core::Ptr PathPatternFeature::quantity() const +{ + core::Ptr res = quantity_raw(); + return res; +} + +inline core::Ptr PathPatternFeature::distance() const +{ + core::Ptr res = distance_raw(); + return res; +} + +inline double PathPatternFeature::startPoint() const +{ + double res = startPoint_raw(); + return res; +} + +inline bool PathPatternFeature::startPoint(double value) +{ + return startPoint_raw(value); +} + +inline bool PathPatternFeature::isFlipDirection() const +{ + bool res = isFlipDirection_raw(); + return res; +} + +inline bool PathPatternFeature::isFlipDirection(bool value) +{ + return isFlipDirection_raw(value); +} + +inline PatternDistanceType PathPatternFeature::patternDistanceType() const +{ + PatternDistanceType res = patternDistanceType_raw(); + return res; +} + +inline bool PathPatternFeature::patternDistanceType(PatternDistanceType value) +{ + return patternDistanceType_raw(value); +} + +inline bool PathPatternFeature::isSymmetric() const +{ + bool res = isSymmetric_raw(); + return res; +} + +inline bool PathPatternFeature::isSymmetric(bool value) +{ + return isSymmetric_raw(value); +} + +inline bool PathPatternFeature::isOrientationAlongPath() const +{ + bool res = isOrientationAlongPath_raw(); + return res; +} + +inline bool PathPatternFeature::isOrientationAlongPath(bool value) +{ + return isOrientationAlongPath_raw(value); +} + +inline std::vector PathPatternFeature::suppressedElementsIds() const +{ + std::vector res; + size_t s; + + size_t* p= suppressedElementsIds_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool PathPatternFeature::suppressedElementsIds(const std::vector& value) +{ + return suppressedElementsIds_raw(value.empty() ? NULL : &value[0], value.size()); +} + +inline core::Ptr PathPatternFeature::patternElements() const +{ + core::Ptr res = patternElements_raw(); + return res; +} + +inline core::Ptr PathPatternFeature::resultFeatures() const +{ + core::Ptr res = resultFeatures_raw(); + return res; +} + +inline core::Ptr PathPatternFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr PathPatternFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline PatternEntityTypes PathPatternFeature::patternEntityType() const +{ + PatternEntityTypes res = patternEntityType_raw(); + return res; +} + +inline PatternComputeOptions PathPatternFeature::patternComputeOption() const +{ + PatternComputeOptions res = patternComputeOption_raw(); + return res; +} + +inline bool PathPatternFeature::patternComputeOption(PatternComputeOptions value) +{ + return patternComputeOption_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PATHPATTERNFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/PathPatternFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/PathPatternFeatureInput.h new file mode 100644 index 0000000..73ab9f8 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/PathPatternFeatureInput.h @@ -0,0 +1,257 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PATHPATTERNFEATUREINPUT_CPP__ +# define ADSK_FUSION_PATHPATTERNFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_PATHPATTERNFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_PATHPATTERNFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class Path; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a path pattern +/// feature. +class PathPatternFeatureInput : public core::Base { +public: + + /// Gets and sets the input entities. The collection can contain faces, features, bodies or occurrences. + /// All of the entities must be of a single type. For example, it can't contain features and occurrences + /// but only features or occurrences. + core::Ptr inputEntities() const; + bool inputEntities(const core::Ptr& value); + + /// Gets and sets the path to create the pattern on path. + core::Ptr path() const; + bool path(const core::Ptr& value); + + /// Gets and sets quantity of the elements. + core::Ptr quantity() const; + bool quantity(const core::Ptr& value); + + /// Gets and sets the distance. + core::Ptr distance() const; + bool distance(const core::Ptr& value); + + /// Gets and sets the start point on the path to count the distance. + /// It's between 0 and 1. 0 means start point of the path, 1 means end point of the path. + double startPoint() const; + bool startPoint(double value); + + /// Gets and sets if flip the direction from start point. + bool isFlipDirection() const; + bool isFlipDirection(bool value); + + /// Gets and sets how the distance between elements is computed. + PatternDistanceType patternDistanceType() const; + bool patternDistanceType(PatternDistanceType value); + + /// Gets and sets if the pattern is in one direction or symmetric. + bool isSymmetric() const; + bool isSymmetric(bool value); + + /// Gets and sets if the orientation is along path. + /// If false, the orientation is identical. + bool isOrientationAlongPath() const; + bool isOrientationAlongPath(bool value); + + /// Gets and sets the compute option when patterning features. The default value for this is AdjustPatternCompute. + /// This property only applies when patterning features and is ignored in the direct modeling environment. + PatternComputeOptions patternComputeOption() const; + bool patternComputeOption(PatternComputeOptions value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_PATHPATTERNFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_PATHPATTERNFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_PATHPATTERNFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PATHPATTERNFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* inputEntities_raw() const = 0; + virtual bool inputEntities_raw(core::ObjectCollection* value) = 0; + virtual Path* path_raw() const = 0; + virtual bool path_raw(Path* value) = 0; + virtual core::ValueInput* quantity_raw() const = 0; + virtual bool quantity_raw(core::ValueInput* value) = 0; + virtual core::ValueInput* distance_raw() const = 0; + virtual bool distance_raw(core::ValueInput* value) = 0; + virtual double startPoint_raw() const = 0; + virtual bool startPoint_raw(double value) = 0; + virtual bool isFlipDirection_raw() const = 0; + virtual bool isFlipDirection_raw(bool value) = 0; + virtual PatternDistanceType patternDistanceType_raw() const = 0; + virtual bool patternDistanceType_raw(PatternDistanceType value) = 0; + virtual bool isSymmetric_raw() const = 0; + virtual bool isSymmetric_raw(bool value) = 0; + virtual bool isOrientationAlongPath_raw() const = 0; + virtual bool isOrientationAlongPath_raw(bool value) = 0; + virtual PatternComputeOptions patternComputeOption_raw() const = 0; + virtual bool patternComputeOption_raw(PatternComputeOptions value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr PathPatternFeatureInput::inputEntities() const +{ + core::Ptr res = inputEntities_raw(); + return res; +} + +inline bool PathPatternFeatureInput::inputEntities(const core::Ptr& value) +{ + return inputEntities_raw(value.get()); +} + +inline core::Ptr PathPatternFeatureInput::path() const +{ + core::Ptr res = path_raw(); + return res; +} + +inline bool PathPatternFeatureInput::path(const core::Ptr& value) +{ + return path_raw(value.get()); +} + +inline core::Ptr PathPatternFeatureInput::quantity() const +{ + core::Ptr res = quantity_raw(); + return res; +} + +inline bool PathPatternFeatureInput::quantity(const core::Ptr& value) +{ + return quantity_raw(value.get()); +} + +inline core::Ptr PathPatternFeatureInput::distance() const +{ + core::Ptr res = distance_raw(); + return res; +} + +inline bool PathPatternFeatureInput::distance(const core::Ptr& value) +{ + return distance_raw(value.get()); +} + +inline double PathPatternFeatureInput::startPoint() const +{ + double res = startPoint_raw(); + return res; +} + +inline bool PathPatternFeatureInput::startPoint(double value) +{ + return startPoint_raw(value); +} + +inline bool PathPatternFeatureInput::isFlipDirection() const +{ + bool res = isFlipDirection_raw(); + return res; +} + +inline bool PathPatternFeatureInput::isFlipDirection(bool value) +{ + return isFlipDirection_raw(value); +} + +inline PatternDistanceType PathPatternFeatureInput::patternDistanceType() const +{ + PatternDistanceType res = patternDistanceType_raw(); + return res; +} + +inline bool PathPatternFeatureInput::patternDistanceType(PatternDistanceType value) +{ + return patternDistanceType_raw(value); +} + +inline bool PathPatternFeatureInput::isSymmetric() const +{ + bool res = isSymmetric_raw(); + return res; +} + +inline bool PathPatternFeatureInput::isSymmetric(bool value) +{ + return isSymmetric_raw(value); +} + +inline bool PathPatternFeatureInput::isOrientationAlongPath() const +{ + bool res = isOrientationAlongPath_raw(); + return res; +} + +inline bool PathPatternFeatureInput::isOrientationAlongPath(bool value) +{ + return isOrientationAlongPath_raw(value); +} + +inline PatternComputeOptions PathPatternFeatureInput::patternComputeOption() const +{ + PatternComputeOptions res = patternComputeOption_raw(); + return res; +} + +inline bool PathPatternFeatureInput::patternComputeOption(PatternComputeOptions value) +{ + return patternComputeOption_raw(value); +} + +inline core::Ptr PathPatternFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool PathPatternFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PATHPATTERNFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/PathPatternFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/PathPatternFeatures.h new file mode 100644 index 0000000..0c09a55 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/PathPatternFeatures.h @@ -0,0 +1,144 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PATHPATTERNFEATURES_CPP__ +# define ADSK_FUSION_PATHPATTERNFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_PATHPATTERNFEATURES_API +# endif +#else +# define ADSK_FUSION_PATHPATTERNFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Path; + class PathPatternFeature; + class PathPatternFeatureInput; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing path pattern features in a component +/// and supports the ability to create new path pattern features. +class PathPatternFeatures : public core::Base { +public: + + /// Function that returns the specified path pattern feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of path pattern features in the collection. + size_t count() const; + + /// Creates a PathPatternFeatureInput object. Use properties and methods on this object + /// to define the path pattern you want to create and then use the Add method, passing in + /// the PathPatternFeatureInput object. + /// inputEntities : The collection can contain faces, features, bodies or occurrences. + /// All of the entities must be of a single type. For example, it can't contain features and occurrences + /// but only features or occurrences. + /// path : The Path object that represents a single set of connected curves along which to drive the pattern. + /// quantity : Specifies the number of instances in the first direction. + /// distance : Specifies the distance. How this value is used depends on the value of the PatternDistanceType property. A + /// negative value can be used to change the direction. + /// If the value is ExtentPatternDistanceType then it defines the total distance of the pattern. + /// If the value is SpacingPatternDistanceType then it defines the distance between each element. + /// patternDistanceType : Specifies how the distance between elements is computed. + /// Returns the newly created PathPatternFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& inputEntities, const core::Ptr& path, const core::Ptr& quantity, const core::Ptr& distance, PatternDistanceType patternDistanceType) const; + + /// Creates a new path pattern feature. + /// input : A PathPatternFeatureInput object that defines the desired path pattern. Use the createInput + /// method to create a new PathPatternFeatureInput object and then use methods on it + /// (the PathPatternFeatureInput object) to define the path pattern. + /// Returns the newly created PathPatternFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified path pattern feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef PathPatternFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_PATHPATTERNFEATURES_API static const char* classType(); + ADSK_FUSION_PATHPATTERNFEATURES_API const char* objectType() const override; + ADSK_FUSION_PATHPATTERNFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PATHPATTERNFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual PathPatternFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual PathPatternFeatureInput* createInput_raw(core::ObjectCollection* inputEntities, Path* path, core::ValueInput* quantity, core::ValueInput* distance, PatternDistanceType patternDistanceType) const = 0; + virtual PathPatternFeature* add_raw(PathPatternFeatureInput* input) = 0; + virtual PathPatternFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr PathPatternFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t PathPatternFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr PathPatternFeatures::createInput(const core::Ptr& inputEntities, const core::Ptr& path, const core::Ptr& quantity, const core::Ptr& distance, PatternDistanceType patternDistanceType) const +{ + core::Ptr res = createInput_raw(inputEntities.get(), path.get(), quantity.get(), distance.get(), patternDistanceType); + return res; +} + +inline core::Ptr PathPatternFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr PathPatternFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void PathPatternFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PATHPATTERNFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/PatternElement.h b/usr/autodesk/CPP/include/Fusion/Features/PatternElement.h new file mode 100644 index 0000000..354fee1 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/PatternElement.h @@ -0,0 +1,163 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PATTERNELEMENT_CPP__ +# define ADSK_FUSION_PATTERNELEMENT_API XI_EXPORT +# else +# define ADSK_FUSION_PATTERNELEMENT_API +# endif +#else +# define ADSK_FUSION_PATTERNELEMENT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepFace; + class Feature; + class Occurrence; +}} +namespace adsk { namespace core { + class Matrix3D; +}} + +namespace adsk { namespace fusion { + +/// This class defines the properties that pertain to the pattern element. +class PatternElement : public core::Base { +public: + + /// Gets the faces generated as a result of this particular element. + std::vector> faces() const; + + /// Gets the id of this element within the pattern. + size_t id() const; + + /// Gets the feature pattern this element is a member of. + core::Ptr parentFeature() const; + + /// Gets and sets whether the element is suppressed or not. A value of True indicates it is suppressed + bool isSuppressed() const; + bool isSuppressed(bool value); + + /// Get the transform that describes this elements relative position to the parent object(s). + /// The transform returned for the first element in a pattern will be an identity matrix. + core::Ptr transform() const; + + /// Get the name of the pattern element. + std::string name() const; + + /// If the patternEntityType property of the parent feature returns OccurrencesPatternType + /// then this property will return the occurrences associated with this particular pattern + /// element. + std::vector> occurrences() const; + + ADSK_FUSION_PATTERNELEMENT_API static const char* classType(); + ADSK_FUSION_PATTERNELEMENT_API const char* objectType() const override; + ADSK_FUSION_PATTERNELEMENT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PATTERNELEMENT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepFace** faces_raw(size_t& return_size) const = 0; + virtual size_t id_raw() const = 0; + virtual Feature* parentFeature_raw() const = 0; + virtual bool isSuppressed_raw() const = 0; + virtual bool isSuppressed_raw(bool value) = 0; + virtual core::Matrix3D* transform_raw() const = 0; + virtual char* name_raw() const = 0; + virtual Occurrence** occurrences_raw(size_t& return_size) const = 0; +}; + +// Inline wrappers + +inline std::vector> PatternElement::faces() const +{ + std::vector> res; + size_t s; + + BRepFace** p= faces_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline size_t PatternElement::id() const +{ + size_t res = id_raw(); + return res; +} + +inline core::Ptr PatternElement::parentFeature() const +{ + core::Ptr res = parentFeature_raw(); + return res; +} + +inline bool PatternElement::isSuppressed() const +{ + bool res = isSuppressed_raw(); + return res; +} + +inline bool PatternElement::isSuppressed(bool value) +{ + return isSuppressed_raw(value); +} + +inline core::Ptr PatternElement::transform() const +{ + core::Ptr res = transform_raw(); + return res; +} + +inline std::string PatternElement::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> PatternElement::occurrences() const +{ + std::vector> res; + size_t s; + + Occurrence** p= occurrences_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PATTERNELEMENT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/PatternElements.h b/usr/autodesk/CPP/include/Fusion/Features/PatternElements.h new file mode 100644 index 0000000..efa2330 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/PatternElements.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PATTERNELEMENTS_CPP__ +# define ADSK_FUSION_PATTERNELEMENTS_API XI_EXPORT +# else +# define ADSK_FUSION_PATTERNELEMENTS_API +# endif +#else +# define ADSK_FUSION_PATTERNELEMENTS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class PatternElement; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to pattern elements of mirror and pattern features. +class PatternElements : public core::Base { +public: + + /// Function that returns the specified pattern element using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of pattern elements in the collection. + size_t count() const; + + typedef PatternElement iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_PATTERNELEMENTS_API static const char* classType(); + ADSK_FUSION_PATTERNELEMENTS_API const char* objectType() const override; + ADSK_FUSION_PATTERNELEMENTS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PATTERNELEMENTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual PatternElement* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr PatternElements::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t PatternElements::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void PatternElements::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PATTERNELEMENTS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/PipeFeature.h b/usr/autodesk/CPP/include/Fusion/Features/PipeFeature.h new file mode 100644 index 0000000..f6ed9ef --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/PipeFeature.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PIPEFEATURE_CPP__ +# define ADSK_FUSION_PIPEFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_PIPEFEATURE_API +# endif +#else +# define ADSK_FUSION_PIPEFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Object that represents an existing pipe feature in a design. +class PipeFeature : public Feature { +public: + + ADSK_FUSION_PIPEFEATURE_API static const char* classType(); + ADSK_FUSION_PIPEFEATURE_API const char* objectType() const override; + ADSK_FUSION_PIPEFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PIPEFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PIPEFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/PipeFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/PipeFeatures.h new file mode 100644 index 0000000..66ce035 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/PipeFeatures.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PIPEFEATURES_CPP__ +# define ADSK_FUSION_PIPEFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_PIPEFEATURES_API +# endif +#else +# define ADSK_FUSION_PIPEFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class PipeFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing pipe features in a design. +class PipeFeatures : public core::Base { +public: + + /// Function that returns the specified pipe feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified pipe feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of pipe features in the collection. + size_t count() const; + + typedef PipeFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_PIPEFEATURES_API static const char* classType(); + ADSK_FUSION_PIPEFEATURES_API const char* objectType() const override; + ADSK_FUSION_PIPEFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PIPEFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual PipeFeature* item_raw(size_t index) const = 0; + virtual PipeFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr PipeFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr PipeFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t PipeFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void PipeFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PIPEFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/PlaneAndOffsetsHolePositionDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/PlaneAndOffsetsHolePositionDefinition.h new file mode 100644 index 0000000..6c7ccb1 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/PlaneAndOffsetsHolePositionDefinition.h @@ -0,0 +1,109 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "HolePositionDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PLANEANDOFFSETSHOLEPOSITIONDEFINITION_CPP__ +# define ADSK_FUSION_PLANEANDOFFSETSHOLEPOSITIONDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_PLANEANDOFFSETSHOLEPOSITIONDEFINITION_API +# endif +#else +# define ADSK_FUSION_PLANEANDOFFSETSHOLEPOSITIONDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepEdge; + class ModelParameter; +}} + +namespace adsk { namespace fusion { + +/// Provides positioning information for a hole that is positioned on a plane +/// and at a distance from one or two edges. +class PlaneAndOffsetsHolePositionDefinition : public HolePositionDefinition { +public: + + /// Returns the plane that defines the orientation and start of the hole. + core::Ptr planarEntity() const; + + /// The first of 2 edges the hole position is measured from. OffsetOne provides access to + /// the model parameter controlling the offset distance. + core::Ptr edgeOne() const; + + /// Returns the model parameter controlling the distance from the center of the hole + /// to EdgeOne. + core::Ptr offsetOne() const; + + /// The second of two edges the hole position is measured from. OffsetTwo provides access + /// to the model parameter controlling the offset distance. This property can return null + /// in the case where only one edge is used. + core::Ptr edgeTwo() const; + + /// Returns the model parameter controlling the distance from the center of the hole + /// to EdgeTwo. This property returns null in the case where only one edge is used. + core::Ptr offsetTwo() const; + + ADSK_FUSION_PLANEANDOFFSETSHOLEPOSITIONDEFINITION_API static const char* classType(); + ADSK_FUSION_PLANEANDOFFSETSHOLEPOSITIONDEFINITION_API const char* objectType() const override; + ADSK_FUSION_PLANEANDOFFSETSHOLEPOSITIONDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PLANEANDOFFSETSHOLEPOSITIONDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* planarEntity_raw() const = 0; + virtual BRepEdge* edgeOne_raw() const = 0; + virtual ModelParameter* offsetOne_raw() const = 0; + virtual BRepEdge* edgeTwo_raw() const = 0; + virtual ModelParameter* offsetTwo_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr PlaneAndOffsetsHolePositionDefinition::planarEntity() const +{ + core::Ptr res = planarEntity_raw(); + return res; +} + +inline core::Ptr PlaneAndOffsetsHolePositionDefinition::edgeOne() const +{ + core::Ptr res = edgeOne_raw(); + return res; +} + +inline core::Ptr PlaneAndOffsetsHolePositionDefinition::offsetOne() const +{ + core::Ptr res = offsetOne_raw(); + return res; +} + +inline core::Ptr PlaneAndOffsetsHolePositionDefinition::edgeTwo() const +{ + core::Ptr res = edgeTwo_raw(); + return res; +} + +inline core::Ptr PlaneAndOffsetsHolePositionDefinition::offsetTwo() const +{ + core::Ptr res = offsetTwo_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PLANEANDOFFSETSHOLEPOSITIONDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/PointHolePositionDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/PointHolePositionDefinition.h new file mode 100644 index 0000000..e3b8652 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/PointHolePositionDefinition.h @@ -0,0 +1,69 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "HolePositionDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_POINTHOLEPOSITIONDEFINITION_CPP__ +# define ADSK_FUSION_POINTHOLEPOSITIONDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_POINTHOLEPOSITIONDEFINITION_API +# endif +#else +# define ADSK_FUSION_POINTHOLEPOSITIONDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Provides positioning information for a hole that is positioned relative to a 3D coordinate +/// point. +class PointHolePositionDefinition : public HolePositionDefinition { +public: + + /// Returns the plane that defines the orientation and start of the hole. + core::Ptr planarEntity() const; + + /// Returns the coordinates defining the position of the hole. + core::Ptr point() const; + + ADSK_FUSION_POINTHOLEPOSITIONDEFINITION_API static const char* classType(); + ADSK_FUSION_POINTHOLEPOSITIONDEFINITION_API const char* objectType() const override; + ADSK_FUSION_POINTHOLEPOSITIONDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_POINTHOLEPOSITIONDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* planarEntity_raw() const = 0; + virtual core::Base* point_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr PointHolePositionDefinition::planarEntity() const +{ + core::Ptr res = planarEntity_raw(); + return res; +} + +inline core::Ptr PointHolePositionDefinition::point() const +{ + core::Ptr res = point_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_POINTHOLEPOSITIONDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ProfilePlaneStartDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/ProfilePlaneStartDefinition.h new file mode 100644 index 0000000..2b1ec31 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ProfilePlaneStartDefinition.h @@ -0,0 +1,74 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExtentDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PROFILEPLANESTARTDEFINITION_CPP__ +# define ADSK_FUSION_PROFILEPLANESTARTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_PROFILEPLANESTARTDEFINITION_API +# endif +#else +# define ADSK_FUSION_PROFILEPLANESTARTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Plane; +}} + +namespace adsk { namespace fusion { + +/// A definition object that is used to define a feature whose start plane is the sketch plane of the profile. +class ProfilePlaneStartDefinition : public ExtentDefinition { +public: + + /// Statically creates a new ProfilePlaneStartDefinition object. This is used as input when creating a new + /// feature and defining the starting condition. + /// Returns the newly created ProfilePlaneStartDefinition object or null in the case of a failure. + static core::Ptr create(); + + /// Returns the geometric definition of the profile plane. + core::Ptr profilePlane() const; + + ADSK_FUSION_PROFILEPLANESTARTDEFINITION_API static const char* classType(); + ADSK_FUSION_PROFILEPLANESTARTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_PROFILEPLANESTARTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PROFILEPLANESTARTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_PROFILEPLANESTARTDEFINITION_API static ProfilePlaneStartDefinition* create_raw(); + virtual core::Plane* profilePlane_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ProfilePlaneStartDefinition::create() +{ + core::Ptr res = create_raw(); + return res; +} + +inline core::Ptr ProfilePlaneStartDefinition::profilePlane() const +{ + core::Ptr res = profilePlane_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PROFILEPLANESTARTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/RectangularPatternFeature.h b/usr/autodesk/CPP/include/Fusion/Features/RectangularPatternFeature.h new file mode 100644 index 0000000..4952c34 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/RectangularPatternFeature.h @@ -0,0 +1,357 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_RECTANGULARPATTERNFEATURE_CPP__ +# define ADSK_FUSION_RECTANGULARPATTERNFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_RECTANGULARPATTERNFEATURE_API +# endif +#else +# define ADSK_FUSION_RECTANGULARPATTERNFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; + class Occurrence; + class PatternElements; +}} +namespace adsk { namespace core { + class ObjectCollection; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing rectangular pattern feature in a design. +class RectangularPatternFeature : public Feature { +public: + + /// Gets and sets the input entities. The collection can contain faces, features, bodies or occurrences. + /// All of the entities must be of a single type. For example, it can't contain features and occurrences + /// but only features or occurrences. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr inputEntities() const; + bool inputEntities(const core::Ptr& value); + + /// Gets and sets the first direction entity. + /// This can be a linear edge, construction axis, sketch line or rectangular pattern feature. + /// If a rectangular pattern feature is set, the directionOneEntity and directionTwoEntity properties return the same rectangular pattern feature. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr directionOneEntity() const; + bool directionOneEntity(const core::Ptr& value); + + /// Gets and sets the second direction entity. + /// This can be a linear edge, construction axis, sketch line or rectangular pattern feature. + /// If a rectangular pattern feature is set, the directionOneEntity and directionTwoEntity properties return the same rectangular pattern feature. + /// This can be null when not entity has been specified to control the second direction. In this case Fusion 360 will compute a default direction which is + /// 90 degrees to the direction one. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr directionTwoEntity() const; + bool directionTwoEntity(const core::Ptr& value); + + /// Returns a Vector3D indicating the positive direction of direction one. + core::Ptr directionOne() const; + + /// Returns a Vector3D indicating the positive direction of direction two. + core::Ptr directionTwo() const; + + /// Gets the number of instances in the first direction. + /// Edit the value through ModelParameter. + /// Returns nothing in the case where the feature is non-parametric. + core::Ptr quantityOne() const; + + /// Gets the number of instances in the second direction. + /// Edit the value through ModelParameter. + /// Returns nothing in the case where the feature is non-parametric. + core::Ptr quantityTwo() const; + + /// Gets the distance in the first direction. + /// Edit the value through ModelParameter. + /// Returns nothing in the case where the feature is non-parametric. + core::Ptr distanceOne() const; + + /// Gets the distance in the second direction. + /// Edit the value through ModelParameter. + /// Returns nothing in the case where the feature is non-parametric. + core::Ptr distanceTwo() const; + + /// Gets and sets if the pattern in direction one is in one direction or symmetric. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isSymmetricInDirectionOne() const; + bool isSymmetricInDirectionOne(bool value); + + /// Gets and sets if the pattern in direction two is in one direction or symmetric. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isSymmetricInDirectionTwo() const; + bool isSymmetricInDirectionTwo(bool value); + + /// Gets and sets how the distance between elements is computed. Is initialized to ExtentPatternDistanceType when a new + /// RectangularPatternFeatureInput has been created. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + PatternDistanceType patternDistanceType() const; + bool patternDistanceType(PatternDistanceType value); + + /// Gets and sets the ids of the patterns to suppress. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + std::vector suppressedElementsIds() const; + bool suppressedElementsIds(const std::vector& value); + + /// Gets the PatternElements collection that contains the elements created by this pattern. + core::Ptr patternElements() const; + + /// Get the features that were created for this pattern. + /// Returns null in the case where the feature is parametric. + core::Ptr resultFeatures() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns the type of entities the pattern consists of. This can be used to help + /// determine the type of results that will be found in the pattern elements. + PatternEntityTypes patternEntityType() const; + + /// Gets and sets the compute option for this pattern feature. + /// This property only applies when patterning features and is ignored in the direct modeling environment. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + PatternComputeOptions patternComputeOption() const; + bool patternComputeOption(PatternComputeOptions value); + + ADSK_FUSION_RECTANGULARPATTERNFEATURE_API static const char* classType(); + ADSK_FUSION_RECTANGULARPATTERNFEATURE_API const char* objectType() const override; + ADSK_FUSION_RECTANGULARPATTERNFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_RECTANGULARPATTERNFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* inputEntities_raw() const = 0; + virtual bool inputEntities_raw(core::ObjectCollection* value) = 0; + virtual core::Base* directionOneEntity_raw() const = 0; + virtual bool directionOneEntity_raw(core::Base* value) = 0; + virtual core::Base* directionTwoEntity_raw() const = 0; + virtual bool directionTwoEntity_raw(core::Base* value) = 0; + virtual core::Vector3D* directionOne_raw() const = 0; + virtual core::Vector3D* directionTwo_raw() const = 0; + virtual ModelParameter* quantityOne_raw() const = 0; + virtual ModelParameter* quantityTwo_raw() const = 0; + virtual ModelParameter* distanceOne_raw() const = 0; + virtual ModelParameter* distanceTwo_raw() const = 0; + virtual bool isSymmetricInDirectionOne_raw() const = 0; + virtual bool isSymmetricInDirectionOne_raw(bool value) = 0; + virtual bool isSymmetricInDirectionTwo_raw() const = 0; + virtual bool isSymmetricInDirectionTwo_raw(bool value) = 0; + virtual PatternDistanceType patternDistanceType_raw() const = 0; + virtual bool patternDistanceType_raw(PatternDistanceType value) = 0; + virtual size_t* suppressedElementsIds_raw(size_t& return_size) const = 0; + virtual bool suppressedElementsIds_raw(const size_t* value, size_t value_size) = 0; + virtual PatternElements* patternElements_raw() const = 0; + virtual core::ObjectCollection* resultFeatures_raw() const = 0; + virtual RectangularPatternFeature* nativeObject_raw() const = 0; + virtual RectangularPatternFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual PatternEntityTypes patternEntityType_raw() const = 0; + virtual PatternComputeOptions patternComputeOption_raw() const = 0; + virtual bool patternComputeOption_raw(PatternComputeOptions value) = 0; +}; + +// Inline wrappers + +inline core::Ptr RectangularPatternFeature::inputEntities() const +{ + core::Ptr res = inputEntities_raw(); + return res; +} + +inline bool RectangularPatternFeature::inputEntities(const core::Ptr& value) +{ + return inputEntities_raw(value.get()); +} + +inline core::Ptr RectangularPatternFeature::directionOneEntity() const +{ + core::Ptr res = directionOneEntity_raw(); + return res; +} + +inline bool RectangularPatternFeature::directionOneEntity(const core::Ptr& value) +{ + return directionOneEntity_raw(value.get()); +} + +inline core::Ptr RectangularPatternFeature::directionTwoEntity() const +{ + core::Ptr res = directionTwoEntity_raw(); + return res; +} + +inline bool RectangularPatternFeature::directionTwoEntity(const core::Ptr& value) +{ + return directionTwoEntity_raw(value.get()); +} + +inline core::Ptr RectangularPatternFeature::directionOne() const +{ + core::Ptr res = directionOne_raw(); + return res; +} + +inline core::Ptr RectangularPatternFeature::directionTwo() const +{ + core::Ptr res = directionTwo_raw(); + return res; +} + +inline core::Ptr RectangularPatternFeature::quantityOne() const +{ + core::Ptr res = quantityOne_raw(); + return res; +} + +inline core::Ptr RectangularPatternFeature::quantityTwo() const +{ + core::Ptr res = quantityTwo_raw(); + return res; +} + +inline core::Ptr RectangularPatternFeature::distanceOne() const +{ + core::Ptr res = distanceOne_raw(); + return res; +} + +inline core::Ptr RectangularPatternFeature::distanceTwo() const +{ + core::Ptr res = distanceTwo_raw(); + return res; +} + +inline bool RectangularPatternFeature::isSymmetricInDirectionOne() const +{ + bool res = isSymmetricInDirectionOne_raw(); + return res; +} + +inline bool RectangularPatternFeature::isSymmetricInDirectionOne(bool value) +{ + return isSymmetricInDirectionOne_raw(value); +} + +inline bool RectangularPatternFeature::isSymmetricInDirectionTwo() const +{ + bool res = isSymmetricInDirectionTwo_raw(); + return res; +} + +inline bool RectangularPatternFeature::isSymmetricInDirectionTwo(bool value) +{ + return isSymmetricInDirectionTwo_raw(value); +} + +inline PatternDistanceType RectangularPatternFeature::patternDistanceType() const +{ + PatternDistanceType res = patternDistanceType_raw(); + return res; +} + +inline bool RectangularPatternFeature::patternDistanceType(PatternDistanceType value) +{ + return patternDistanceType_raw(value); +} + +inline std::vector RectangularPatternFeature::suppressedElementsIds() const +{ + std::vector res; + size_t s; + + size_t* p= suppressedElementsIds_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool RectangularPatternFeature::suppressedElementsIds(const std::vector& value) +{ + return suppressedElementsIds_raw(value.empty() ? NULL : &value[0], value.size()); +} + +inline core::Ptr RectangularPatternFeature::patternElements() const +{ + core::Ptr res = patternElements_raw(); + return res; +} + +inline core::Ptr RectangularPatternFeature::resultFeatures() const +{ + core::Ptr res = resultFeatures_raw(); + return res; +} + +inline core::Ptr RectangularPatternFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr RectangularPatternFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline PatternEntityTypes RectangularPatternFeature::patternEntityType() const +{ + PatternEntityTypes res = patternEntityType_raw(); + return res; +} + +inline PatternComputeOptions RectangularPatternFeature::patternComputeOption() const +{ + PatternComputeOptions res = patternComputeOption_raw(); + return res; +} + +inline bool RectangularPatternFeature::patternComputeOption(PatternComputeOptions value) +{ + return patternComputeOption_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_RECTANGULARPATTERNFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/RectangularPatternFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/RectangularPatternFeatureInput.h new file mode 100644 index 0000000..d6ade6e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/RectangularPatternFeatureInput.h @@ -0,0 +1,314 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_RECTANGULARPATTERNFEATUREINPUT_CPP__ +# define ADSK_FUSION_RECTANGULARPATTERNFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_RECTANGULARPATTERNFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_RECTANGULARPATTERNFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a rectangular pattern +/// feature. +class RectangularPatternFeatureInput : public core::Base { +public: + + /// Gets and sets the input entities. The collection can contain faces, features, bodies or occurrences. + /// All of the entities must be of a single type. For example, it can't contain features and occurrences + /// but only features or occurrences. + core::Ptr inputEntities() const; + bool inputEntities(const core::Ptr& value); + + /// Sets all of the input required to define the pattern in the second direction. + /// directionTwoEntity : Specifies the entity used to define the second direction entity. This can be a linear edge, construction axis, sketch line or rectangular pattern feature. + /// If a rectangular pattern feature is set, the directionOneEntity and directionTwoEntity properties return the same rectangular pattern feature. + /// This argument can be null to indicate that the default second direction is to be used, which is 90 degrees to the first direction. + /// quantityTwo : Specifies the number of instances in the second direction. + /// distanceTwo : Specifies the distance in the second direction. How this value is used depends on the value of the PatternDistanceType property. + /// If the value is ExtentPatternDistanceType then it defines the total distance of the pattern. + /// If the value is SpacingPatternDistanceType then it defines the distance between each element. + /// Returns true if it was successful. + bool setDirectionTwo(const core::Ptr& directionTwoEntity, const core::Ptr& quantityTwo, const core::Ptr& distanceTwo); + + /// Gets and sets the first direction entity. + /// This can be a linear edge, construction axis, sketch line or rectangular pattern feature. + /// If a rectangular pattern feature is set, the directionOneEntity and directionTwoEntity properties return the same rectangular pattern feature. + core::Ptr directionOneEntity() const; + bool directionOneEntity(const core::Ptr& value); + + /// Gets and sets the second direction entity. + /// This can be a linear edge, construction axis, sketch line or rectangular pattern feature. + /// If a rectangular pattern feature is set, the directionOneEntity and directionTwoEntity properties return the same rectangular pattern feature. + core::Ptr directionTwoEntity() const; + bool directionTwoEntity(const core::Ptr& value); + + /// Gets and sets the number of instances in the first direction. + core::Ptr quantityOne() const; + bool quantityOne(const core::Ptr& value); + + /// Gets and sets the number of instances in the second direction. + core::Ptr quantityTwo() const; + bool quantityTwo(const core::Ptr& value); + + /// Gets and sets the distance in the first direction. + core::Ptr distanceOne() const; + bool distanceOne(const core::Ptr& value); + + /// Gets and sets the distance in the second direction. + core::Ptr distanceTwo() const; + bool distanceTwo(const core::Ptr& value); + + /// Returns a Vector3D indicating the positive direction of direction one. + core::Ptr directionOne() const; + + /// Returns a Vector3D indicating the positive direction of direction two. + core::Ptr directionTwo() const; + + /// Gets and sets if the pattern in direction one is in one direction or symmetric. + bool isSymmetricInDirectionOne() const; + bool isSymmetricInDirectionOne(bool value); + + /// Gets and sets if the pattern in direction two is in one direction or symmetric. + bool isSymmetricInDirectionTwo() const; + bool isSymmetricInDirectionTwo(bool value); + + /// Gets and sets how the distance between elements is computed. + PatternDistanceType patternDistanceType() const; + bool patternDistanceType(PatternDistanceType value); + + /// Gets and sets the compute option when patterning features. The default value for this is AdjustPatternCompute. + /// This property only applies when patterning features and is ignored in the direct modeling environment. + PatternComputeOptions patternComputeOption() const; + bool patternComputeOption(PatternComputeOptions value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_RECTANGULARPATTERNFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_RECTANGULARPATTERNFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_RECTANGULARPATTERNFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_RECTANGULARPATTERNFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* inputEntities_raw() const = 0; + virtual bool inputEntities_raw(core::ObjectCollection* value) = 0; + virtual bool setDirectionTwo_raw(core::Base* directionTwoEntity, core::ValueInput* quantityTwo, core::ValueInput* distanceTwo) = 0; + virtual core::Base* directionOneEntity_raw() const = 0; + virtual bool directionOneEntity_raw(core::Base* value) = 0; + virtual core::Base* directionTwoEntity_raw() const = 0; + virtual bool directionTwoEntity_raw(core::Base* value) = 0; + virtual core::ValueInput* quantityOne_raw() const = 0; + virtual bool quantityOne_raw(core::ValueInput* value) = 0; + virtual core::ValueInput* quantityTwo_raw() const = 0; + virtual bool quantityTwo_raw(core::ValueInput* value) = 0; + virtual core::ValueInput* distanceOne_raw() const = 0; + virtual bool distanceOne_raw(core::ValueInput* value) = 0; + virtual core::ValueInput* distanceTwo_raw() const = 0; + virtual bool distanceTwo_raw(core::ValueInput* value) = 0; + virtual core::Vector3D* directionOne_raw() const = 0; + virtual core::Vector3D* directionTwo_raw() const = 0; + virtual bool isSymmetricInDirectionOne_raw() const = 0; + virtual bool isSymmetricInDirectionOne_raw(bool value) = 0; + virtual bool isSymmetricInDirectionTwo_raw() const = 0; + virtual bool isSymmetricInDirectionTwo_raw(bool value) = 0; + virtual PatternDistanceType patternDistanceType_raw() const = 0; + virtual bool patternDistanceType_raw(PatternDistanceType value) = 0; + virtual PatternComputeOptions patternComputeOption_raw() const = 0; + virtual bool patternComputeOption_raw(PatternComputeOptions value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr RectangularPatternFeatureInput::inputEntities() const +{ + core::Ptr res = inputEntities_raw(); + return res; +} + +inline bool RectangularPatternFeatureInput::inputEntities(const core::Ptr& value) +{ + return inputEntities_raw(value.get()); +} + +inline bool RectangularPatternFeatureInput::setDirectionTwo(const core::Ptr& directionTwoEntity, const core::Ptr& quantityTwo, const core::Ptr& distanceTwo) +{ + bool res = setDirectionTwo_raw(directionTwoEntity.get(), quantityTwo.get(), distanceTwo.get()); + return res; +} + +inline core::Ptr RectangularPatternFeatureInput::directionOneEntity() const +{ + core::Ptr res = directionOneEntity_raw(); + return res; +} + +inline bool RectangularPatternFeatureInput::directionOneEntity(const core::Ptr& value) +{ + return directionOneEntity_raw(value.get()); +} + +inline core::Ptr RectangularPatternFeatureInput::directionTwoEntity() const +{ + core::Ptr res = directionTwoEntity_raw(); + return res; +} + +inline bool RectangularPatternFeatureInput::directionTwoEntity(const core::Ptr& value) +{ + return directionTwoEntity_raw(value.get()); +} + +inline core::Ptr RectangularPatternFeatureInput::quantityOne() const +{ + core::Ptr res = quantityOne_raw(); + return res; +} + +inline bool RectangularPatternFeatureInput::quantityOne(const core::Ptr& value) +{ + return quantityOne_raw(value.get()); +} + +inline core::Ptr RectangularPatternFeatureInput::quantityTwo() const +{ + core::Ptr res = quantityTwo_raw(); + return res; +} + +inline bool RectangularPatternFeatureInput::quantityTwo(const core::Ptr& value) +{ + return quantityTwo_raw(value.get()); +} + +inline core::Ptr RectangularPatternFeatureInput::distanceOne() const +{ + core::Ptr res = distanceOne_raw(); + return res; +} + +inline bool RectangularPatternFeatureInput::distanceOne(const core::Ptr& value) +{ + return distanceOne_raw(value.get()); +} + +inline core::Ptr RectangularPatternFeatureInput::distanceTwo() const +{ + core::Ptr res = distanceTwo_raw(); + return res; +} + +inline bool RectangularPatternFeatureInput::distanceTwo(const core::Ptr& value) +{ + return distanceTwo_raw(value.get()); +} + +inline core::Ptr RectangularPatternFeatureInput::directionOne() const +{ + core::Ptr res = directionOne_raw(); + return res; +} + +inline core::Ptr RectangularPatternFeatureInput::directionTwo() const +{ + core::Ptr res = directionTwo_raw(); + return res; +} + +inline bool RectangularPatternFeatureInput::isSymmetricInDirectionOne() const +{ + bool res = isSymmetricInDirectionOne_raw(); + return res; +} + +inline bool RectangularPatternFeatureInput::isSymmetricInDirectionOne(bool value) +{ + return isSymmetricInDirectionOne_raw(value); +} + +inline bool RectangularPatternFeatureInput::isSymmetricInDirectionTwo() const +{ + bool res = isSymmetricInDirectionTwo_raw(); + return res; +} + +inline bool RectangularPatternFeatureInput::isSymmetricInDirectionTwo(bool value) +{ + return isSymmetricInDirectionTwo_raw(value); +} + +inline PatternDistanceType RectangularPatternFeatureInput::patternDistanceType() const +{ + PatternDistanceType res = patternDistanceType_raw(); + return res; +} + +inline bool RectangularPatternFeatureInput::patternDistanceType(PatternDistanceType value) +{ + return patternDistanceType_raw(value); +} + +inline PatternComputeOptions RectangularPatternFeatureInput::patternComputeOption() const +{ + PatternComputeOptions res = patternComputeOption_raw(); + return res; +} + +inline bool RectangularPatternFeatureInput::patternComputeOption(PatternComputeOptions value) +{ + return patternComputeOption_raw(value); +} + +inline core::Ptr RectangularPatternFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool RectangularPatternFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_RECTANGULARPATTERNFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/RectangularPatternFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/RectangularPatternFeatures.h new file mode 100644 index 0000000..5be2f44 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/RectangularPatternFeatures.h @@ -0,0 +1,144 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_RECTANGULARPATTERNFEATURES_CPP__ +# define ADSK_FUSION_RECTANGULARPATTERNFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_RECTANGULARPATTERNFEATURES_API +# endif +#else +# define ADSK_FUSION_RECTANGULARPATTERNFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class RectangularPatternFeature; + class RectangularPatternFeatureInput; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing rectangular pattern features in a component +/// and supports the ability to create new rectangular pattern features. +class RectangularPatternFeatures : public core::Base { +public: + + /// Function that returns the specified rectangular pattern feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of rectangular pattern features in the collection. + size_t count() const; + + /// Creates a RectangularPatternFeatureInput object. Use properties and methods on this object + /// to define the rectangular pattern you want to create and then use the Add method, passing in + /// the RectangularPatternFeatureInput object. + /// inputEntities : The collection can contain faces, features, bodies or occurrences. + /// All of the entities must be of a single type. For example, it can't contain features and occurrences + /// but only features or occurrences. + /// directionOneEntity : Specifies the entity used to define the first direction entity. This can be a linear edge, construction axis, sketch line or rectangular pattern feature. + /// If a rectangular pattern feature is set, the directionOneEntity and directionTwoEntity properties return the same rectangular pattern feature. + /// quantityOne : Specifies the number of instances in the first direction. + /// distanceOne : Specifies the distance in the first direction. How this value is used depends on the value of the PatternDistanceType property. A + /// negative value can be used to change the direction. + /// If the value is ExtentPatternDistanceType then it defines the total distance of the pattern. + /// If the value is SpacingPatternDistanceType then it defines the distance between each element. + /// patternDistanceType : Specifies how the distance between elements is computed. + /// Returns the newly created RectangularPatternFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& inputEntities, const core::Ptr& directionOneEntity, const core::Ptr& quantityOne, const core::Ptr& distanceOne, PatternDistanceType patternDistanceType) const; + + /// Creates a new rectangular pattern feature. + /// input : A RectangularPatternFeatureInput object that defines the desired rectangular pattern. Use the createInput + /// method to create a new RectangularPatternFeatureInput object and then use methods on it + /// (the RectangularPatternFeatureInput object) to define the rectangular pattern. + /// Returns the newly created RectangularPatternFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified rectangular pattern feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef RectangularPatternFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_RECTANGULARPATTERNFEATURES_API static const char* classType(); + ADSK_FUSION_RECTANGULARPATTERNFEATURES_API const char* objectType() const override; + ADSK_FUSION_RECTANGULARPATTERNFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_RECTANGULARPATTERNFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual RectangularPatternFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual RectangularPatternFeatureInput* createInput_raw(core::ObjectCollection* inputEntities, core::Base* directionOneEntity, core::ValueInput* quantityOne, core::ValueInput* distanceOne, PatternDistanceType patternDistanceType) const = 0; + virtual RectangularPatternFeature* add_raw(RectangularPatternFeatureInput* input) = 0; + virtual RectangularPatternFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr RectangularPatternFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t RectangularPatternFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr RectangularPatternFeatures::createInput(const core::Ptr& inputEntities, const core::Ptr& directionOneEntity, const core::Ptr& quantityOne, const core::Ptr& distanceOne, PatternDistanceType patternDistanceType) const +{ + core::Ptr res = createInput_raw(inputEntities.get(), directionOneEntity.get(), quantityOne.get(), distanceOne.get(), patternDistanceType); + return res; +} + +inline core::Ptr RectangularPatternFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr RectangularPatternFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void RectangularPatternFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_RECTANGULARPATTERNFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/RefoldFeature.h b/usr/autodesk/CPP/include/Fusion/Features/RefoldFeature.h new file mode 100644 index 0000000..5b80cd7 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/RefoldFeature.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_REFOLDFEATURE_CPP__ +# define ADSK_FUSION_REFOLDFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_REFOLDFEATURE_API +# endif +#else +# define ADSK_FUSION_REFOLDFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Object that represents an existing refold feature in a design. +class RefoldFeature : public Feature { +public: + + ADSK_FUSION_REFOLDFEATURE_API static const char* classType(); + ADSK_FUSION_REFOLDFEATURE_API const char* objectType() const override; + ADSK_FUSION_REFOLDFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_REFOLDFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_REFOLDFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/RefoldFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/RefoldFeatures.h new file mode 100644 index 0000000..38afe16 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/RefoldFeatures.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_REFOLDFEATURES_CPP__ +# define ADSK_FUSION_REFOLDFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_REFOLDFEATURES_API +# endif +#else +# define ADSK_FUSION_REFOLDFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class RefoldFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing refold features in a design. +class RefoldFeatures : public core::Base { +public: + + /// Function that returns the specified refold feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of refold features in the collection. + size_t count() const; + + /// Function that returns the specified refold feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef RefoldFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_REFOLDFEATURES_API static const char* classType(); + ADSK_FUSION_REFOLDFEATURES_API const char* objectType() const override; + ADSK_FUSION_REFOLDFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_REFOLDFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual RefoldFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual RefoldFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr RefoldFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t RefoldFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr RefoldFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void RefoldFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_REFOLDFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/RemoveFeature.h b/usr/autodesk/CPP/include/Fusion/Features/RemoveFeature.h new file mode 100644 index 0000000..44c0e3d --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/RemoveFeature.h @@ -0,0 +1,91 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_REMOVEFEATURE_CPP__ +# define ADSK_FUSION_REMOVEFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_REMOVEFEATURE_API +# endif +#else +# define ADSK_FUSION_REMOVEFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing Remove feature in a design. +class RemoveFeature : public Feature { +public: + + /// Gets and sets the body or component occurrence to remove. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr itemToRemove() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_REMOVEFEATURE_API static const char* classType(); + ADSK_FUSION_REMOVEFEATURE_API const char* objectType() const override; + ADSK_FUSION_REMOVEFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_REMOVEFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* itemToRemove_raw() const = 0; + virtual RemoveFeature* nativeObject_raw() const = 0; + virtual RemoveFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr RemoveFeature::itemToRemove() const +{ + core::Ptr res = itemToRemove_raw(); + return res; +} + +inline core::Ptr RemoveFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr RemoveFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_REMOVEFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/RemoveFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/RemoveFeatures.h new file mode 100644 index 0000000..2625fa6 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/RemoveFeatures.h @@ -0,0 +1,113 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_REMOVEFEATURES_CPP__ +# define ADSK_FUSION_REMOVEFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_REMOVEFEATURES_API +# endif +#else +# define ADSK_FUSION_REMOVEFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class RemoveFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing Remove features in a component +/// and supports the ability to create new Remove features. +class RemoveFeatures : public core::Base { +public: + + /// Function that returns the specified Remove feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified remove feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of Remove features in the collection. + size_t count() const; + + /// Creates a new Remove feature. + /// itemToRemove : A single body (solid or surface) or component occurrence to remove. + /// Returns the newly created RemoveFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& itemToRemove); + + typedef RemoveFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_REMOVEFEATURES_API static const char* classType(); + ADSK_FUSION_REMOVEFEATURES_API const char* objectType() const override; + ADSK_FUSION_REMOVEFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_REMOVEFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual RemoveFeature* item_raw(size_t index) const = 0; + virtual RemoveFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual RemoveFeature* add_raw(core::Base* itemToRemove) = 0; +}; + +// Inline wrappers + +inline core::Ptr RemoveFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr RemoveFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t RemoveFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr RemoveFeatures::add(const core::Ptr& itemToRemove) +{ + core::Ptr res = add_raw(itemToRemove.get()); + return res; +} + +template inline void RemoveFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_REMOVEFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ReplaceFaceFeature.h b/usr/autodesk/CPP/include/Fusion/Features/ReplaceFaceFeature.h new file mode 100644 index 0000000..c360d1b --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ReplaceFaceFeature.h @@ -0,0 +1,130 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_REPLACEFACEFEATURE_CPP__ +# define ADSK_FUSION_REPLACEFACEFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_REPLACEFACEFEATURE_API +# endif +#else +# define ADSK_FUSION_REPLACEFACEFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing replace face feature in a design. +class ReplaceFaceFeature : public Feature { +public: + + /// Method that sets faces to replace. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// sourceFaces : The collection can contain the faces from a solid and/or from features. All the faces must be on the same body. + /// isTangentChain : A boolean value for setting whether or not faces that are tangentially connected to + /// the input faces (if any) will also be included. A value of true indicates that tangent + /// faces will be included. + /// Returns true if successful. + bool setInputEntities(const core::Ptr& sourceFaces, bool isTangentChain); + + /// Gets and sets the entities that define the target faces. The new faces must completely intersect the part. + /// The collection can contain the surface faces, surface bodies and construction planes. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr targetFaces() const; + bool targetFaces(const core::Ptr& value); + + /// Gets if any faces that are tangentially connected to any of + /// the input faces will also be included in setting InputEntities. + bool isTangentChain() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_REPLACEFACEFEATURE_API static const char* classType(); + ADSK_FUSION_REPLACEFACEFEATURE_API const char* objectType() const override; + ADSK_FUSION_REPLACEFACEFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_REPLACEFACEFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool setInputEntities_raw(core::ObjectCollection* sourceFaces, bool isTangentChain) = 0; + virtual core::Base* targetFaces_raw() const = 0; + virtual bool targetFaces_raw(core::Base* value) = 0; + virtual bool isTangentChain_raw() const = 0; + virtual ReplaceFaceFeature* nativeObject_raw() const = 0; + virtual ReplaceFaceFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline bool ReplaceFaceFeature::setInputEntities(const core::Ptr& sourceFaces, bool isTangentChain) +{ + bool res = setInputEntities_raw(sourceFaces.get(), isTangentChain); + return res; +} + +inline core::Ptr ReplaceFaceFeature::targetFaces() const +{ + core::Ptr res = targetFaces_raw(); + return res; +} + +inline bool ReplaceFaceFeature::targetFaces(const core::Ptr& value) +{ + return targetFaces_raw(value.get()); +} + +inline bool ReplaceFaceFeature::isTangentChain() const +{ + bool res = isTangentChain_raw(); + return res; +} + +inline core::Ptr ReplaceFaceFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr ReplaceFaceFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_REPLACEFACEFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ReplaceFaceFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/ReplaceFaceFeatureInput.h new file mode 100644 index 0000000..694b825 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ReplaceFaceFeatureInput.h @@ -0,0 +1,133 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_REPLACEFACEFEATUREINPUT_CPP__ +# define ADSK_FUSION_REPLACEFACEFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_REPLACEFACEFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_REPLACEFACEFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a replace face feature. +class ReplaceFaceFeatureInput : public core::Base { +public: + + /// Gets and sets the entities that define the source faces to perform replace. + /// The collection can contain the faces from a solid and/or from features. All the faces must be on the same body. + core::Ptr sourceFaces() const; + bool sourceFaces(const core::Ptr& value); + + /// Gets and sets the entities that define the target faces. The new faces must completely intersect the part. + /// The collection can contain the surface faces, surface bodies and construction planes. + core::Ptr targetFaces() const; + bool targetFaces(const core::Ptr& value); + + /// Gets and sets if any faces that are tangentially connected to any of + /// the input faces will also be included in setting InputEntities. It defaults to true. + bool isTangentChain() const; + bool isTangentChain(bool value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_REPLACEFACEFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_REPLACEFACEFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_REPLACEFACEFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_REPLACEFACEFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* sourceFaces_raw() const = 0; + virtual bool sourceFaces_raw(core::ObjectCollection* value) = 0; + virtual core::Base* targetFaces_raw() const = 0; + virtual bool targetFaces_raw(core::Base* value) = 0; + virtual bool isTangentChain_raw() const = 0; + virtual bool isTangentChain_raw(bool value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr ReplaceFaceFeatureInput::sourceFaces() const +{ + core::Ptr res = sourceFaces_raw(); + return res; +} + +inline bool ReplaceFaceFeatureInput::sourceFaces(const core::Ptr& value) +{ + return sourceFaces_raw(value.get()); +} + +inline core::Ptr ReplaceFaceFeatureInput::targetFaces() const +{ + core::Ptr res = targetFaces_raw(); + return res; +} + +inline bool ReplaceFaceFeatureInput::targetFaces(const core::Ptr& value) +{ + return targetFaces_raw(value.get()); +} + +inline bool ReplaceFaceFeatureInput::isTangentChain() const +{ + bool res = isTangentChain_raw(); + return res; +} + +inline bool ReplaceFaceFeatureInput::isTangentChain(bool value) +{ + return isTangentChain_raw(value); +} + +inline core::Ptr ReplaceFaceFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool ReplaceFaceFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_REPLACEFACEFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ReplaceFaceFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/ReplaceFaceFeatures.h new file mode 100644 index 0000000..00f1d4b --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ReplaceFaceFeatures.h @@ -0,0 +1,139 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_REPLACEFACEFEATURES_CPP__ +# define ADSK_FUSION_REPLACEFACEFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_REPLACEFACEFEATURES_API +# endif +#else +# define ADSK_FUSION_REPLACEFACEFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ReplaceFaceFeature; + class ReplaceFaceFeatureInput; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing replace face features in a component +/// and supports the ability to create new replace face features. +class ReplaceFaceFeatures : public core::Base { +public: + + /// Function that returns the specified replace face feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of replace face features in the collection. + size_t count() const; + + /// Creates a ReplaceFaceFeatureInput object. Use properties and methods on this object + /// to define the replace face you want to create and then use the Add method, passing in + /// the ReplaceFaceFeatureInput object. + /// sourceFaces : Input the entities that define the source faces (the faces to be replaced). + /// The collection can contain the faces from a solid and/or features. All the faces must be on the same body. + /// isTangentChain : A boolean value for setting whether or not faces that are tangentially connected to + /// the input faces (if any) will also be included. A value of true indicates that tangent + /// faces will be included. + /// targetFaces : Input the entities that define the target faces. The new faces must completely intersect the part. + /// The collection can contain the surface faces, surface bodies and construction planes. + /// Returns the newly created ReplaceFaceFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& sourceFaces, bool isTangentChain, const core::Ptr& targetFaces) const; + + /// Creates a new replace face feature. + /// input : A ReplaceFaceFeatureInput object that defines the desired replace face. Use the createInput + /// method to create a new ReplaceFaceFeatureInput object and then use methods on it + /// (the ReplaceFaceFeatureInput object) to define the replace face. + /// Returns the newly created ReplaceFaceFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified replace face feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef ReplaceFaceFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_REPLACEFACEFEATURES_API static const char* classType(); + ADSK_FUSION_REPLACEFACEFEATURES_API const char* objectType() const override; + ADSK_FUSION_REPLACEFACEFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_REPLACEFACEFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ReplaceFaceFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual ReplaceFaceFeatureInput* createInput_raw(core::ObjectCollection* sourceFaces, bool isTangentChain, core::Base* targetFaces) const = 0; + virtual ReplaceFaceFeature* add_raw(ReplaceFaceFeatureInput* input) = 0; + virtual ReplaceFaceFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr ReplaceFaceFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t ReplaceFaceFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr ReplaceFaceFeatures::createInput(const core::Ptr& sourceFaces, bool isTangentChain, const core::Ptr& targetFaces) const +{ + core::Ptr res = createInput_raw(sourceFaces.get(), isTangentChain, targetFaces.get()); + return res; +} + +inline core::Ptr ReplaceFaceFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr ReplaceFaceFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void ReplaceFaceFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_REPLACEFACEFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ReverseNormalFeature.h b/usr/autodesk/CPP/include/Fusion/Features/ReverseNormalFeature.h new file mode 100644 index 0000000..b24f7b5 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ReverseNormalFeature.h @@ -0,0 +1,102 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_REVERSENORMALFEATURE_CPP__ +# define ADSK_FUSION_REVERSENORMALFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_REVERSENORMALFEATURE_API +# endif +#else +# define ADSK_FUSION_REVERSENORMALFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing Reverse Normal feature in a design. +class ReverseNormalFeature : public Feature { +public: + + /// Gets and sets the surface bodies (open BRepBodies) whose faces normals are to be reversed. + /// All faces of the input surface bodies get reversed. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr surfaces() const; + bool surfaces(const core::Ptr& value); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_REVERSENORMALFEATURE_API static const char* classType(); + ADSK_FUSION_REVERSENORMALFEATURE_API const char* objectType() const override; + ADSK_FUSION_REVERSENORMALFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_REVERSENORMALFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* surfaces_raw() const = 0; + virtual bool surfaces_raw(core::ObjectCollection* value) = 0; + virtual ReverseNormalFeature* nativeObject_raw() const = 0; + virtual ReverseNormalFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr ReverseNormalFeature::surfaces() const +{ + core::Ptr res = surfaces_raw(); + return res; +} + +inline bool ReverseNormalFeature::surfaces(const core::Ptr& value) +{ + return surfaces_raw(value.get()); +} + +inline core::Ptr ReverseNormalFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr ReverseNormalFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_REVERSENORMALFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ReverseNormalFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/ReverseNormalFeatures.h new file mode 100644 index 0000000..0f5988b --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ReverseNormalFeatures.h @@ -0,0 +1,117 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_REVERSENORMALFEATURES_CPP__ +# define ADSK_FUSION_REVERSENORMALFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_REVERSENORMALFEATURES_API +# endif +#else +# define ADSK_FUSION_REVERSENORMALFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ReverseNormalFeature; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing Reverse Normal features in a component +/// and supports the ability to create new Reverse Normal features. +class ReverseNormalFeatures : public core::Base { +public: + + /// Function that returns the specified Reverse Normal feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified reverse normal feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of Reverse Normal features in the collection. + size_t count() const; + + /// Creates a new Reverse Normal feature. + /// surfaces : One or more surface bodies (open BRepBodies) containing the faces whose normals are to be reversed. + /// All faces of the input surface bodies get reversed. + /// Returns the newly created ReverseNormalFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& surfaces); + + typedef ReverseNormalFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_REVERSENORMALFEATURES_API static const char* classType(); + ADSK_FUSION_REVERSENORMALFEATURES_API const char* objectType() const override; + ADSK_FUSION_REVERSENORMALFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_REVERSENORMALFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ReverseNormalFeature* item_raw(size_t index) const = 0; + virtual ReverseNormalFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual ReverseNormalFeature* add_raw(core::ObjectCollection* surfaces) = 0; +}; + +// Inline wrappers + +inline core::Ptr ReverseNormalFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr ReverseNormalFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t ReverseNormalFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr ReverseNormalFeatures::add(const core::Ptr& surfaces) +{ + core::Ptr res = add_raw(surfaces.get()); + return res; +} + +template inline void ReverseNormalFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_REVERSENORMALFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/RevolveFeature.h b/usr/autodesk/CPP/include/Fusion/Features/RevolveFeature.h new file mode 100644 index 0000000..b791a2c --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/RevolveFeature.h @@ -0,0 +1,326 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_REVOLVEFEATURE_CPP__ +# define ADSK_FUSION_REVOLVEFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_REVOLVEFEATURE_API +# endif +#else +# define ADSK_FUSION_REVOLVEFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class BRepFaces; + class ExtentDefinition; + class Occurrence; +}} +namespace adsk { namespace core { + class ValueInput; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing revolve feature in a design. +class RevolveFeature : public Feature { +public: + + /// Gets and sets the profiles or planar faces used to define the shape of the revolve. + /// This property can return or be set with a single Profile, a single planar face, or + /// an ObjectCollection consisting of multiple profiles and planar faces. When an + /// ObjectCollection is used all of the profiles and faces must be co-planar. + /// When setting this property of a surface (non-solid) extrusion, you can use the + /// createOpenProfile and createBRepEdgeProfile methods of the Component object to create + /// an open profile. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// This property returns null in the case where the feature is non-parametric. + core::Ptr profile() const; + bool profile(const core::Ptr& value); + + /// Gets and sets the entity used to define the axis of revolution. + /// The axis can be a sketch line, construction axis, or linear edge. If it is not in + /// the same plane as the profile, it is projected onto the profile plane. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr axis() const; + bool axis(const core::Ptr& value); + + /// Gets and sets the type of operation performed by the revolve. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// Gets the definition object that is defining the extent of the revolve. Modifying the + /// definition object will cause the revolve to recompute. Various types of objects can + /// be returned depending on the type of extent currently defined for the revolve. + /// This property returns nothing in the case where the feature is non-parametric. + core::Ptr extentDefinition() const; + + /// Defines the extent of the revolution to be at a defined angle. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// isSymmetric : Boolean that specifies if the extent is symmetric or not. + /// angle : ValueInput object that defines the angle. This can be a string or a value. If + /// it's a string it is interpreted using the current document units and can include + /// equations. For example all of the following are valid as long as they result in + /// angle units; "45", "45 deg", "a1 / 2". If a value is input it is interpreted + /// as radians. + /// If isSymmetric is false a positive or negative angle can be + /// used to control the direction. If isSymmetric is true, the angle is the extent in one + /// direction so the entire angle of the revolution will be twice the specified angle. + /// Use an angle of 360 deg or 2 pi radians to create a full revolve. + /// Returns true if successful + bool setAngleExtent(bool isSymmetric, const core::Ptr& angle); + + /// Changes the extent of the revolve to be defined as a two sided angle extent. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// angleOne : ValueInput object that defines the first angle. This can be a string or a value. If + /// it's a string it is interpreted using the current document units and can include + /// equations. For example all of the following are valid as long as they result in + /// angle units; "45", "45 deg", "a1 / 2". If a value is input it is interpreted + /// as radians. + /// angleTwo : ValueInput object that defines the second angle. This can be a string or a value. If + /// it's a string it is interpreted using the current document units and can include + /// equations. For example all of the following are valid as long as they result in + /// angle units; "45", "45 deg", "a1 / 2". If a value is input it is interpreted + /// as radians. + /// Returns true if successful + bool setTwoSideAngleExtent(const core::Ptr& angleOne, const core::Ptr& angleTwo); + + /// Changes the extent of the revolve to be from the sketch plane to the specified "to" face. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// toEntity : The entity that defines the "to" extent. The valid types of entities can vary depending on + /// the type of feature this is being used with. For a revolve it can be a BRepBody, BRepFace, + /// BRepVertex, ConstructionPlane, or ConstructionPoint. + /// directionHint : Specifies the direction of the revolve. + /// Returns true if successful. + bool setOneSideToExtent(const core::Ptr& toEntity, const core::Ptr& directionHint = NULL); + + /// Changes the extent of the revolve to be defined as a two sided to extent. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// toEntityOne : The first entity that defines the "to" extent. The valid types of entities can vary depending on + /// the type of feature this is being used with. For a revolve it can be a BRepBody, BRepFace, + /// BRepVertex, ConstructionPlane, or ConstructionPoint. + /// toEntityTwo : The second entity that defines the "to" extent. The valid types of entities can vary depending on + /// the type of feature this is being used with. For a revolve it can be a BRepBody, BRepFace, + /// BRepVertex, ConstructionPlane, or ConstructionPoint. + /// Returns true if successful + bool setTwoSidesToExtent(const core::Ptr& toEntityOne, const core::Ptr& toEntityTwo); + + /// Property that returns the set of faces that cap one end of the revolve and are coincident + /// with the sketch plane. In the case of a symmetric revolve these faces are the ones on the + /// positive normal side of the sketch plane. In the case where there aren't any start faces, + /// this property will return null. + core::Ptr startFaces() const; + + /// Property that returns the set of faces that cap the end of the revolve opposite the + /// start faces. In the case where there aren't any start faces, this property will return null. + core::Ptr endFaces() const; + + /// Property that returns all of the faces created around the perimeter of the feature. + core::Ptr sideFaces() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Indicates if this feature was initially created as a solid or a surface. + bool isSolid() const; + + /// Gets and sets the list of bodies that will participate in the feature when the operation is a cut or intersection. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + std::vector> participantBodies() const; + bool participantBodies(const std::vector>& value); + + ADSK_FUSION_REVOLVEFEATURE_API static const char* classType(); + ADSK_FUSION_REVOLVEFEATURE_API const char* objectType() const override; + ADSK_FUSION_REVOLVEFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_REVOLVEFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* profile_raw() const = 0; + virtual bool profile_raw(core::Base* value) = 0; + virtual core::Base* axis_raw() const = 0; + virtual bool axis_raw(core::Base* value) = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual ExtentDefinition* extentDefinition_raw() const = 0; + virtual bool setAngleExtent_raw(bool isSymmetric, core::ValueInput* angle) = 0; + virtual bool setTwoSideAngleExtent_raw(core::ValueInput* angleOne, core::ValueInput* angleTwo) = 0; + virtual bool setOneSideToExtent_raw(core::Base* toEntity, core::Vector3D* directionHint) = 0; + virtual bool setTwoSidesToExtent_raw(core::Base* toEntityOne, core::Base* toEntityTwo) = 0; + virtual BRepFaces* startFaces_raw() const = 0; + virtual BRepFaces* endFaces_raw() const = 0; + virtual BRepFaces* sideFaces_raw() const = 0; + virtual RevolveFeature* nativeObject_raw() const = 0; + virtual RevolveFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual bool isSolid_raw() const = 0; + virtual BRepBody** participantBodies_raw(size_t& return_size) const = 0; + virtual bool participantBodies_raw(BRepBody** value, size_t value_size) = 0; +}; + +// Inline wrappers + +inline core::Ptr RevolveFeature::profile() const +{ + core::Ptr res = profile_raw(); + return res; +} + +inline bool RevolveFeature::profile(const core::Ptr& value) +{ + return profile_raw(value.get()); +} + +inline core::Ptr RevolveFeature::axis() const +{ + core::Ptr res = axis_raw(); + return res; +} + +inline bool RevolveFeature::axis(const core::Ptr& value) +{ + return axis_raw(value.get()); +} + +inline FeatureOperations RevolveFeature::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool RevolveFeature::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline core::Ptr RevolveFeature::extentDefinition() const +{ + core::Ptr res = extentDefinition_raw(); + return res; +} + +inline bool RevolveFeature::setAngleExtent(bool isSymmetric, const core::Ptr& angle) +{ + bool res = setAngleExtent_raw(isSymmetric, angle.get()); + return res; +} + +inline bool RevolveFeature::setTwoSideAngleExtent(const core::Ptr& angleOne, const core::Ptr& angleTwo) +{ + bool res = setTwoSideAngleExtent_raw(angleOne.get(), angleTwo.get()); + return res; +} + +inline bool RevolveFeature::setOneSideToExtent(const core::Ptr& toEntity, const core::Ptr& directionHint) +{ + bool res = setOneSideToExtent_raw(toEntity.get(), directionHint.get()); + return res; +} + +inline bool RevolveFeature::setTwoSidesToExtent(const core::Ptr& toEntityOne, const core::Ptr& toEntityTwo) +{ + bool res = setTwoSidesToExtent_raw(toEntityOne.get(), toEntityTwo.get()); + return res; +} + +inline core::Ptr RevolveFeature::startFaces() const +{ + core::Ptr res = startFaces_raw(); + return res; +} + +inline core::Ptr RevolveFeature::endFaces() const +{ + core::Ptr res = endFaces_raw(); + return res; +} + +inline core::Ptr RevolveFeature::sideFaces() const +{ + core::Ptr res = sideFaces_raw(); + return res; +} + +inline core::Ptr RevolveFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr RevolveFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline bool RevolveFeature::isSolid() const +{ + bool res = isSolid_raw(); + return res; +} + +inline std::vector> RevolveFeature::participantBodies() const +{ + std::vector> res; + size_t s; + + BRepBody** p= participantBodies_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool RevolveFeature::participantBodies(const std::vector>& value) +{ + BRepBody** value_ = new BRepBody*[value.size()]; + for(size_t i=0; i + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_REVOLVEFEATUREINPUT_CPP__ +# define ADSK_FUSION_REVOLVEFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_REVOLVEFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_REVOLVEFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class BRepBody; + class Occurrence; +}} +namespace adsk { namespace core { + class ValueInput; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a revolve +/// feature. +class RevolveFeatureInput : public core::Base { +public: + + /// Gets and sets the profiles or planar faces used to define the shape of the revolve. + /// This property can return or be set with a single Profile, a single planar face, or + /// an ObjectCollection consisting of multiple profiles and planar faces. When an + /// ObjectCollection is used all of the profiles and faces must be co-planar. + /// This property returns null in the case where the feature is non-parametric. + /// To create a surface (non-solid) revolution, you can use the createOpenProfile and createBRepEdgeProfile + /// methods of the Component object to create an open profile. The isSolid property of the + /// RevolveFeatureInput property must also be False. + core::Ptr profile() const; + bool profile(const core::Ptr& value); + + /// Gets and sets the type of operation performed by the revolve. + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// Gets and sets the entity used to define the axis of revolution. + /// The axis can be a sketch line, construction axis, or linear edge. If it is not in + /// the same plane as the profile, it is projected onto the profile plane. + core::Ptr axis() const; + bool axis(const core::Ptr& value); + + /// Defines the extent of the revolution to be at a specified angle. + /// An angle and whether the extent is symmetric or only in one direction + /// is specified. If it's not symmetric a positive or negative angle can be + /// used to control the direction. If symmetric, the angle is the angle on one + /// side so the entire angle of the revolution will be twice the specified angle. + /// Use an angle of 360 deg or 2 pi radians to create a full revolve. + /// isSymmetric : Set to 'true' for a revolve symmetrical about the profile plane + /// angle : The ValueInput object that defines the angle of the revolution + /// Returns true if successful + bool setAngleExtent(bool isSymmetric, const core::Ptr& angle); + + /// Defines the angle of the revolve to be to applied to both sides of the profile + /// at the specified angles. + /// angleOne : The ValueInput object that defines the angle for the first side of the revolution + /// angleTwo : The ValueInput object that defines the angle for the second side of the revolution + /// Returns true if successful + bool setTwoSideAngleExtent(const core::Ptr& angleOne, const core::Ptr& angleTwo); + + /// Defines the extent of the revolve to be from the sketch or profile plane to the + /// specified "To" face. + /// toEntity : The entity that defines the "to" extent. The valid types of entities can vary depending on + /// the type of feature this is being used with. For a revolve it can be a BRepBody, BRepFace, + /// BRepVertex, ConstructionPlane, or ConstructionPoint. + /// directionHint : Specifies the direction of the revolve. + /// Returns true if successful. + bool setOneSideToExtent(const core::Ptr& toEntity, const core::Ptr& directionHint = NULL); + + /// Defines the extents of the revolve to be from the sketch plane to specified + /// faces in both directions. If the matchShape argument is true, the faces to revolve to + /// are extended to fully intersect the revolve. + /// toEntityOne : The first entity that defines the "to" extent. The valid types of entities can vary depending on + /// the type of feature this is being used with. For a revolve it can be a BRepBody, BRepFace, + /// BRepVertex, ConstructionPlane, or ConstructionPoint. + /// toEntityTwo : The second entity that defines the "to" extent. The valid types of entities can vary depending on + /// the type of feature this is being used with. For a revolve it can be a BRepBody, BRepFace, + /// BRepVertex, ConstructionPlane, or ConstructionPoint. + /// Returns true if successful. + bool setTwoSideToExtent(const core::Ptr& toEntityOne, const core::Ptr& toEntityTwo); + + /// In order for geometry to be transformed correctly, an Occurrence for creation needs to be + /// specified when the Revolve is created based on geometry (e.g. a profile and/or face(s)) + /// in another component AND (the Revolve) is not in the root component. + /// The CreationOccurrence is analogous to the active occurrence in the UI + core::Ptr creationOccurrence() const; + bool creationOccurrence(const core::Ptr& value); + + /// Specifies if the revolution should be created as a solid or surface. If + /// it's a surface then there aren't any end caps and it's open. This is + /// initialized to true so a solid will be created if it's not changed. + bool isSolid() const; + bool isSolid(bool value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + /// Gets and sets the list of bodies that will participate in the feature when the operation is a cut or intersection. + /// If this property has not been set, the default behavior is that all bodies that are intersected by the + /// feature will participate. + /// This property can return null in the case where the feature has not been fully defined so that + /// possible intersecting bodies can be computed. + std::vector> participantBodies() const; + bool participantBodies(const std::vector>& value); + + ADSK_FUSION_REVOLVEFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_REVOLVEFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_REVOLVEFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_REVOLVEFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* profile_raw() const = 0; + virtual bool profile_raw(core::Base* value) = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual core::Base* axis_raw() const = 0; + virtual bool axis_raw(core::Base* value) = 0; + virtual bool setAngleExtent_raw(bool isSymmetric, core::ValueInput* angle) = 0; + virtual bool setTwoSideAngleExtent_raw(core::ValueInput* angleOne, core::ValueInput* angleTwo) = 0; + virtual bool setOneSideToExtent_raw(core::Base* toEntity, core::Vector3D* directionHint) = 0; + virtual bool setTwoSideToExtent_raw(core::Base* toEntityOne, core::Base* toEntityTwo) = 0; + virtual Occurrence* creationOccurrence_raw() const = 0; + virtual bool creationOccurrence_raw(Occurrence* value) = 0; + virtual bool isSolid_raw() const = 0; + virtual bool isSolid_raw(bool value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; + virtual BRepBody** participantBodies_raw(size_t& return_size) const = 0; + virtual bool participantBodies_raw(BRepBody** value, size_t value_size) = 0; +}; + +// Inline wrappers + +inline core::Ptr RevolveFeatureInput::profile() const +{ + core::Ptr res = profile_raw(); + return res; +} + +inline bool RevolveFeatureInput::profile(const core::Ptr& value) +{ + return profile_raw(value.get()); +} + +inline FeatureOperations RevolveFeatureInput::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool RevolveFeatureInput::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline core::Ptr RevolveFeatureInput::axis() const +{ + core::Ptr res = axis_raw(); + return res; +} + +inline bool RevolveFeatureInput::axis(const core::Ptr& value) +{ + return axis_raw(value.get()); +} + +inline bool RevolveFeatureInput::setAngleExtent(bool isSymmetric, const core::Ptr& angle) +{ + bool res = setAngleExtent_raw(isSymmetric, angle.get()); + return res; +} + +inline bool RevolveFeatureInput::setTwoSideAngleExtent(const core::Ptr& angleOne, const core::Ptr& angleTwo) +{ + bool res = setTwoSideAngleExtent_raw(angleOne.get(), angleTwo.get()); + return res; +} + +inline bool RevolveFeatureInput::setOneSideToExtent(const core::Ptr& toEntity, const core::Ptr& directionHint) +{ + bool res = setOneSideToExtent_raw(toEntity.get(), directionHint.get()); + return res; +} + +inline bool RevolveFeatureInput::setTwoSideToExtent(const core::Ptr& toEntityOne, const core::Ptr& toEntityTwo) +{ + bool res = setTwoSideToExtent_raw(toEntityOne.get(), toEntityTwo.get()); + return res; +} + +inline core::Ptr RevolveFeatureInput::creationOccurrence() const +{ + core::Ptr res = creationOccurrence_raw(); + return res; +} + +inline bool RevolveFeatureInput::creationOccurrence(const core::Ptr& value) +{ + return creationOccurrence_raw(value.get()); +} + +inline bool RevolveFeatureInput::isSolid() const +{ + bool res = isSolid_raw(); + return res; +} + +inline bool RevolveFeatureInput::isSolid(bool value) +{ + return isSolid_raw(value); +} + +inline core::Ptr RevolveFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool RevolveFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} + +inline std::vector> RevolveFeatureInput::participantBodies() const +{ + std::vector> res; + size_t s; + + BRepBody** p= participantBodies_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool RevolveFeatureInput::participantBodies(const std::vector>& value) +{ + BRepBody** value_ = new BRepBody*[value.size()]; + for(size_t i=0; i + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_REVOLVEFEATURES_CPP__ +# define ADSK_FUSION_REVOLVEFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_REVOLVEFEATURES_API +# endif +#else +# define ADSK_FUSION_REVOLVEFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class RevolveFeature; + class RevolveFeatureInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing revolve features in a design +/// and supports the ability to create new revolve features. +class RevolveFeatures : public core::Base { +public: + + /// Function that returns the specified revolve feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of revolve features in the collection. + size_t count() const; + + /// Creates a new RevolveFeatureInput object that is used to specify the input needed + /// to create a new revolve feature. + /// profile : The profile argument can be a single Profile, a single + /// planar face, or an ObjectCollection consisting of multiple profiles and planar faces. + /// When an ObjectCollection is used all of the profiles and faces must be co-planar. + /// To create a surface (non-solid) revolution, you can use the createOpenProfile and createBRepEdgeProfile + /// methods of the Component object to create an open profile. You also need to set the isSolid property + /// of the returned RevolveFeatureInput property to False. + /// axis : The axis can be a sketch line, construction axis, or linear edge. If it is not in + /// the same plane as the profile, it is projected onto the profile plane. + /// operation : The operation type to perform. + /// Returns the newly created RevolveFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& profile, const core::Ptr& axis, FeatureOperations operation) const; + + /// Creates a new revolve feature based on the information provided by the provided + /// RevolveFeatureInput object. + /// To create a new revolve, use the createInput function to create a new input object + /// and then use the methods and properties on that object to define the required input + /// for a revolve. Once the information is defined on the input object you can pass it + /// to the Add method to create the revolve. + /// input : The RevolveFeatureInput object that specifies the input needed to create a new extrude + /// Returns the newly created RevolveFeature or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified revolve feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef RevolveFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_REVOLVEFEATURES_API static const char* classType(); + ADSK_FUSION_REVOLVEFEATURES_API const char* objectType() const override; + ADSK_FUSION_REVOLVEFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_REVOLVEFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual RevolveFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual RevolveFeatureInput* createInput_raw(core::Base* profile, core::Base* axis, FeatureOperations operation) const = 0; + virtual RevolveFeature* add_raw(RevolveFeatureInput* input) = 0; + virtual RevolveFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr RevolveFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t RevolveFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr RevolveFeatures::createInput(const core::Ptr& profile, const core::Ptr& axis, FeatureOperations operation) const +{ + core::Ptr res = createInput_raw(profile.get(), axis.get(), operation); + return res; +} + +inline core::Ptr RevolveFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr RevolveFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void RevolveFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_REVOLVEFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/RibFeature.h b/usr/autodesk/CPP/include/Fusion/Features/RibFeature.h new file mode 100644 index 0000000..985c865 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/RibFeature.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_RIBFEATURE_CPP__ +# define ADSK_FUSION_RIBFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_RIBFEATURE_API +# endif +#else +# define ADSK_FUSION_RIBFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Object that represents an existing Rib feature in a design. +class RibFeature : public Feature { +public: + + ADSK_FUSION_RIBFEATURE_API static const char* classType(); + ADSK_FUSION_RIBFEATURE_API const char* objectType() const override; + ADSK_FUSION_RIBFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_RIBFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_RIBFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/RibFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/RibFeatures.h new file mode 100644 index 0000000..80fc226 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/RibFeatures.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_RIBFEATURES_CPP__ +# define ADSK_FUSION_RIBFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_RIBFEATURES_API +# endif +#else +# define ADSK_FUSION_RIBFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class RibFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing rib features in a design. +class RibFeatures : public core::Base { +public: + + /// Function that returns the specified Rib feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified Rib feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of Rib features in the collection. + size_t count() const; + + typedef RibFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_RIBFEATURES_API static const char* classType(); + ADSK_FUSION_RIBFEATURES_API const char* objectType() const override; + ADSK_FUSION_RIBFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_RIBFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual RibFeature* item_raw(size_t index) const = 0; + virtual RibFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr RibFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr RibFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t RibFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void RibFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_RIBFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/RuleFilletFeature.h b/usr/autodesk/CPP/include/Fusion/Features/RuleFilletFeature.h new file mode 100644 index 0000000..42bffc4 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/RuleFilletFeature.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_RULEFILLETFEATURE_CPP__ +# define ADSK_FUSION_RULEFILLETFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_RULEFILLETFEATURE_API +# endif +#else +# define ADSK_FUSION_RULEFILLETFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Object that represents an existing rule fillet feature in a design. +class RuleFilletFeature : public Feature { +public: + + ADSK_FUSION_RULEFILLETFEATURE_API static const char* classType(); + ADSK_FUSION_RULEFILLETFEATURE_API const char* objectType() const override; + ADSK_FUSION_RULEFILLETFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_RULEFILLETFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_RULEFILLETFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/RuleFilletFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/RuleFilletFeatures.h new file mode 100644 index 0000000..976485a --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/RuleFilletFeatures.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_RULEFILLETFEATURES_CPP__ +# define ADSK_FUSION_RULEFILLETFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_RULEFILLETFEATURES_API +# endif +#else +# define ADSK_FUSION_RULEFILLETFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class RuleFilletFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing rule fillet features in a design. +class RuleFilletFeatures : public core::Base { +public: + + /// Function that returns the specified rule fillet feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified rule fillet feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of rule fillet features in the collection. + size_t count() const; + + typedef RuleFilletFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_RULEFILLETFEATURES_API static const char* classType(); + ADSK_FUSION_RULEFILLETFEATURES_API const char* objectType() const override; + ADSK_FUSION_RULEFILLETFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_RULEFILLETFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual RuleFilletFeature* item_raw(size_t index) const = 0; + virtual RuleFilletFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr RuleFilletFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr RuleFilletFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t RuleFilletFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void RuleFilletFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_RULEFILLETFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/RuledSurfaceFeature.h b/usr/autodesk/CPP/include/Fusion/Features/RuledSurfaceFeature.h new file mode 100644 index 0000000..f307f92 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/RuledSurfaceFeature.h @@ -0,0 +1,205 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_RULEDSURFACEFEATURE_CPP__ +# define ADSK_FUSION_RULEDSURFACEFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_RULEDSURFACEFEATURE_API +# endif +#else +# define ADSK_FUSION_RULEDSURFACEFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing RuledSurface feature in a design. +class RuledSurfaceFeature : public Feature { +public: + + /// Gets and sets the Profile object that defines the sketch geometry or edges that define the shape of + /// the ruled surface. The Component.createBRepEdgeProfile method is useful to create a profile defined from edges. + /// In many cases the RuledSurface operation results in the profile being consumed so it is no longer available + /// after the feature is created. In this case, you need to reposition the timeline marker to just before this feature, + /// when the profile still exists. + core::Ptr profile() const; + bool profile(const core::Ptr& value); + + /// Returns the parameter controlling the Ruled Surface distance. You can edit the distance + /// by editing the value of the parameter object. + core::Ptr distance() const; + + /// Returns the parameter controlling the Ruled Surface angle. You can edit the angle + /// by editing the value of the parameter object. + core::Ptr angle() const; + + /// Gets and sets the type of ruled surface. To set this to DirectionRuledSurfaceType, + /// use the direction property to set the direction entity, which will automatically set + /// this to DirectionRuledSurfaceType. + RuledSurfaceTypes ruledSurfaceType() const; + bool ruledSurfaceType(RuledSurfaceTypes value); + + /// Gets and sets the entity that defines the direction when the ruled surface type is DirectionRuledSurfaceType. + /// The direction is specified by providing a linear or planar entity. For example, a linear edge, construction axis, + /// planar face, or construction plane can be used as input. + /// If this property is set when the ruledSurfaceType is not DirectionRuledSurfaceType, the type will automatically be + /// changed to DirectionRuledSurfaceType. If you get this property when the direction is not DirectionRuledSurfaceType, + /// it will return null. + core::Ptr direction() const; + bool direction(const core::Ptr& value); + + /// Gets and sets if the other face is used for creation of the Ruled Surface. + /// When creating a ruled surface using the edges of a solid or the interior edges + /// of a surface the angle of the ruled surface is measured with respect to the + /// face the selected edge is bounding. For a solid, or an interior edge on a surface, + /// the edge connects to two faces. This setting toggles which of the two faces will + /// be used for measuring the angle. + bool alternateFace() const; + bool alternateFace(bool value); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Gets and sets the corner type for the ruled surface, indicating if the corners will be rounded or mitered. + /// The default value is rounded. + RuledSurfaceCornerTypes cornerType() const; + bool cornerType(RuledSurfaceCornerTypes value); + + ADSK_FUSION_RULEDSURFACEFEATURE_API static const char* classType(); + ADSK_FUSION_RULEDSURFACEFEATURE_API const char* objectType() const override; + ADSK_FUSION_RULEDSURFACEFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_RULEDSURFACEFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* profile_raw() const = 0; + virtual bool profile_raw(core::Base* value) = 0; + virtual ModelParameter* distance_raw() const = 0; + virtual ModelParameter* angle_raw() const = 0; + virtual RuledSurfaceTypes ruledSurfaceType_raw() const = 0; + virtual bool ruledSurfaceType_raw(RuledSurfaceTypes value) = 0; + virtual core::Base* direction_raw() const = 0; + virtual bool direction_raw(core::Base* value) = 0; + virtual bool alternateFace_raw() const = 0; + virtual bool alternateFace_raw(bool value) = 0; + virtual RuledSurfaceFeature* nativeObject_raw() const = 0; + virtual RuledSurfaceFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual RuledSurfaceCornerTypes cornerType_raw() const = 0; + virtual bool cornerType_raw(RuledSurfaceCornerTypes value) = 0; +}; + +// Inline wrappers + +inline core::Ptr RuledSurfaceFeature::profile() const +{ + core::Ptr res = profile_raw(); + return res; +} + +inline bool RuledSurfaceFeature::profile(const core::Ptr& value) +{ + return profile_raw(value.get()); +} + +inline core::Ptr RuledSurfaceFeature::distance() const +{ + core::Ptr res = distance_raw(); + return res; +} + +inline core::Ptr RuledSurfaceFeature::angle() const +{ + core::Ptr res = angle_raw(); + return res; +} + +inline RuledSurfaceTypes RuledSurfaceFeature::ruledSurfaceType() const +{ + RuledSurfaceTypes res = ruledSurfaceType_raw(); + return res; +} + +inline bool RuledSurfaceFeature::ruledSurfaceType(RuledSurfaceTypes value) +{ + return ruledSurfaceType_raw(value); +} + +inline core::Ptr RuledSurfaceFeature::direction() const +{ + core::Ptr res = direction_raw(); + return res; +} + +inline bool RuledSurfaceFeature::direction(const core::Ptr& value) +{ + return direction_raw(value.get()); +} + +inline bool RuledSurfaceFeature::alternateFace() const +{ + bool res = alternateFace_raw(); + return res; +} + +inline bool RuledSurfaceFeature::alternateFace(bool value) +{ + return alternateFace_raw(value); +} + +inline core::Ptr RuledSurfaceFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr RuledSurfaceFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline RuledSurfaceCornerTypes RuledSurfaceFeature::cornerType() const +{ + RuledSurfaceCornerTypes res = cornerType_raw(); + return res; +} + +inline bool RuledSurfaceFeature::cornerType(RuledSurfaceCornerTypes value) +{ + return cornerType_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_RULEDSURFACEFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/RuledSurfaceFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/RuledSurfaceFeatureInput.h new file mode 100644 index 0000000..73c502c --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/RuledSurfaceFeatureInput.h @@ -0,0 +1,252 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_RULEDSURFACEFEATUREINPUT_CPP__ +# define ADSK_FUSION_RULEDSURFACEFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_RULEDSURFACEFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_RULEDSURFACEFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class Occurrence; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a Ruled Surface feature. +class RuledSurfaceFeatureInput : public core::Base { +public: + + /// Gets and sets the Profile object that defines the sketch geometry or edges that define the shape of + /// the ruled surface. The Component.createBRepEdgeProfile method is useful to create a profile defined from edges. + core::Ptr profile() const; + bool profile(const core::Ptr& value); + + /// In order for geometry to be transformed correctly, an Occurrence for creation needs to be + /// specified when the Ruled Surface is created based on geometry (e.g. a profile) + /// in another component AND (the Ruled Surface) is not in the root component. + /// The CreationOccurrence is analogous to the active occurrence in the UI + core::Ptr creationOccurrence() const; + bool creationOccurrence(const core::Ptr& value); + + /// Gets and sets the ValueInput object that defines the Ruled Surface distance. If the value input is + /// a real value it will define the distance in centimeters. + core::Ptr distance() const; + bool distance(const core::Ptr& value); + + /// Gets and sets the ValueInput object that defines the Ruled Surface angle. + /// If the input is a real value, the units are radians. + core::Ptr angle() const; + bool angle(const core::Ptr& value); + + /// Gets and sets the type of ruled surface to create. To set this to DirectionRuledSurfaceType, + /// use the direction property to set the direction entity, which will automatically set + /// this to DirectionRuledSurfaceType. + RuledSurfaceTypes ruledSurfaceType() const; + bool ruledSurfaceType(RuledSurfaceTypes value); + + /// Gets and sets the entity that defines the direction when the ruled surface type is DirectionRuledSurfaceType. + /// The direction is specified by providing a linear or planar entity. For example, a linear edge, construction axis, + /// planar face, or construction plane can be used as input. + /// If this property is set when the ruledSurfaceType is not DirectionRuledSurfaceType, the type will automatically be + /// changed to DirectionRuledSurfaceType. If you get this property when the direction is not DirectionRuledSurfaceType, + /// it will return null. + core::Ptr direction() const; + bool direction(const core::Ptr& value); + + /// Gets and sets if the other face is used for creation of the Ruled Surface. + /// When creating a ruled surface using the edges of a solid or the interior edges + /// of a surface the angle of the ruled surface is measured with respect to the + /// face the selected edge is bounding. For a solid, or an interior edge on a surface, + /// the edge connects to two faces. This setting toggles which of the two faces will + /// be used for measuring the angle. + bool alternateFace() const; + bool alternateFace(bool value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + /// Gets and sets the type of operation performed by the ruled surface. + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// Gets and sets the corner type for the ruled surface, indicating if the corners will be rounded or mitered. + /// The default value is rounded. + RuledSurfaceCornerTypes cornerType() const; + bool cornerType(RuledSurfaceCornerTypes value); + + ADSK_FUSION_RULEDSURFACEFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_RULEDSURFACEFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_RULEDSURFACEFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_RULEDSURFACEFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* profile_raw() const = 0; + virtual bool profile_raw(core::Base* value) = 0; + virtual Occurrence* creationOccurrence_raw() const = 0; + virtual bool creationOccurrence_raw(Occurrence* value) = 0; + virtual core::ValueInput* distance_raw() const = 0; + virtual bool distance_raw(core::ValueInput* value) = 0; + virtual core::ValueInput* angle_raw() const = 0; + virtual bool angle_raw(core::ValueInput* value) = 0; + virtual RuledSurfaceTypes ruledSurfaceType_raw() const = 0; + virtual bool ruledSurfaceType_raw(RuledSurfaceTypes value) = 0; + virtual core::Base* direction_raw() const = 0; + virtual bool direction_raw(core::Base* value) = 0; + virtual bool alternateFace_raw() const = 0; + virtual bool alternateFace_raw(bool value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual RuledSurfaceCornerTypes cornerType_raw() const = 0; + virtual bool cornerType_raw(RuledSurfaceCornerTypes value) = 0; +}; + +// Inline wrappers + +inline core::Ptr RuledSurfaceFeatureInput::profile() const +{ + core::Ptr res = profile_raw(); + return res; +} + +inline bool RuledSurfaceFeatureInput::profile(const core::Ptr& value) +{ + return profile_raw(value.get()); +} + +inline core::Ptr RuledSurfaceFeatureInput::creationOccurrence() const +{ + core::Ptr res = creationOccurrence_raw(); + return res; +} + +inline bool RuledSurfaceFeatureInput::creationOccurrence(const core::Ptr& value) +{ + return creationOccurrence_raw(value.get()); +} + +inline core::Ptr RuledSurfaceFeatureInput::distance() const +{ + core::Ptr res = distance_raw(); + return res; +} + +inline bool RuledSurfaceFeatureInput::distance(const core::Ptr& value) +{ + return distance_raw(value.get()); +} + +inline core::Ptr RuledSurfaceFeatureInput::angle() const +{ + core::Ptr res = angle_raw(); + return res; +} + +inline bool RuledSurfaceFeatureInput::angle(const core::Ptr& value) +{ + return angle_raw(value.get()); +} + +inline RuledSurfaceTypes RuledSurfaceFeatureInput::ruledSurfaceType() const +{ + RuledSurfaceTypes res = ruledSurfaceType_raw(); + return res; +} + +inline bool RuledSurfaceFeatureInput::ruledSurfaceType(RuledSurfaceTypes value) +{ + return ruledSurfaceType_raw(value); +} + +inline core::Ptr RuledSurfaceFeatureInput::direction() const +{ + core::Ptr res = direction_raw(); + return res; +} + +inline bool RuledSurfaceFeatureInput::direction(const core::Ptr& value) +{ + return direction_raw(value.get()); +} + +inline bool RuledSurfaceFeatureInput::alternateFace() const +{ + bool res = alternateFace_raw(); + return res; +} + +inline bool RuledSurfaceFeatureInput::alternateFace(bool value) +{ + return alternateFace_raw(value); +} + +inline core::Ptr RuledSurfaceFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool RuledSurfaceFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} + +inline FeatureOperations RuledSurfaceFeatureInput::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool RuledSurfaceFeatureInput::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline RuledSurfaceCornerTypes RuledSurfaceFeatureInput::cornerType() const +{ + RuledSurfaceCornerTypes res = cornerType_raw(); + return res; +} + +inline bool RuledSurfaceFeatureInput::cornerType(RuledSurfaceCornerTypes value) +{ + return cornerType_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_RULEDSURFACEFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/RuledSurfaceFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/RuledSurfaceFeatures.h new file mode 100644 index 0000000..7858f2d --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/RuledSurfaceFeatures.h @@ -0,0 +1,138 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_RULEDSURFACEFEATURES_CPP__ +# define ADSK_FUSION_RULEDSURFACEFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_RULEDSURFACEFEATURES_API +# endif +#else +# define ADSK_FUSION_RULEDSURFACEFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class RuledSurfaceFeature; + class RuledSurfaceFeatureInput; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing Ruled Surface features in a component +/// and supports the ability to create new Ruled Surface features. +class RuledSurfaceFeatures : public core::Base { +public: + + /// Function that returns the specified ruled surface feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of RuledSurface features in the collection. + size_t count() const; + + /// Creates a RuledSurfaceFeatureInput object that defines the input needed to create a ruled surface feature. Use the input + /// object to define the input to create the desired feature and then use the Add method, passing in the RuledSurfaceFeatureInput object. + /// profile : A Profile object that defines the sketch geometry or edges that define the shape of the ruled surface. The Component.createBRepEdgeProfile + /// method is useful to create a profile defined from edges. + /// distance : ValueInput object that defines the extension distance of the Ruled Surface.. + /// angle : ValueInput object that defines angle to use when creating the Ruled Surface. When the input is a real value, the units are radians. + /// ruledSurfaceType : The Ruled Surface type (TangentRuledSurfaceType, NormalRuledSurfaceType, or DirectionRuledSurfaceType). + /// direction : If the ruled surface type is DirectionRuledSurfaceType, you must specify the direction. The direction is specified by + /// providing a linear or planar entity. For example, a linear edge, construction axis, planar face, or construction plane can be used as input. + /// Returns the newly created RuledSurfaceFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& profile, const core::Ptr& distance, const core::Ptr& angle, RuledSurfaceTypes ruledSurfaceType, const core::Ptr& direction = NULL) const; + + /// Creates a new RuledSurface feature. + /// input : An RuledSurfaceFeatureInput object that defines the desired RuledSurface feature. Use the createInput + /// method to create a new RuledSurfaceFeatureInput object and then use methods on it + /// (the RuledSurfaceFeatureInput object) to define the desired options for the ruled surface feature. + /// Returns the newly created RuledSurfaceFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified RuledSurface feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef RuledSurfaceFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_RULEDSURFACEFEATURES_API static const char* classType(); + ADSK_FUSION_RULEDSURFACEFEATURES_API const char* objectType() const override; + ADSK_FUSION_RULEDSURFACEFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_RULEDSURFACEFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual RuledSurfaceFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual RuledSurfaceFeatureInput* createInput_raw(core::Base* profile, core::ValueInput* distance, core::ValueInput* angle, RuledSurfaceTypes ruledSurfaceType, core::Base* direction) const = 0; + virtual RuledSurfaceFeature* add_raw(RuledSurfaceFeatureInput* input) = 0; + virtual RuledSurfaceFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr RuledSurfaceFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t RuledSurfaceFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr RuledSurfaceFeatures::createInput(const core::Ptr& profile, const core::Ptr& distance, const core::Ptr& angle, RuledSurfaceTypes ruledSurfaceType, const core::Ptr& direction) const +{ + core::Ptr res = createInput_raw(profile.get(), distance.get(), angle.get(), ruledSurfaceType, direction.get()); + return res; +} + +inline core::Ptr RuledSurfaceFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr RuledSurfaceFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void RuledSurfaceFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_RULEDSURFACEFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ScaleFeature.h b/usr/autodesk/CPP/include/Fusion/Features/ScaleFeature.h new file mode 100644 index 0000000..5da2c2f --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ScaleFeature.h @@ -0,0 +1,216 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SCALEFEATURE_CPP__ +# define ADSK_FUSION_SCALEFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_SCALEFEATURE_API +# endif +#else +# define ADSK_FUSION_SCALEFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; + class Occurrence; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing scale feature in a design. +class ScaleFeature : public Feature { +public: + + /// Gets and sets the input entities. + /// This collection can contain sketches, BRep bodies and T-Spline bodies in parametric modeling. + /// It can contain sketches, BRep bodies, T-Spline bodies, mesh bodies, root component and occurrences in non-parametric modeling. + /// If the scaling is non-uniform (the isUniform property is false), this collection cannot contain sketches or components. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr inputEntities() const; + bool inputEntities(const core::Ptr& value); + + /// Gets and sets the point as reference to scale. This can be a BRepVertex, a SketchPoint or a ConstructionPoint. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr point() const; + bool point(const core::Ptr& value); + + /// Calling this method will change to a uniform scale. + /// The isUniform is set to true if successful. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// scaleFactor : A ValueInput object that defines the scale factor. + /// Returns true if successful. + bool setToUniform(const core::Ptr& scaleFactor); + + /// Calling this method will change to a non-uniform scale. + /// Fails of the inputEntities collection contains sketches or components. + /// The isUniform is set to false if successful. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// xScale : A ValueInput object that defines the scale in the X direction. + /// yScale : A ValueInput object that defines the scale in the Y direction. + /// zScale : A ValueInput object that defines the scale in the Z direction. + /// Returns true if successful. + bool setToNonUniform(const core::Ptr& xScale, const core::Ptr& yScale, const core::Ptr& zScale); + + /// Gets if it's uniform scale. + bool isUniform() const; + + /// Returns the parameter that controls the uniform scale factor. This will return null in the case + /// where isUniform is false or the feature is non-parametric. You can use the properties and + /// methods on the ModelParameter object to get and set the value. + core::Ptr scaleFactor() const; + + /// Returns the parameter that controls the X scale factor. This will return null in the case + /// where isUniform is false or the feature is non-parametric. You can use the properties and + /// methods on the ModelParameter object to get and set the value. + core::Ptr xScale() const; + + /// Returns the parameter that controls the Y scale factor. This will return null in the case + /// where isUniform is false or the feature is non-parametric. You can use the properties and + /// methods on the ModelParameter object to get and set the value. + core::Ptr yScale() const; + + /// Returns the parameter that controls the Z scale factor. This will return null in the case + /// where isUniform is false or the feature is non-parametric. You can use the properties and + /// methods on the ModelParameter object to get and set the value. + core::Ptr zScale() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SCALEFEATURE_API static const char* classType(); + ADSK_FUSION_SCALEFEATURE_API const char* objectType() const override; + ADSK_FUSION_SCALEFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SCALEFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* inputEntities_raw() const = 0; + virtual bool inputEntities_raw(core::ObjectCollection* value) = 0; + virtual core::Base* point_raw() const = 0; + virtual bool point_raw(core::Base* value) = 0; + virtual bool setToUniform_raw(core::ValueInput* scaleFactor) = 0; + virtual bool setToNonUniform_raw(core::ValueInput* xScale, core::ValueInput* yScale, core::ValueInput* zScale) = 0; + virtual bool isUniform_raw() const = 0; + virtual ModelParameter* scaleFactor_raw() const = 0; + virtual ModelParameter* xScale_raw() const = 0; + virtual ModelParameter* yScale_raw() const = 0; + virtual ModelParameter* zScale_raw() const = 0; + virtual ScaleFeature* nativeObject_raw() const = 0; + virtual ScaleFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr ScaleFeature::inputEntities() const +{ + core::Ptr res = inputEntities_raw(); + return res; +} + +inline bool ScaleFeature::inputEntities(const core::Ptr& value) +{ + return inputEntities_raw(value.get()); +} + +inline core::Ptr ScaleFeature::point() const +{ + core::Ptr res = point_raw(); + return res; +} + +inline bool ScaleFeature::point(const core::Ptr& value) +{ + return point_raw(value.get()); +} + +inline bool ScaleFeature::setToUniform(const core::Ptr& scaleFactor) +{ + bool res = setToUniform_raw(scaleFactor.get()); + return res; +} + +inline bool ScaleFeature::setToNonUniform(const core::Ptr& xScale, const core::Ptr& yScale, const core::Ptr& zScale) +{ + bool res = setToNonUniform_raw(xScale.get(), yScale.get(), zScale.get()); + return res; +} + +inline bool ScaleFeature::isUniform() const +{ + bool res = isUniform_raw(); + return res; +} + +inline core::Ptr ScaleFeature::scaleFactor() const +{ + core::Ptr res = scaleFactor_raw(); + return res; +} + +inline core::Ptr ScaleFeature::xScale() const +{ + core::Ptr res = xScale_raw(); + return res; +} + +inline core::Ptr ScaleFeature::yScale() const +{ + core::Ptr res = yScale_raw(); + return res; +} + +inline core::Ptr ScaleFeature::zScale() const +{ + core::Ptr res = zScale_raw(); + return res; +} + +inline core::Ptr ScaleFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr ScaleFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SCALEFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ScaleFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/ScaleFeatureInput.h new file mode 100644 index 0000000..3c5fd75 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ScaleFeatureInput.h @@ -0,0 +1,192 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SCALEFEATUREINPUT_CPP__ +# define ADSK_FUSION_SCALEFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_SCALEFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_SCALEFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a scale +/// feature. +class ScaleFeatureInput : public core::Base { +public: + + /// Gets and sets the input entities. + /// This collection can contain sketches, BRep bodies and T-Spline bodies in parametric modeling. + /// It can contain sketches, BRep bodies, T-Spline bodies, mesh bodies, root component and occurrences in non-parametric modeling. + /// If the scaling is non-uniform (the isUniform property is false), this collection cannot contain sketches or components. + core::Ptr inputEntities() const; + bool inputEntities(const core::Ptr& value); + + /// Gets and sets the origin point of the scale. This can be a BRepVertex, a SketchPoint or a ConstructionPoint. + core::Ptr point() const; + bool point(const core::Ptr& value); + + /// Gets and sets the scale factor used for a uniform scale. + /// Setting this value will cause the isUniform property to be set to true. + core::Ptr scaleFactor() const; + bool scaleFactor(const core::Ptr& value); + + /// Gets if the scale is uniform. + bool isUniform() const; + + /// Sets the scale factor for the x, y, z directions to define a non-uniform scale. + /// Calling this method will cause the isUniform property to be set to false. + /// This will fail if the inputEntities collection contains sketches or components. + /// xScale : A ValueInput object that defines the scale in the X direction. + /// yScale : A ValueInput object that defines the scale in the Y direction. + /// zScale : A ValueInput object that defines the scale in the Z direction. + /// Returns true if successful. + bool setToNonUniform(const core::Ptr& xScale, const core::Ptr& yScale, const core::Ptr& zScale); + + /// Gets the scale in X direction. + core::Ptr xScale() const; + + /// Gets the scale in Y direction. + core::Ptr yScale() const; + + /// Gets the scale in Z direction. + core::Ptr zScale() const; + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_SCALEFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_SCALEFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_SCALEFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SCALEFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* inputEntities_raw() const = 0; + virtual bool inputEntities_raw(core::ObjectCollection* value) = 0; + virtual core::Base* point_raw() const = 0; + virtual bool point_raw(core::Base* value) = 0; + virtual core::ValueInput* scaleFactor_raw() const = 0; + virtual bool scaleFactor_raw(core::ValueInput* value) = 0; + virtual bool isUniform_raw() const = 0; + virtual bool setToNonUniform_raw(core::ValueInput* xScale, core::ValueInput* yScale, core::ValueInput* zScale) = 0; + virtual core::ValueInput* xScale_raw() const = 0; + virtual core::ValueInput* yScale_raw() const = 0; + virtual core::ValueInput* zScale_raw() const = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr ScaleFeatureInput::inputEntities() const +{ + core::Ptr res = inputEntities_raw(); + return res; +} + +inline bool ScaleFeatureInput::inputEntities(const core::Ptr& value) +{ + return inputEntities_raw(value.get()); +} + +inline core::Ptr ScaleFeatureInput::point() const +{ + core::Ptr res = point_raw(); + return res; +} + +inline bool ScaleFeatureInput::point(const core::Ptr& value) +{ + return point_raw(value.get()); +} + +inline core::Ptr ScaleFeatureInput::scaleFactor() const +{ + core::Ptr res = scaleFactor_raw(); + return res; +} + +inline bool ScaleFeatureInput::scaleFactor(const core::Ptr& value) +{ + return scaleFactor_raw(value.get()); +} + +inline bool ScaleFeatureInput::isUniform() const +{ + bool res = isUniform_raw(); + return res; +} + +inline bool ScaleFeatureInput::setToNonUniform(const core::Ptr& xScale, const core::Ptr& yScale, const core::Ptr& zScale) +{ + bool res = setToNonUniform_raw(xScale.get(), yScale.get(), zScale.get()); + return res; +} + +inline core::Ptr ScaleFeatureInput::xScale() const +{ + core::Ptr res = xScale_raw(); + return res; +} + +inline core::Ptr ScaleFeatureInput::yScale() const +{ + core::Ptr res = yScale_raw(); + return res; +} + +inline core::Ptr ScaleFeatureInput::zScale() const +{ + core::Ptr res = zScale_raw(); + return res; +} + +inline core::Ptr ScaleFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool ScaleFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SCALEFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ScaleFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/ScaleFeatures.h new file mode 100644 index 0000000..1fb9c67 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ScaleFeatures.h @@ -0,0 +1,138 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SCALEFEATURES_CPP__ +# define ADSK_FUSION_SCALEFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_SCALEFEATURES_API +# endif +#else +# define ADSK_FUSION_SCALEFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ScaleFeature; + class ScaleFeatureInput; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing scale features in a component +/// and supports the ability to create new scale features. +class ScaleFeatures : public core::Base { +public: + + /// Function that returns the specified scale feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of scale features in the collection. + size_t count() const; + + /// Creates a ScaleFeatureInput object. Use properties and methods on this object + /// to define the scale you want to create and then use the Add method, passing in + /// the ScaleFeatureInput object. + /// inputEntities : This collection can contain sketches, BRep bodies and T-Spline bodies in parametric modeling. + /// It can contain sketches, BRep bodies, T-Spline bodies, mesh bodies, root component and occurrences in non-parametric modeling. + /// point : Input a point as reference to scale. This can be a BRepVertex, a SketchPoint or a ConstructionPoint. + /// scaleFactor : The ValueInput object that defines the scale factor for uniform scale. + /// Returns the newly created ScaleFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& inputEntities, const core::Ptr& point, const core::Ptr& scaleFactor) const; + + /// Creates a new scale feature. + /// input : A ScaleFeatureInput object that defines the desired scale. Use the createInput + /// method to create a new ScaleFeatureInput object and then use methods on it + /// (the ScaleFeatureInput object) to define the scale. + /// Returns the newly created ScaleFeature object or null if the creation failed. + /// Returns nothing in the case where the feature is non-parametric. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified scale feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef ScaleFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SCALEFEATURES_API static const char* classType(); + ADSK_FUSION_SCALEFEATURES_API const char* objectType() const override; + ADSK_FUSION_SCALEFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SCALEFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ScaleFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual ScaleFeatureInput* createInput_raw(core::ObjectCollection* inputEntities, core::Base* point, core::ValueInput* scaleFactor) const = 0; + virtual ScaleFeature* add_raw(ScaleFeatureInput* input) = 0; + virtual ScaleFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr ScaleFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t ScaleFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr ScaleFeatures::createInput(const core::Ptr& inputEntities, const core::Ptr& point, const core::Ptr& scaleFactor) const +{ + core::Ptr res = createInput_raw(inputEntities.get(), point.get(), scaleFactor.get()); + return res; +} + +inline core::Ptr ScaleFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr ScaleFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void ScaleFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SCALEFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ShellFeature.h b/usr/autodesk/CPP/include/Fusion/Features/ShellFeature.h new file mode 100644 index 0000000..49314b3 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ShellFeature.h @@ -0,0 +1,161 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SHELLFEATURE_CPP__ +# define ADSK_FUSION_SHELLFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_SHELLFEATURE_API +# endif +#else +# define ADSK_FUSION_SHELLFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; + class Occurrence; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing shell feature in a design. +class ShellFeature : public Feature { +public: + + /// Method that sets faces to remove and bodies to preform shell. Return false if any faces are input, and the owning bodies of the faces are also input. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// inputEntities : The collection contains the faces to remove and the bodies to perform shell. + /// Fails if any faces are input, and the owning bodies of the faces are also input. + /// isTangentChain : A boolean value for setting whether or not faces that are tangentially connected to + /// the input faces (if any) will also be included. It defaults to true. + /// Returns true if successful + bool setInputEntities(const core::Ptr& inputEntities, bool isTangentChain = true); + + /// Method that sets the inside and outside thicknesses of the shell. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// insideThickness : ValueInput object that defines the inside thickness. If set to null, the inside thickness is removed. + /// outsideThickness : ValueInput object that defines the outside thickness. If set to null, the outside thickness is removed. + /// Returns true if successful + bool setThicknesses(const core::Ptr& insideThickness, const core::Ptr& outsideThickness); + + /// Gets the input faces/bodies. + core::Ptr inputEntities() const; + + /// Gets if any faces that are tangentially connected to any of + /// the input faces will also be included in setting InputEntities. + bool isTangentChain() const; + + /// Gets the inside thickness. + /// Edit the thickness through ModelParameter. + /// This property returns nothing in the case where the feature is non-parametric. + core::Ptr insideThickness() const; + + /// Gets the outside thickness. + /// Edit the thickness through ModelParameter. + /// This property returns nothing in the case where the feature is non-parametric. + core::Ptr outsideThickness() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SHELLFEATURE_API static const char* classType(); + ADSK_FUSION_SHELLFEATURE_API const char* objectType() const override; + ADSK_FUSION_SHELLFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SHELLFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool setInputEntities_raw(core::ObjectCollection* inputEntities, bool isTangentChain) = 0; + virtual bool setThicknesses_raw(core::ValueInput* insideThickness, core::ValueInput* outsideThickness) = 0; + virtual core::ObjectCollection* inputEntities_raw() const = 0; + virtual bool isTangentChain_raw() const = 0; + virtual ModelParameter* insideThickness_raw() const = 0; + virtual ModelParameter* outsideThickness_raw() const = 0; + virtual ShellFeature* nativeObject_raw() const = 0; + virtual ShellFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline bool ShellFeature::setInputEntities(const core::Ptr& inputEntities, bool isTangentChain) +{ + bool res = setInputEntities_raw(inputEntities.get(), isTangentChain); + return res; +} + +inline bool ShellFeature::setThicknesses(const core::Ptr& insideThickness, const core::Ptr& outsideThickness) +{ + bool res = setThicknesses_raw(insideThickness.get(), outsideThickness.get()); + return res; +} + +inline core::Ptr ShellFeature::inputEntities() const +{ + core::Ptr res = inputEntities_raw(); + return res; +} + +inline bool ShellFeature::isTangentChain() const +{ + bool res = isTangentChain_raw(); + return res; +} + +inline core::Ptr ShellFeature::insideThickness() const +{ + core::Ptr res = insideThickness_raw(); + return res; +} + +inline core::Ptr ShellFeature::outsideThickness() const +{ + core::Ptr res = outsideThickness_raw(); + return res; +} + +inline core::Ptr ShellFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr ShellFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SHELLFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ShellFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/ShellFeatureInput.h new file mode 100644 index 0000000..95cf071 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ShellFeatureInput.h @@ -0,0 +1,173 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SHELLFEATUREINPUT_CPP__ +# define ADSK_FUSION_SHELLFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_SHELLFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_SHELLFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class Occurrence; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a shell +/// feature. +class ShellFeatureInput : public core::Base { +public: + + /// Gets and sets the input faces/bodies. + /// If IsTangentChain is true, all the faces that are tangentially connected to the input faces (if any) will also be included. + /// Fails if any faces are input, and the owning bodies of the faces are also input. + core::Ptr inputEntities() const; + bool inputEntities(const core::Ptr& value); + + /// Gets and sets if any faces that are tangentially connected to any of + /// the input faces will also be included in setting InputEntities. It defaults to true. + bool isTangentChain() const; + bool isTangentChain(bool value); + + /// Gets and sets the inside thickness. + core::Ptr insideThickness() const; + bool insideThickness(const core::Ptr& value); + + /// Gets and sets the outside thickness. + core::Ptr outsideThickness() const; + bool outsideThickness(const core::Ptr& value); + + /// In order for geometry to be transformed correctly, an Occurrence for creation needs to be + /// specified when the shell is created based on geometry (e.g. a profile and/or face(s)) + /// in another component AND (the shell) is not in the root component. + /// The CreationOccurrence is analogous to the active occurrence in the UI + core::Ptr creationOccurrence() const; + bool creationOccurrence(const core::Ptr& value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_SHELLFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_SHELLFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_SHELLFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SHELLFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* inputEntities_raw() const = 0; + virtual bool inputEntities_raw(core::ObjectCollection* value) = 0; + virtual bool isTangentChain_raw() const = 0; + virtual bool isTangentChain_raw(bool value) = 0; + virtual core::ValueInput* insideThickness_raw() const = 0; + virtual bool insideThickness_raw(core::ValueInput* value) = 0; + virtual core::ValueInput* outsideThickness_raw() const = 0; + virtual bool outsideThickness_raw(core::ValueInput* value) = 0; + virtual Occurrence* creationOccurrence_raw() const = 0; + virtual bool creationOccurrence_raw(Occurrence* value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr ShellFeatureInput::inputEntities() const +{ + core::Ptr res = inputEntities_raw(); + return res; +} + +inline bool ShellFeatureInput::inputEntities(const core::Ptr& value) +{ + return inputEntities_raw(value.get()); +} + +inline bool ShellFeatureInput::isTangentChain() const +{ + bool res = isTangentChain_raw(); + return res; +} + +inline bool ShellFeatureInput::isTangentChain(bool value) +{ + return isTangentChain_raw(value); +} + +inline core::Ptr ShellFeatureInput::insideThickness() const +{ + core::Ptr res = insideThickness_raw(); + return res; +} + +inline bool ShellFeatureInput::insideThickness(const core::Ptr& value) +{ + return insideThickness_raw(value.get()); +} + +inline core::Ptr ShellFeatureInput::outsideThickness() const +{ + core::Ptr res = outsideThickness_raw(); + return res; +} + +inline bool ShellFeatureInput::outsideThickness(const core::Ptr& value) +{ + return outsideThickness_raw(value.get()); +} + +inline core::Ptr ShellFeatureInput::creationOccurrence() const +{ + core::Ptr res = creationOccurrence_raw(); + return res; +} + +inline bool ShellFeatureInput::creationOccurrence(const core::Ptr& value) +{ + return creationOccurrence_raw(value.get()); +} + +inline core::Ptr ShellFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool ShellFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SHELLFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ShellFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/ShellFeatures.h new file mode 100644 index 0000000..b4c043f --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ShellFeatures.h @@ -0,0 +1,136 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SHELLFEATURES_CPP__ +# define ADSK_FUSION_SHELLFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_SHELLFEATURES_API +# endif +#else +# define ADSK_FUSION_SHELLFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ShellFeature; + class ShellFeatureInput; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing shell features in a component +/// and supports the ability to create new shell features. +class ShellFeatures : public core::Base { +public: + + /// Function that returns the specified shell feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of shell features in the collection. + size_t count() const; + + /// Creates a ShellFeatureInput object. Use properties and methods on this object + /// to define the shell you want to create and then use the Add method, passing in + /// the ShellFeatureInput object. + /// inputEntities : The collection contains the faces to remove and the bodies to perform shell. + /// Fails if any faces are input, and the owning bodies of the faces are also input. + /// isTangentChain : A boolean value for setting whether or not faces that are tangentially connected to + /// the input faces (if any) will also be included. It defaults to true. + /// Returns the newly created ShellFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& inputEntities, bool isTangentChain = true) const; + + /// Creates a new shell feature. + /// input : A ShellFeatureInput object that defines the desired shell. Use the createInput + /// method to create a new ShellFeatureInput object and then use methods on it + /// (the ShellFeatureInput object) to define the shell. + /// Returns the newly created ShellFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified shell feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef ShellFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SHELLFEATURES_API static const char* classType(); + ADSK_FUSION_SHELLFEATURES_API const char* objectType() const override; + ADSK_FUSION_SHELLFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SHELLFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ShellFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual ShellFeatureInput* createInput_raw(core::ObjectCollection* inputEntities, bool isTangentChain) const = 0; + virtual ShellFeature* add_raw(ShellFeatureInput* input) = 0; + virtual ShellFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr ShellFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t ShellFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr ShellFeatures::createInput(const core::Ptr& inputEntities, bool isTangentChain) const +{ + core::Ptr res = createInput_raw(inputEntities.get(), isTangentChain); + return res; +} + +inline core::Ptr ShellFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr ShellFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void ShellFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SHELLFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SilhouetteSplitFeature.h b/usr/autodesk/CPP/include/Fusion/Features/SilhouetteSplitFeature.h new file mode 100644 index 0000000..881a2f4 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SilhouetteSplitFeature.h @@ -0,0 +1,130 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SILHOUETTESPLITFEATURE_CPP__ +# define ADSK_FUSION_SILHOUETTESPLITFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_SILHOUETTESPLITFEATURE_API +# endif +#else +# define ADSK_FUSION_SILHOUETTESPLITFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing silhouette split feature in a design. +class SilhouetteSplitFeature : public Feature { +public: + + /// Gets and sets the entity that defines the silhouette view direction, which can be a + /// construction axis, linear BRepEdge, planar BRepFace or a construction plane. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr viewDirection() const; + bool viewDirection(const core::Ptr& value); + + /// Gets and sets the solid body to split. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr targetBody() const; + bool targetBody(const core::Ptr& value); + + /// Gets the type of silhouette split operation. + SilhouetteSplitOperations operation() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SILHOUETTESPLITFEATURE_API static const char* classType(); + ADSK_FUSION_SILHOUETTESPLITFEATURE_API const char* objectType() const override; + ADSK_FUSION_SILHOUETTESPLITFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SILHOUETTESPLITFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* viewDirection_raw() const = 0; + virtual bool viewDirection_raw(core::Base* value) = 0; + virtual BRepBody* targetBody_raw() const = 0; + virtual bool targetBody_raw(BRepBody* value) = 0; + virtual SilhouetteSplitOperations operation_raw() const = 0; + virtual SilhouetteSplitFeature* nativeObject_raw() const = 0; + virtual SilhouetteSplitFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SilhouetteSplitFeature::viewDirection() const +{ + core::Ptr res = viewDirection_raw(); + return res; +} + +inline bool SilhouetteSplitFeature::viewDirection(const core::Ptr& value) +{ + return viewDirection_raw(value.get()); +} + +inline core::Ptr SilhouetteSplitFeature::targetBody() const +{ + core::Ptr res = targetBody_raw(); + return res; +} + +inline bool SilhouetteSplitFeature::targetBody(const core::Ptr& value) +{ + return targetBody_raw(value.get()); +} + +inline SilhouetteSplitOperations SilhouetteSplitFeature::operation() const +{ + SilhouetteSplitOperations res = operation_raw(); + return res; +} + +inline core::Ptr SilhouetteSplitFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SilhouetteSplitFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SILHOUETTESPLITFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SilhouetteSplitFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/SilhouetteSplitFeatureInput.h new file mode 100644 index 0000000..1a83245 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SilhouetteSplitFeatureInput.h @@ -0,0 +1,129 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SILHOUETTESPLITFEATUREINPUT_CPP__ +# define ADSK_FUSION_SILHOUETTESPLITFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_SILHOUETTESPLITFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_SILHOUETTESPLITFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class BRepBody; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a silhouette split feature. +class SilhouetteSplitFeatureInput : public core::Base { +public: + + /// Gets and sets the solid body to split. + core::Ptr targetBody() const; + bool targetBody(const core::Ptr& value); + + /// Gets and sets the entity that defines the silhouette view direction, which can be a + /// construction axis, linear BRepEdge, planar BRepFace or a construction plane. + core::Ptr viewDirection() const; + bool viewDirection(const core::Ptr& value); + + /// Gets and sets the type of silhouette split operation to perform. + SilhouetteSplitOperations operation() const; + bool operation(SilhouetteSplitOperations value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_SILHOUETTESPLITFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_SILHOUETTESPLITFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_SILHOUETTESPLITFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SILHOUETTESPLITFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepBody* targetBody_raw() const = 0; + virtual bool targetBody_raw(BRepBody* value) = 0; + virtual core::Base* viewDirection_raw() const = 0; + virtual bool viewDirection_raw(core::Base* value) = 0; + virtual SilhouetteSplitOperations operation_raw() const = 0; + virtual bool operation_raw(SilhouetteSplitOperations value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr SilhouetteSplitFeatureInput::targetBody() const +{ + core::Ptr res = targetBody_raw(); + return res; +} + +inline bool SilhouetteSplitFeatureInput::targetBody(const core::Ptr& value) +{ + return targetBody_raw(value.get()); +} + +inline core::Ptr SilhouetteSplitFeatureInput::viewDirection() const +{ + core::Ptr res = viewDirection_raw(); + return res; +} + +inline bool SilhouetteSplitFeatureInput::viewDirection(const core::Ptr& value) +{ + return viewDirection_raw(value.get()); +} + +inline SilhouetteSplitOperations SilhouetteSplitFeatureInput::operation() const +{ + SilhouetteSplitOperations res = operation_raw(); + return res; +} + +inline bool SilhouetteSplitFeatureInput::operation(SilhouetteSplitOperations value) +{ + return operation_raw(value); +} + +inline core::Ptr SilhouetteSplitFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool SilhouetteSplitFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SILHOUETTESPLITFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SilhouetteSplitFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/SilhouetteSplitFeatures.h new file mode 100644 index 0000000..ccceeee --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SilhouetteSplitFeatures.h @@ -0,0 +1,134 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SILHOUETTESPLITFEATURES_CPP__ +# define ADSK_FUSION_SILHOUETTESPLITFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_SILHOUETTESPLITFEATURES_API +# endif +#else +# define ADSK_FUSION_SILHOUETTESPLITFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class SilhouetteSplitFeature; + class SilhouetteSplitFeatureInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing Silhouette Split features in a component +/// and supports the ability to create new Silhouette Split features. +class SilhouetteSplitFeatures : public core::Base { +public: + + /// Function that returns the specified silhouette split feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of Silhouette Split features in the collection. + size_t count() const; + + /// Creates a SilhouetteSplitFeatureInput object. Use properties and methods on this object + /// to define the silhouette split you want to create and then use the Add method, passing in + /// the SilhouetteSplitFeatureInput object. + /// viewDirection : A construction axis, linear BRepEdge, planar BRepFace or a construction plane that defines the view direction + /// where the silhouette is calculated. + /// targetBody : Input the single solid body to split + /// operation : The type of silhouette split operation to perform. + /// Returns the newly created SilhouetteSplitFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& viewDirection, const core::Ptr& targetBody, SilhouetteSplitOperations operation) const; + + /// Creates a new silhouette split feature. + /// input : A SilhouetteSplitFeatureInput object that defines the desired silhouette split feature. Use the createInput + /// method to create a new SilhouetteSplitFeatureInput object and then use methods on it + /// (the SilhouetteSplitFeatureInput object) to define the silhouette split. + /// Returns the newly created SilhouetteSplitFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified silhouette split feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef SilhouetteSplitFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SILHOUETTESPLITFEATURES_API static const char* classType(); + ADSK_FUSION_SILHOUETTESPLITFEATURES_API const char* objectType() const override; + ADSK_FUSION_SILHOUETTESPLITFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SILHOUETTESPLITFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SilhouetteSplitFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual SilhouetteSplitFeatureInput* createInput_raw(core::Base* viewDirection, BRepBody* targetBody, SilhouetteSplitOperations operation) const = 0; + virtual SilhouetteSplitFeature* add_raw(SilhouetteSplitFeatureInput* input) = 0; + virtual SilhouetteSplitFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SilhouetteSplitFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SilhouetteSplitFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr SilhouetteSplitFeatures::createInput(const core::Ptr& viewDirection, const core::Ptr& targetBody, SilhouetteSplitOperations operation) const +{ + core::Ptr res = createInput_raw(viewDirection.get(), targetBody.get(), operation); + return res; +} + +inline core::Ptr SilhouetteSplitFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr SilhouetteSplitFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void SilhouetteSplitFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SILHOUETTESPLITFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SketchPointHolePositionDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/SketchPointHolePositionDefinition.h new file mode 100644 index 0000000..39d4c5e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SketchPointHolePositionDefinition.h @@ -0,0 +1,62 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "HolePositionDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHPOINTHOLEPOSITIONDEFINITION_CPP__ +# define ADSK_FUSION_SKETCHPOINTHOLEPOSITIONDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHPOINTHOLEPOSITIONDEFINITION_API +# endif +#else +# define ADSK_FUSION_SKETCHPOINTHOLEPOSITIONDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchPoint; +}} + +namespace adsk { namespace fusion { + +/// Provides positioning information for a hole that is positioned by a sketch point. +class SketchPointHolePositionDefinition : public HolePositionDefinition { +public: + + /// Returns the sketch point that defines the center of the hole. + core::Ptr sketchPoint() const; + + ADSK_FUSION_SKETCHPOINTHOLEPOSITIONDEFINITION_API static const char* classType(); + ADSK_FUSION_SKETCHPOINTHOLEPOSITIONDEFINITION_API const char* objectType() const override; + ADSK_FUSION_SKETCHPOINTHOLEPOSITIONDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHPOINTHOLEPOSITIONDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchPoint* sketchPoint_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchPointHolePositionDefinition::sketchPoint() const +{ + core::Ptr res = sketchPoint_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHPOINTHOLEPOSITIONDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SketchPointsHolePositionDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/SketchPointsHolePositionDefinition.h new file mode 100644 index 0000000..0a2af96 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SketchPointsHolePositionDefinition.h @@ -0,0 +1,62 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "HolePositionDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHPOINTSHOLEPOSITIONDEFINITION_CPP__ +# define ADSK_FUSION_SKETCHPOINTSHOLEPOSITIONDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHPOINTSHOLEPOSITIONDEFINITION_API +# endif +#else +# define ADSK_FUSION_SKETCHPOINTSHOLEPOSITIONDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Provides positioning information for a hole that is positioned by a sketch point. +class SketchPointsHolePositionDefinition : public HolePositionDefinition { +public: + + /// Returns the sketch point that defines the center of the hole. + core::Ptr sketchPoints() const; + + ADSK_FUSION_SKETCHPOINTSHOLEPOSITIONDEFINITION_API static const char* classType(); + ADSK_FUSION_SKETCHPOINTSHOLEPOSITIONDEFINITION_API const char* objectType() const override; + ADSK_FUSION_SKETCHPOINTSHOLEPOSITIONDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHPOINTSHOLEPOSITIONDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* sketchPoints_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchPointsHolePositionDefinition::sketchPoints() const +{ + core::Ptr res = sketchPoints_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHPOINTSHOLEPOSITIONDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SphereFeature.h b/usr/autodesk/CPP/include/Fusion/Features/SphereFeature.h new file mode 100644 index 0000000..9966d6e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SphereFeature.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SPHEREFEATURE_CPP__ +# define ADSK_FUSION_SPHEREFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_SPHEREFEATURE_API +# endif +#else +# define ADSK_FUSION_SPHEREFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Object that represents an existing sphere feature in a design. +class SphereFeature : public Feature { +public: + + ADSK_FUSION_SPHEREFEATURE_API static const char* classType(); + ADSK_FUSION_SPHEREFEATURE_API const char* objectType() const override; + ADSK_FUSION_SPHEREFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SPHEREFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SPHEREFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SphereFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/SphereFeatures.h new file mode 100644 index 0000000..e1dd5fa --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SphereFeatures.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SPHEREFEATURES_CPP__ +# define ADSK_FUSION_SPHEREFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_SPHEREFEATURES_API +# endif +#else +# define ADSK_FUSION_SPHEREFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SphereFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing torus features in a design. +class SphereFeatures : public core::Base { +public: + + /// Function that returns the specified sphere feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified sphere feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of sphere features in the collection. + size_t count() const; + + typedef SphereFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SPHEREFEATURES_API static const char* classType(); + ADSK_FUSION_SPHEREFEATURES_API const char* objectType() const override; + ADSK_FUSION_SPHEREFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SPHEREFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SphereFeature* item_raw(size_t index) const = 0; + virtual SphereFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SphereFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr SphereFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t SphereFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void SphereFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SPHEREFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SplitBodyFeature.h b/usr/autodesk/CPP/include/Fusion/Features/SplitBodyFeature.h new file mode 100644 index 0000000..a0a14af --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SplitBodyFeature.h @@ -0,0 +1,142 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SPLITBODYFEATURE_CPP__ +# define ADSK_FUSION_SPLITBODYFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_SPLITBODYFEATURE_API +# endif +#else +# define ADSK_FUSION_SPLITBODYFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing split body feature in a design. +class SplitBodyFeature : public Feature { +public: + + /// Gets and sets the input solid or open bodies that are split. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr splitBodies() const; + bool splitBodies(const core::Ptr& value); + + /// Sets the splitting tool used for the feature. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// splittingTool : Input entity that defines the splitting tool. The splitting tool is a single entity that can be either a solid body, + /// open body, construction plane, face, or sketch curve that partially or fully intersects the body to split. + /// isSplittingToolExtended : A boolean value for setting whether or not the splittingTool is to be automatically extended (if possible) so as to + /// completely intersect the facesToSplit. + /// Returns true if successful. + bool setSplittingTool(const core::Ptr& splittingTool, bool isSplittingToolExtended); + + /// Gets the entity that defines the splitting tool. The splitting tool is a single entity that can be either a + /// solid body, open body, plane, sketch curve or face that partially or fully intersects the bodyToSplit. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr splittingTool() const; + + /// Gets whether or not the splitting tool is to be automatically extended (if possible) so as to + /// completely intersect the bodyToSplit. + bool isSplittingToolExtended() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SPLITBODYFEATURE_API static const char* classType(); + ADSK_FUSION_SPLITBODYFEATURE_API const char* objectType() const override; + ADSK_FUSION_SPLITBODYFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SPLITBODYFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* splitBodies_raw() const = 0; + virtual bool splitBodies_raw(core::ObjectCollection* value) = 0; + virtual bool setSplittingTool_raw(core::Base* splittingTool, bool isSplittingToolExtended) = 0; + virtual core::Base* splittingTool_raw() const = 0; + virtual bool isSplittingToolExtended_raw() const = 0; + virtual SplitBodyFeature* nativeObject_raw() const = 0; + virtual SplitBodyFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SplitBodyFeature::splitBodies() const +{ + core::Ptr res = splitBodies_raw(); + return res; +} + +inline bool SplitBodyFeature::splitBodies(const core::Ptr& value) +{ + return splitBodies_raw(value.get()); +} + +inline bool SplitBodyFeature::setSplittingTool(const core::Ptr& splittingTool, bool isSplittingToolExtended) +{ + bool res = setSplittingTool_raw(splittingTool.get(), isSplittingToolExtended); + return res; +} + +inline core::Ptr SplitBodyFeature::splittingTool() const +{ + core::Ptr res = splittingTool_raw(); + return res; +} + +inline bool SplitBodyFeature::isSplittingToolExtended() const +{ + bool res = isSplittingToolExtended_raw(); + return res; +} + +inline core::Ptr SplitBodyFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SplitBodyFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SPLITBODYFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SplitBodyFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/SplitBodyFeatureInput.h new file mode 100644 index 0000000..d710b34 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SplitBodyFeatureInput.h @@ -0,0 +1,130 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SPLITBODYFEATUREINPUT_CPP__ +# define ADSK_FUSION_SPLITBODYFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_SPLITBODYFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_SPLITBODYFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a split body feature. +class SplitBodyFeatureInput : public core::Base { +public: + + /// Gets and sets the input solid or open bodies to be split. This can be a + /// single BRepBody or an ObjectCollection if multiple bodies are to be split. + core::Ptr splitBodies() const; + bool splitBodies(const core::Ptr& value); + + /// Gets and sets the entity that defines the splitting tool. The splitting tool is a single + /// entity that can be either a solid or open BRepBody, construction plane, profile, or a face. + core::Ptr splittingTool() const; + bool splittingTool(const core::Ptr& value); + + /// Gets and sets whether or not the splitting tool is to be automatically extended (if possible) so as to + /// completely intersect the bodyToSplit. + bool isSplittingToolExtended() const; + bool isSplittingToolExtended(bool value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_SPLITBODYFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_SPLITBODYFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_SPLITBODYFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SPLITBODYFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* splitBodies_raw() const = 0; + virtual bool splitBodies_raw(core::Base* value) = 0; + virtual core::Base* splittingTool_raw() const = 0; + virtual bool splittingTool_raw(core::Base* value) = 0; + virtual bool isSplittingToolExtended_raw() const = 0; + virtual bool isSplittingToolExtended_raw(bool value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr SplitBodyFeatureInput::splitBodies() const +{ + core::Ptr res = splitBodies_raw(); + return res; +} + +inline bool SplitBodyFeatureInput::splitBodies(const core::Ptr& value) +{ + return splitBodies_raw(value.get()); +} + +inline core::Ptr SplitBodyFeatureInput::splittingTool() const +{ + core::Ptr res = splittingTool_raw(); + return res; +} + +inline bool SplitBodyFeatureInput::splittingTool(const core::Ptr& value) +{ + return splittingTool_raw(value.get()); +} + +inline bool SplitBodyFeatureInput::isSplittingToolExtended() const +{ + bool res = isSplittingToolExtended_raw(); + return res; +} + +inline bool SplitBodyFeatureInput::isSplittingToolExtended(bool value) +{ + return isSplittingToolExtended_raw(value); +} + +inline core::Ptr SplitBodyFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool SplitBodyFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SPLITBODYFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SplitBodyFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/SplitBodyFeatures.h new file mode 100644 index 0000000..3ab31fe --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SplitBodyFeatures.h @@ -0,0 +1,135 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SPLITBODYFEATURES_CPP__ +# define ADSK_FUSION_SPLITBODYFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_SPLITBODYFEATURES_API +# endif +#else +# define ADSK_FUSION_SPLITBODYFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SplitBodyFeature; + class SplitBodyFeatureInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing split body features in a component +/// and supports the ability to create new split body features. +class SplitBodyFeatures : public core::Base { +public: + + /// Function that returns the specified split body feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of split body features in the collection. + size_t count() const; + + /// Creates a SplitBodyFeatureInput object. Use properties and methods on this object + /// to define the split body you want to create and then use the Add method, passing in + /// the SplitBodyFeatureInput object. + /// splitBodies : Input solid body or open bodies to be split. This can be a single BRepBody or an ObjectCollection if multiple + /// bodies are to be split. + /// splittingTool : Input entity that defines the splitting tool. The splitting tool is a single entity that can be either a solid or open BRepBody, + /// construction plane, profile, or a face. + /// isSplittingToolExtended : A boolean value for setting whether or not the splitting tool is to be automatically extended (if possible) so as to + /// completely intersect the bodyToSplit. + /// Returns the newly created SplitBodyFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& splitBodies, const core::Ptr& splittingTool, bool isSplittingToolExtended) const; + + /// Creates a new split body feature. + /// input : A SplitBodyFeatureInput object that defines the desired split body feature. Use the createInput + /// method to create a new SplitBodyFeatureInput object and then use methods on it + /// (the SplitBodyFeatureInput object) to define the split body. + /// Returns the newly created SplitBodyFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified split body feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef SplitBodyFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SPLITBODYFEATURES_API static const char* classType(); + ADSK_FUSION_SPLITBODYFEATURES_API const char* objectType() const override; + ADSK_FUSION_SPLITBODYFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SPLITBODYFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SplitBodyFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual SplitBodyFeatureInput* createInput_raw(core::Base* splitBodies, core::Base* splittingTool, bool isSplittingToolExtended) const = 0; + virtual SplitBodyFeature* add_raw(SplitBodyFeatureInput* input) = 0; + virtual SplitBodyFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SplitBodyFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SplitBodyFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr SplitBodyFeatures::createInput(const core::Ptr& splitBodies, const core::Ptr& splittingTool, bool isSplittingToolExtended) const +{ + core::Ptr res = createInput_raw(splitBodies.get(), splittingTool.get(), isSplittingToolExtended); + return res; +} + +inline core::Ptr SplitBodyFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr SplitBodyFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void SplitBodyFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SPLITBODYFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SplitFaceFeature.h b/usr/autodesk/CPP/include/Fusion/Features/SplitFaceFeature.h new file mode 100644 index 0000000..fc85bb1 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SplitFaceFeature.h @@ -0,0 +1,225 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SPLITFACEFEATURE_CPP__ +# define ADSK_FUSION_SPLITFACEFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_SPLITFACEFEATURE_API +# endif +#else +# define ADSK_FUSION_SPLITFACEFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing split face feature in a design. +class SplitFaceFeature : public Feature { +public: + + /// Gets and sets the faces to be split. + /// The collection can contain one or more faces selected from solid and/or open bodies. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr facesToSplit() const; + bool facesToSplit(const core::Ptr& value); + + /// Sets the splitting tool used for the feature. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// splittingTool : Input entity that defines the splitting tool. The splitting tool is a single entity that can be either a solid body, + /// open body, construction plane, face, or sketch curve that partially or fully intersects the facesToSplit. + /// The input for this argument can be one of the valid types or an ObjectCollection in the case where multiple splitting + /// tools are being defined. + /// isSplittingToolExtended : A boolean value for setting whether or not the splittingTool is to be automatically extended (if possible) so as to + /// completely intersect the facesToSplit. + /// Returns true if successful. + bool setSplittingTool(const core::Ptr& splittingTool, bool isSplittingToolExtended); + + /// Gets the entity(s) that define the splitting tool(s). The splitting tool can consist of one or more of + /// the following: BRepBody, ConstructionPlane, BRepFace, sketch curve that extends or can + /// be extended beyond the extents of the face. To set the splitting tool, use one of the set methods to + /// also define the split type. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr splittingTool() const; + + /// Gets whether or not the setting to automatically extend the splittingTool was set when the feature was created. + /// This property is valid only when the splitType property returns surfaceIntersectionSplitType. + bool isSplittingToolExtended() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Set the split type to be a surface to surface intersection. If the split tool is a curve + /// it will be extruded into a surface to use in the split. If it's a surface, the surface will + /// be used and optionally extended to fully intersect the faces to be split. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// splittingTool : Input entity(s) that defines the splitting tool. The splitting tool can be a single entity or an ObjectCollection + /// containing solid and/or open bodies, construction planes, faces, or sketch curves that partially or fully intersect + /// the faces that are being split. + /// isSplittingToolExtended : Specifies if the splitting tool should be extended so that is fully intersects the faces to be split. + /// Returns true is setting the split type was successful. + bool setAsSurfaceIntersectionSplitType(const core::Ptr& splittingTool, bool isSplittingToolExtended); + + /// Sets the split type to project the splitting tool along the direction defined by the + /// specified entity. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// splittingTool : Input entity(s) that defines the splitting tool. The splitting tool can be a single entity or an ObjectCollection + /// containing faces or sketch curves. If faces are input, the edges of the face are used as the splitting tool. + /// directionEntity : An entity that defines the direction of projection of the splitting tool. This can be + /// a linear BRepEdge, SketchLine, ConstructionLine, or a planar face where the face + /// normal is used. + /// Returns true is setting the split type was successful. + bool setAsAlongVectorSplitType(const core::Ptr& splittingTool, const core::Ptr& directionEntity); + + /// Sets the split type to be a curve that defined by projecting the splitting curve to the + /// closest point on the surface. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// splittingTool : Input entity(s) that defines the splitting tool. The splitting tool can be a single entity or an ObjectCollection + /// containing faces or sketch curves. If faces are input, the edges of the face are used as the splitting tool. + /// Returns true if setting the closest point split type was successful. + bool setAsClosestPointSplitType(const core::Ptr& splittingTool); + + /// Gets the direction entity when the split type is along a vector. If the split type + /// is not alongVectorSplitType this property will return null. + /// To set the direction entity use the setAsAlongVectorSplitType method. + core::Ptr directionEntity() const; + + /// Returns the type of split type currently defined. To change the split type, use + /// one of the set methods. + SplitFaceSplitTypes splitType() const; + + ADSK_FUSION_SPLITFACEFEATURE_API static const char* classType(); + ADSK_FUSION_SPLITFACEFEATURE_API const char* objectType() const override; + ADSK_FUSION_SPLITFACEFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SPLITFACEFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* facesToSplit_raw() const = 0; + virtual bool facesToSplit_raw(core::ObjectCollection* value) = 0; + virtual bool setSplittingTool_raw(core::Base* splittingTool, bool isSplittingToolExtended) = 0; + virtual core::ObjectCollection* splittingTool_raw() const = 0; + virtual bool isSplittingToolExtended_raw() const = 0; + virtual SplitFaceFeature* nativeObject_raw() const = 0; + virtual SplitFaceFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual bool setAsSurfaceIntersectionSplitType_raw(core::Base* splittingTool, bool isSplittingToolExtended) = 0; + virtual bool setAsAlongVectorSplitType_raw(core::Base* splittingTool, core::Base* directionEntity) = 0; + virtual bool setAsClosestPointSplitType_raw(core::Base* splittingTool) = 0; + virtual core::Base* directionEntity_raw() const = 0; + virtual SplitFaceSplitTypes splitType_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SplitFaceFeature::facesToSplit() const +{ + core::Ptr res = facesToSplit_raw(); + return res; +} + +inline bool SplitFaceFeature::facesToSplit(const core::Ptr& value) +{ + return facesToSplit_raw(value.get()); +} + +inline bool SplitFaceFeature::setSplittingTool(const core::Ptr& splittingTool, bool isSplittingToolExtended) +{ + bool res = setSplittingTool_raw(splittingTool.get(), isSplittingToolExtended); + return res; +} + +inline core::Ptr SplitFaceFeature::splittingTool() const +{ + core::Ptr res = splittingTool_raw(); + return res; +} + +inline bool SplitFaceFeature::isSplittingToolExtended() const +{ + bool res = isSplittingToolExtended_raw(); + return res; +} + +inline core::Ptr SplitFaceFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SplitFaceFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline bool SplitFaceFeature::setAsSurfaceIntersectionSplitType(const core::Ptr& splittingTool, bool isSplittingToolExtended) +{ + bool res = setAsSurfaceIntersectionSplitType_raw(splittingTool.get(), isSplittingToolExtended); + return res; +} + +inline bool SplitFaceFeature::setAsAlongVectorSplitType(const core::Ptr& splittingTool, const core::Ptr& directionEntity) +{ + bool res = setAsAlongVectorSplitType_raw(splittingTool.get(), directionEntity.get()); + return res; +} + +inline bool SplitFaceFeature::setAsClosestPointSplitType(const core::Ptr& splittingTool) +{ + bool res = setAsClosestPointSplitType_raw(splittingTool.get()); + return res; +} + +inline core::Ptr SplitFaceFeature::directionEntity() const +{ + core::Ptr res = directionEntity_raw(); + return res; +} + +inline SplitFaceSplitTypes SplitFaceFeature::splitType() const +{ + SplitFaceSplitTypes res = splitType_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SPLITFACEFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SplitFaceFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/SplitFaceFeatureInput.h new file mode 100644 index 0000000..38eec01 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SplitFaceFeatureInput.h @@ -0,0 +1,185 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SPLITFACEFEATUREINPUT_CPP__ +# define ADSK_FUSION_SPLITFACEFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_SPLITFACEFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_SPLITFACEFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a split face feature. +class SplitFaceFeatureInput : public core::Base { +public: + + /// Gets and sets the faces to be split. + /// The collection can contain one or more faces selected from solid and/or open bodies. + core::Ptr facesToSplit() const; + bool facesToSplit(const core::Ptr& value); + + /// Gets and sets the entity(s) that define the splitting tool(s). The splitting tool can be a single entity or an + /// ObjectCollection containing solid and/or open bodies, construction planes, faces, or sketch curves that partially + /// or fully intersect the faces that are being split. + core::Ptr splittingTool() const; + bool splittingTool(const core::Ptr& value); + + /// Gets and sets whether or not the splittingTool is to be automatically extended (if possible) so as to + /// completely intersect the facesToSplit. + bool isSplittingToolExtended() const; + bool isSplittingToolExtended(bool value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + /// Sets the split type to project the splitting tool along the direction defined by the + /// specified entity. + /// directionEntity : An entity that defines the direction of projection of the splitting tool. This can be + /// a linear BRepEdge, SketchLine, ConstructionLine, or a planar face where the face + /// normal is used. + /// Returns true is setting the split type was successful. + bool setAlongVectorSplitType(const core::Ptr& directionEntity); + + /// Sets the split type to be a curve that defined by projecting the splitting curve to the + /// closest point on the surface. + /// Returns true is setting the split type was successful. + bool setClosestPointSplitType(); + + /// Set the split type to be a surface to surface intersection. If the split tool is a curve + /// it will be extruded into a surface to use in the split. If it's a surface, the surface will + /// be used and optionally extended to fully intersect the faces to be split. + /// isSplittingToolExtended : Specifies if the splitting tool should be extended so that is fully intersects the faces to be split. + /// Returns true is setting the split type was successful. + bool setSurfaceIntersectionSplitType(bool isSplittingToolExtended); + + /// Returns the type of split type currently defined. + SplitFaceSplitTypes splitType() const; + + ADSK_FUSION_SPLITFACEFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_SPLITFACEFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_SPLITFACEFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SPLITFACEFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* facesToSplit_raw() const = 0; + virtual bool facesToSplit_raw(core::ObjectCollection* value) = 0; + virtual core::Base* splittingTool_raw() const = 0; + virtual bool splittingTool_raw(core::Base* value) = 0; + virtual bool isSplittingToolExtended_raw() const = 0; + virtual bool isSplittingToolExtended_raw(bool value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; + virtual bool setAlongVectorSplitType_raw(core::Base* directionEntity) = 0; + virtual bool setClosestPointSplitType_raw() = 0; + virtual bool setSurfaceIntersectionSplitType_raw(bool isSplittingToolExtended) = 0; + virtual SplitFaceSplitTypes splitType_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SplitFaceFeatureInput::facesToSplit() const +{ + core::Ptr res = facesToSplit_raw(); + return res; +} + +inline bool SplitFaceFeatureInput::facesToSplit(const core::Ptr& value) +{ + return facesToSplit_raw(value.get()); +} + +inline core::Ptr SplitFaceFeatureInput::splittingTool() const +{ + core::Ptr res = splittingTool_raw(); + return res; +} + +inline bool SplitFaceFeatureInput::splittingTool(const core::Ptr& value) +{ + return splittingTool_raw(value.get()); +} + +inline bool SplitFaceFeatureInput::isSplittingToolExtended() const +{ + bool res = isSplittingToolExtended_raw(); + return res; +} + +inline bool SplitFaceFeatureInput::isSplittingToolExtended(bool value) +{ + return isSplittingToolExtended_raw(value); +} + +inline core::Ptr SplitFaceFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool SplitFaceFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} + +inline bool SplitFaceFeatureInput::setAlongVectorSplitType(const core::Ptr& directionEntity) +{ + bool res = setAlongVectorSplitType_raw(directionEntity.get()); + return res; +} + +inline bool SplitFaceFeatureInput::setClosestPointSplitType() +{ + bool res = setClosestPointSplitType_raw(); + return res; +} + +inline bool SplitFaceFeatureInput::setSurfaceIntersectionSplitType(bool isSplittingToolExtended) +{ + bool res = setSurfaceIntersectionSplitType_raw(isSplittingToolExtended); + return res; +} + +inline SplitFaceSplitTypes SplitFaceFeatureInput::splitType() const +{ + SplitFaceSplitTypes res = splitType_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SPLITFACEFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SplitFaceFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/SplitFaceFeatures.h new file mode 100644 index 0000000..7418aab --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SplitFaceFeatures.h @@ -0,0 +1,143 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SPLITFACEFEATURES_CPP__ +# define ADSK_FUSION_SPLITFACEFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_SPLITFACEFEATURES_API +# endif +#else +# define ADSK_FUSION_SPLITFACEFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SplitFaceFeature; + class SplitFaceFeatureInput; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing split face features in a component +/// and supports the ability to create new split face features. +class SplitFaceFeatures : public core::Base { +public: + + /// Function that returns the specified split face feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of split face features in the collection. + size_t count() const; + + /// Creates a SplitFaceFeatureInput object. Use properties and methods on this object + /// to define the split face you want to create and then use the Add method, passing in + /// the SplitFaceFeatureInput object. + /// A newly created SplitFaceFeatureInput object defaults to creating a split face feature + /// using the "Split with Surface" option. You can use functions on the SplitFaceFeatureInput + /// object to define a different type of split type. + /// facesToSplit : Input the faces to be split. The collection can contain one or more faces from solid and/or open bodies. + /// splittingTool : Input entity(s) that defines the splitting tool. The splitting tool can be a single entity or an ObjectCollection + /// containing solid and/or open bodies, construction planes, faces, or sketch curves that partially or fully intersect + /// the faces that are being split. + /// isSplittingToolExtended : A boolean value for setting whether or not the splittingTool is to be automatically extended (if possible) so as to + /// completely intersect the faces that are to be split. This is only used when the split type is "split with surface" + /// which is the default type when a new createInput is created. Use functions on the returned SplitFaceFeatureInput + /// to define a different type of split type. + /// Returns the newly created SplitFaceFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& facesToSplit, const core::Ptr& splittingTool, bool isSplittingToolExtended) const; + + /// Creates a new split face feature. + /// input : A SplitFaceFeatureInput object that defines the desired split face feature. Use the createInput + /// method to create a new SplitFaceFeatureInput object and then use methods on it + /// (the SplitFaceFeatureInput object) to define the split face. + /// Returns the newly created SplitFaceFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified split face feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef SplitFaceFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SPLITFACEFEATURES_API static const char* classType(); + ADSK_FUSION_SPLITFACEFEATURES_API const char* objectType() const override; + ADSK_FUSION_SPLITFACEFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SPLITFACEFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SplitFaceFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual SplitFaceFeatureInput* createInput_raw(core::ObjectCollection* facesToSplit, core::Base* splittingTool, bool isSplittingToolExtended) const = 0; + virtual SplitFaceFeature* add_raw(SplitFaceFeatureInput* input) = 0; + virtual SplitFaceFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SplitFaceFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SplitFaceFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr SplitFaceFeatures::createInput(const core::Ptr& facesToSplit, const core::Ptr& splittingTool, bool isSplittingToolExtended) const +{ + core::Ptr res = createInput_raw(facesToSplit.get(), splittingTool.get(), isSplittingToolExtended); + return res; +} + +inline core::Ptr SplitFaceFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr SplitFaceFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void SplitFaceFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SPLITFACEFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/StitchFeature.h b/usr/autodesk/CPP/include/Fusion/Features/StitchFeature.h new file mode 100644 index 0000000..bdb64bd --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/StitchFeature.h @@ -0,0 +1,137 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_STITCHFEATURE_CPP__ +# define ADSK_FUSION_STITCHFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_STITCHFEATURE_API +# endif +#else +# define ADSK_FUSION_STITCHFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; + class Occurrence; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing stitch feature in a design. +class StitchFeature : public Feature { +public: + + /// Gets and sets the surfaces to stitch together. In some cases the stitch operation results in + /// faces being merged so the original faces are no longer available after the feature is created. + /// in this case you need to reposition the timeline marker to just before this feature + /// when the faces do exist. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr stitchSurfaces() const; + bool stitchSurfaces(const core::Ptr& value); + + /// Returns the parameter controlling the tolerance. You can edit the tolerance + /// by editing the value of the parameter object. + core::Ptr tolerance() const; + + /// Gets and sets the feature operation to perform. This property value is ignored if the stitched result does not + /// form a solid body. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_STITCHFEATURE_API static const char* classType(); + ADSK_FUSION_STITCHFEATURE_API const char* objectType() const override; + ADSK_FUSION_STITCHFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_STITCHFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* stitchSurfaces_raw() const = 0; + virtual bool stitchSurfaces_raw(core::ObjectCollection* value) = 0; + virtual ModelParameter* tolerance_raw() const = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual StitchFeature* nativeObject_raw() const = 0; + virtual StitchFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr StitchFeature::stitchSurfaces() const +{ + core::Ptr res = stitchSurfaces_raw(); + return res; +} + +inline bool StitchFeature::stitchSurfaces(const core::Ptr& value) +{ + return stitchSurfaces_raw(value.get()); +} + +inline core::Ptr StitchFeature::tolerance() const +{ + core::Ptr res = tolerance_raw(); + return res; +} + +inline FeatureOperations StitchFeature::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool StitchFeature::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline core::Ptr StitchFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr StitchFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_STITCHFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/StitchFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/StitchFeatureInput.h new file mode 100644 index 0000000..c156289 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/StitchFeatureInput.h @@ -0,0 +1,132 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_STITCHFEATUREINPUT_CPP__ +# define ADSK_FUSION_STITCHFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_STITCHFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_STITCHFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a stitch feature. +class StitchFeatureInput : public core::Base { +public: + + /// Gets and sets the surfaces to stitch together. + core::Ptr stitchSurfaces() const; + bool stitchSurfaces(const core::Ptr& value); + + /// Gets and sets the ValueInput object that defines the stitching tolerance. It must define a length. + core::Ptr tolerance() const; + bool tolerance(const core::Ptr& value); + + /// Gets and sets the feature operation to perform. This property value is only valid if the isSolid property returns + /// true. Otherwise the value of this property is ignored. + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_STITCHFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_STITCHFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_STITCHFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_STITCHFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* stitchSurfaces_raw() const = 0; + virtual bool stitchSurfaces_raw(core::ObjectCollection* value) = 0; + virtual core::ValueInput* tolerance_raw() const = 0; + virtual bool tolerance_raw(core::ValueInput* value) = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr StitchFeatureInput::stitchSurfaces() const +{ + core::Ptr res = stitchSurfaces_raw(); + return res; +} + +inline bool StitchFeatureInput::stitchSurfaces(const core::Ptr& value) +{ + return stitchSurfaces_raw(value.get()); +} + +inline core::Ptr StitchFeatureInput::tolerance() const +{ + core::Ptr res = tolerance_raw(); + return res; +} + +inline bool StitchFeatureInput::tolerance(const core::Ptr& value) +{ + return tolerance_raw(value.get()); +} + +inline FeatureOperations StitchFeatureInput::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool StitchFeatureInput::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline core::Ptr StitchFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool StitchFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_STITCHFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/StitchFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/StitchFeatures.h new file mode 100644 index 0000000..c714610 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/StitchFeatures.h @@ -0,0 +1,140 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_STITCHFEATURES_CPP__ +# define ADSK_FUSION_STITCHFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_STITCHFEATURES_API +# endif +#else +# define ADSK_FUSION_STITCHFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class StitchFeature; + class StitchFeatureInput; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing Stitch features in a component +/// and supports the ability to create new Stitch features. +class StitchFeatures : public core::Base { +public: + + /// Function that returns the specified stitch feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of Stitch features in the collection. + size_t count() const; + + /// Creates a StitchFeatureInput object. Use properties and methods on this object + /// to define the stitch feature you want to create and then use the Add method, passing in + /// the StitchFeatureInput object. + /// stitchSurfaces : The surfaces (open BRepBodies) to stitch together. + /// Stitching surfaces can form multiple closed volumes resulting in multiple solids. + /// Stitch Surfaces can form multiple BRepShells (entirely connected set of entities) that would result in a + /// single non-solid BRepBody. + /// tolerance : ValueInput object that defines the stitching tolerance. It must define a distance value. + /// operation : Specifies the operation type for the result when the final result is a closed solid. Otherwise + /// this argument is ignored. + /// Returns the newly created StitchFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& stitchSurfaces, const core::Ptr& tolerance, FeatureOperations operation = adsk::fusion::NewBodyFeatureOperation) const; + + /// Creates a new stitch feature. + /// input : A StitchFeatureInput object that defines the desired stitch feature. Use the createInput + /// method to create a new StitchFeatureInput object and then use methods on it + /// (the StitchFeatureInput object) to define the stitch feature. + /// Returns the newly created StitchFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified stitch feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef StitchFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_STITCHFEATURES_API static const char* classType(); + ADSK_FUSION_STITCHFEATURES_API const char* objectType() const override; + ADSK_FUSION_STITCHFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_STITCHFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual StitchFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual StitchFeatureInput* createInput_raw(core::ObjectCollection* stitchSurfaces, core::ValueInput* tolerance, FeatureOperations operation) const = 0; + virtual StitchFeature* add_raw(StitchFeatureInput* input) = 0; + virtual StitchFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr StitchFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t StitchFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr StitchFeatures::createInput(const core::Ptr& stitchSurfaces, const core::Ptr& tolerance, FeatureOperations operation) const +{ + core::Ptr res = createInput_raw(stitchSurfaces.get(), tolerance.get(), operation); + return res; +} + +inline core::Ptr StitchFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr StitchFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void StitchFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_STITCHFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SurfaceDeleteFaceFeature.h b/usr/autodesk/CPP/include/Fusion/Features/SurfaceDeleteFaceFeature.h new file mode 100644 index 0000000..8ba80b7 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SurfaceDeleteFaceFeature.h @@ -0,0 +1,120 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SURFACEDELETEFACEFEATURE_CPP__ +# define ADSK_FUSION_SURFACEDELETEFACEFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_SURFACEDELETEFACEFEATURE_API +# endif +#else +# define ADSK_FUSION_SURFACEDELETEFACEFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepFace; + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing Surface Delete Face feature in a design. +/// The SurfaceDeleteFaceFeature and DeleteFaceFeature differ in that the SurfaceDeleteFaceFeature +/// can delete any face without any restrictions. If the body is a solid, it will become a surface +/// when the first face is deleted. The specified face is deleted without any other changes being +/// made to the body. The DeleteFaceFeature deletes the specified face and also modifies the other faces +/// in the body to heal or fill in the area of the deleted face. This means that a solid body will +/// remain solid. +class SurfaceDeleteFaceFeature : public Feature { +public: + + /// Gets and sets the set of faces that are deleted by this feature. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + std::vector> deletedFaces() const; + bool deletedFaces(const std::vector>& value); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SURFACEDELETEFACEFEATURE_API static const char* classType(); + ADSK_FUSION_SURFACEDELETEFACEFEATURE_API const char* objectType() const override; + ADSK_FUSION_SURFACEDELETEFACEFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SURFACEDELETEFACEFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepFace** deletedFaces_raw(size_t& return_size) const = 0; + virtual bool deletedFaces_raw(BRepFace** value, size_t value_size) = 0; + virtual SurfaceDeleteFaceFeature* nativeObject_raw() const = 0; + virtual SurfaceDeleteFaceFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline std::vector> SurfaceDeleteFaceFeature::deletedFaces() const +{ + std::vector> res; + size_t s; + + BRepFace** p= deletedFaces_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool SurfaceDeleteFaceFeature::deletedFaces(const std::vector>& value) +{ + BRepFace** value_ = new BRepFace*[value.size()]; + for(size_t i=0; i SurfaceDeleteFaceFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SurfaceDeleteFaceFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SURFACEDELETEFACEFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SurfaceDeleteFaceFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/SurfaceDeleteFaceFeatures.h new file mode 100644 index 0000000..619f18e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SurfaceDeleteFaceFeatures.h @@ -0,0 +1,121 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SURFACEDELETEFACEFEATURES_CPP__ +# define ADSK_FUSION_SURFACEDELETEFACEFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_SURFACEDELETEFACEFEATURES_API +# endif +#else +# define ADSK_FUSION_SURFACEDELETEFACEFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SurfaceDeleteFaceFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing SurfaceDeleteFaceFeature features in a component +/// and supports the ability to create new SurfaceDeleteFaceFeature features. +/// The SurfaceDeleteFaceFeature and DeleteFaceFeature differ in that the SurfaceDeleteFaceFeature +/// can delete any face without any restrictions. If the body is a solid, it will become a surface +/// when the first face is deleted. The specified face is deleted without any other changes being +/// made to the body. The DeleteFaceFeature deletes the specified face and also modifies the other faces +/// in the body to heal or fill in the area of the deleted face. This means that a solid body will +/// remain solid. +class SurfaceDeleteFaceFeatures : public core::Base { +public: + + /// Function that returns the specified SurfaceDeleteFaceFeature object using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified SurfaceDeleteFaceFeature object using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of SurfaceDeleteFaceFeature objects in the collection. + size_t count() const; + + /// Creates a new SurfaceDeleteFaceFeature feature. This deletes the specified faces + /// from their bodies without any attempt to heal the openings. This is equivalent + /// to selecting and deleting faces when in the Patch workspace. + /// facesToDelete : A single BRepFace or an ObjectCollection containing multiple BRepFace objects. + /// Returns the newly created SurfaceDeleteFaceFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& facesToDelete); + + typedef SurfaceDeleteFaceFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SURFACEDELETEFACEFEATURES_API static const char* classType(); + ADSK_FUSION_SURFACEDELETEFACEFEATURES_API const char* objectType() const override; + ADSK_FUSION_SURFACEDELETEFACEFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SURFACEDELETEFACEFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SurfaceDeleteFaceFeature* item_raw(size_t index) const = 0; + virtual SurfaceDeleteFaceFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual SurfaceDeleteFaceFeature* add_raw(core::Base* facesToDelete) = 0; +}; + +// Inline wrappers + +inline core::Ptr SurfaceDeleteFaceFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr SurfaceDeleteFaceFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t SurfaceDeleteFaceFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr SurfaceDeleteFaceFeatures::add(const core::Ptr& facesToDelete) +{ + core::Ptr res = add_raw(facesToDelete.get()); + return res; +} + +template inline void SurfaceDeleteFaceFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SURFACEDELETEFACEFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SweepFeature.h b/usr/autodesk/CPP/include/Fusion/Features/SweepFeature.h new file mode 100644 index 0000000..ab5a093 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SweepFeature.h @@ -0,0 +1,366 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SWEEPFEATURE_CPP__ +# define ADSK_FUSION_SWEEPFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_SWEEPFEATURE_API +# endif +#else +# define ADSK_FUSION_SWEEPFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class BRepFaces; + class ModelParameter; + class Occurrence; + class Path; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing sweep feature in a design. +class SweepFeature : public Feature { +public: + + /// Gets and sets the profiles or planar faces used to define the shape of the sweep. + /// This property can return or be set with a single Profile, a single planar face, or + /// an ObjectCollection consisting of multiple profiles and planar faces. When an + /// ObjectCollection is used all of the profiles and faces must be co-planar. + /// This property returns nothing in the case where the feature is non-parametric. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr profile() const; + bool profile(const core::Ptr& value); + + /// Gets and sets the type of operation performed by the sweep. + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// Gets and sets the path to create the sweep. + /// This property returns nothing in the case where the feature is non-parametric. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr path() const; + bool path(const core::Ptr& value); + + /// Gets the distance for the first side. + /// This property returns nothing in the case where the feature is non-parametric. + core::Ptr distanceOne() const; + + /// Gets the distance for the second side. + /// Returns nothing if the path is only on one side of the profile or if the sweep definition includes a guide rail. + /// It's always the distance against the normal of the profile if available. + /// This property returns nothing in the case where the feature is non-parametric. + core::Ptr distanceTwo() const; + + /// Gets and sets the sweep orientation. It defaults to PerpendicularOrientationType. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + SweepOrientationTypes orientation() const; + bool orientation(SweepOrientationTypes value); + + /// Property that returns the set of that cap one end of the sweep that are coincident with the sketch plane. + /// In the cases where there aren't any start faces this property will return Nothing. + core::Ptr startFaces() const; + + /// Property that returns the set of that cap one end of the sweep that are coincident with the sketch plane. + /// The end faces are those not coincident to the sketch plane of the feature's profile. + /// In the case of a symmetric revolution these faces are the ones on the negative normal side of the sketch plane. + /// In the cases where there aren't any end faces this property will return Nothing. + core::Ptr endFaces() const; + + /// Property that returns a object that provides access to all of the faces created around the perimeter of the feature. + core::Ptr sideFaces() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Indicates if this feature was initially created as a solid or a surface. + bool isSolid() const; + + /// Gets and sets the guide rail to create the sweep. This can be set to null + /// to have a path only sweep. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr guideRail() const; + bool guideRail(const core::Ptr& value); + + /// Gets and sets if the direction of the sweep is flipped. + /// This property only applies to sweep features that include a guide rail and whose path runs on both + /// sides of the profile. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isDirectionFlipped() const; + bool isDirectionFlipped(bool value); + + /// Gets and sets the sweep profile scaling option. It defaults to SweepProfileScaleOption. This + /// property is only used when a guide rail has been specified. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + SweepProfileScalingOptions profileScaling() const; + bool profileScaling(SweepProfileScalingOptions value); + + /// Gets and sets the list of bodies that will participate in the feature when the operation is a cut or intersection. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + std::vector> participantBodies() const; + bool participantBodies(const std::vector>& value); + + /// Gets the ModelParameter that defines the taper angle of the sweep feature. + /// The value of the angle can be edited by using the properties on the ModelParameter object to edit the parameter. + core::Ptr taperAngle() const; + + /// Gets the ModelParameter that defines the twist angle of the sweep feature. + /// The value of the angle can be edited by using the properties on the ModelParameter object to edit the parameter. + core::Ptr twistAngle() const; + + /// Gets and sets the sweep extent type. It defaults to PerpendicularToPathExtentType. + /// This property is ignored when a guide rail has not been specified. + SweepExtentTypes extent() const; + bool extent(SweepExtentTypes value); + + ADSK_FUSION_SWEEPFEATURE_API static const char* classType(); + ADSK_FUSION_SWEEPFEATURE_API const char* objectType() const override; + ADSK_FUSION_SWEEPFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SWEEPFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* profile_raw() const = 0; + virtual bool profile_raw(core::Base* value) = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual Path* path_raw() const = 0; + virtual bool path_raw(Path* value) = 0; + virtual ModelParameter* distanceOne_raw() const = 0; + virtual ModelParameter* distanceTwo_raw() const = 0; + virtual SweepOrientationTypes orientation_raw() const = 0; + virtual bool orientation_raw(SweepOrientationTypes value) = 0; + virtual BRepFaces* startFaces_raw() const = 0; + virtual BRepFaces* endFaces_raw() const = 0; + virtual BRepFaces* sideFaces_raw() const = 0; + virtual SweepFeature* nativeObject_raw() const = 0; + virtual SweepFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual bool isSolid_raw() const = 0; + virtual Path* guideRail_raw() const = 0; + virtual bool guideRail_raw(Path* value) = 0; + virtual bool isDirectionFlipped_raw() const = 0; + virtual bool isDirectionFlipped_raw(bool value) = 0; + virtual SweepProfileScalingOptions profileScaling_raw() const = 0; + virtual bool profileScaling_raw(SweepProfileScalingOptions value) = 0; + virtual BRepBody** participantBodies_raw(size_t& return_size) const = 0; + virtual bool participantBodies_raw(BRepBody** value, size_t value_size) = 0; + virtual ModelParameter* taperAngle_raw() const = 0; + virtual ModelParameter* twistAngle_raw() const = 0; + virtual SweepExtentTypes extent_raw() const = 0; + virtual bool extent_raw(SweepExtentTypes value) = 0; +}; + +// Inline wrappers + +inline core::Ptr SweepFeature::profile() const +{ + core::Ptr res = profile_raw(); + return res; +} + +inline bool SweepFeature::profile(const core::Ptr& value) +{ + return profile_raw(value.get()); +} + +inline FeatureOperations SweepFeature::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool SweepFeature::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline core::Ptr SweepFeature::path() const +{ + core::Ptr res = path_raw(); + return res; +} + +inline bool SweepFeature::path(const core::Ptr& value) +{ + return path_raw(value.get()); +} + +inline core::Ptr SweepFeature::distanceOne() const +{ + core::Ptr res = distanceOne_raw(); + return res; +} + +inline core::Ptr SweepFeature::distanceTwo() const +{ + core::Ptr res = distanceTwo_raw(); + return res; +} + +inline SweepOrientationTypes SweepFeature::orientation() const +{ + SweepOrientationTypes res = orientation_raw(); + return res; +} + +inline bool SweepFeature::orientation(SweepOrientationTypes value) +{ + return orientation_raw(value); +} + +inline core::Ptr SweepFeature::startFaces() const +{ + core::Ptr res = startFaces_raw(); + return res; +} + +inline core::Ptr SweepFeature::endFaces() const +{ + core::Ptr res = endFaces_raw(); + return res; +} + +inline core::Ptr SweepFeature::sideFaces() const +{ + core::Ptr res = sideFaces_raw(); + return res; +} + +inline core::Ptr SweepFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SweepFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline bool SweepFeature::isSolid() const +{ + bool res = isSolid_raw(); + return res; +} + +inline core::Ptr SweepFeature::guideRail() const +{ + core::Ptr res = guideRail_raw(); + return res; +} + +inline bool SweepFeature::guideRail(const core::Ptr& value) +{ + return guideRail_raw(value.get()); +} + +inline bool SweepFeature::isDirectionFlipped() const +{ + bool res = isDirectionFlipped_raw(); + return res; +} + +inline bool SweepFeature::isDirectionFlipped(bool value) +{ + return isDirectionFlipped_raw(value); +} + +inline SweepProfileScalingOptions SweepFeature::profileScaling() const +{ + SweepProfileScalingOptions res = profileScaling_raw(); + return res; +} + +inline bool SweepFeature::profileScaling(SweepProfileScalingOptions value) +{ + return profileScaling_raw(value); +} + +inline std::vector> SweepFeature::participantBodies() const +{ + std::vector> res; + size_t s; + + BRepBody** p= participantBodies_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool SweepFeature::participantBodies(const std::vector>& value) +{ + BRepBody** value_ = new BRepBody*[value.size()]; + for(size_t i=0; i SweepFeature::taperAngle() const +{ + core::Ptr res = taperAngle_raw(); + return res; +} + +inline core::Ptr SweepFeature::twistAngle() const +{ + core::Ptr res = twistAngle_raw(); + return res; +} + +inline SweepExtentTypes SweepFeature::extent() const +{ + SweepExtentTypes res = extent_raw(); + return res; +} + +inline bool SweepFeature::extent(SweepExtentTypes value) +{ + return extent_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SWEEPFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SweepFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/SweepFeatureInput.h new file mode 100644 index 0000000..7196741 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SweepFeatureInput.h @@ -0,0 +1,381 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SWEEPFEATUREINPUT_CPP__ +# define ADSK_FUSION_SWEEPFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_SWEEPFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_SWEEPFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class BRepBody; + class Occurrence; + class Path; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a sweep +/// feature. +class SweepFeatureInput : public core::Base { +public: + + /// Gets and sets the profiles or planar faces used to define the shape of the sweep. + /// This property can return or be set with a single Profile, a single planar face, or + /// an ObjectCollection consisting of multiple profiles and planar faces. When an + /// ObjectCollection is used all of the profiles and faces must be co-planar. + core::Ptr profile() const; + bool profile(const core::Ptr& value); + + /// Gets and sets the type of operation performed by the sweep. + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// Gets and sets the path to create the sweep. + core::Ptr path() const; + bool path(const core::Ptr& value); + + /// Gets and sets the distance for the first side. + /// The distance is a value from 0 to 1 indicating the position along the path where 0 + /// is at the start and 1 is at the end. The value is default to 1.0. + core::Ptr distanceOne() const; + bool distanceOne(const core::Ptr& value); + + /// Gets and sets the distance for the second side. + /// The distance is a value from 0 to 1 indicating the position along the path where 0 + /// is at the start and 1 is at the end. The value defaults to 0 in the case where the path is closed, otherwise it defaults to 1.0. + /// It is ignored if the path is only on one side of the profile or if the sweep definition includes a guide rail. + /// It's always the distance against the normal of the profile if available. + core::Ptr distanceTwo() const; + bool distanceTwo(const core::Ptr& value); + + /// Gets and sets the sweep orientation. It defaults to PerpendicularOrientationType. + /// This property is ignored when a guide rail has been specified. + SweepOrientationTypes orientation() const; + bool orientation(SweepOrientationTypes value); + + /// In order for geometry to be transformed correctly, an Occurrence for creation needs to be + /// specified when the sweep is created based on geometry (e.g. a profile and/or face(s)) + /// in another component AND (the sweep) is not in the root component. + /// The CreationOccurrence is analogous to the active occurrence in the UI + core::Ptr creationOccurrence() const; + bool creationOccurrence(const core::Ptr& value); + + /// Specifies if the sweep should be created as a solid or surface. If + /// it's a surface then there aren't any end caps and it's open. This is + /// initialized to true so a solid will be created if it's not changed. + bool isSolid() const; + bool isSolid(bool value); + + /// Gets and sets the guide rail to create the sweep. This can be set to + /// null to remove the guide rail definition and have a single path sweep feature. + core::Ptr guideRail() const; + bool guideRail(const core::Ptr& value); + + /// Gets and sets if the direction of the sweep is flipped. + /// This property only applies to sweep features that include a guide rail and whose path runs on both + /// sides of the profile. + bool isDirectionFlipped() const; + bool isDirectionFlipped(bool value); + + /// Gets and sets the sweep profile scaling option. It defaults to SweepProfileScaleOption. + /// This property is only used when a guide rail has been specified. + SweepProfileScalingOptions profileScaling() const; + bool profileScaling(SweepProfileScalingOptions value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + /// Gets and sets the list of bodies that will participate in the feature when the operation is a cut or intersection. + /// If this property has not been set, the default behavior is that all bodies that are intersected by the + /// feature will participate. + /// This property can return null in the case where the feature has not been fully defined so that + /// possible intersecting bodies can be computed. + std::vector> participantBodies() const; + bool participantBodies(const std::vector>& value); + + /// Gets and sets the taper angle of the sweep. This property is initialized with a taper angle of zero. + /// A negative angle will taper the sweep inward while a positive value will taper + /// the sweep outward. This property is valid for both parametric and non-parametric extrusions. + core::Ptr taperAngle() const; + bool taperAngle(const core::Ptr& value); + + /// Gets and sets the taper angle of the sweep. This property is initialized with a taper angle of zero. + /// A negative angle will taper the sweep inward while a positive value will taper + /// the sweep outward. This property is valid for both parametric and non-parametric extrusions. + core::Ptr twistAngle() const; + bool twistAngle(const core::Ptr& value); + + /// Gets and sets the sweep extent type. It defaults to PerpendicularToPathExtentType. + /// This property is ignored when a guide rail has not been specified. + SweepExtentTypes extent() const; + bool extent(SweepExtentTypes value); + + ADSK_FUSION_SWEEPFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_SWEEPFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_SWEEPFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SWEEPFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* profile_raw() const = 0; + virtual bool profile_raw(core::Base* value) = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual Path* path_raw() const = 0; + virtual bool path_raw(Path* value) = 0; + virtual core::ValueInput* distanceOne_raw() const = 0; + virtual bool distanceOne_raw(core::ValueInput* value) = 0; + virtual core::ValueInput* distanceTwo_raw() const = 0; + virtual bool distanceTwo_raw(core::ValueInput* value) = 0; + virtual SweepOrientationTypes orientation_raw() const = 0; + virtual bool orientation_raw(SweepOrientationTypes value) = 0; + virtual Occurrence* creationOccurrence_raw() const = 0; + virtual bool creationOccurrence_raw(Occurrence* value) = 0; + virtual bool isSolid_raw() const = 0; + virtual bool isSolid_raw(bool value) = 0; + virtual Path* guideRail_raw() const = 0; + virtual bool guideRail_raw(Path* value) = 0; + virtual bool isDirectionFlipped_raw() const = 0; + virtual bool isDirectionFlipped_raw(bool value) = 0; + virtual SweepProfileScalingOptions profileScaling_raw() const = 0; + virtual bool profileScaling_raw(SweepProfileScalingOptions value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; + virtual BRepBody** participantBodies_raw(size_t& return_size) const = 0; + virtual bool participantBodies_raw(BRepBody** value, size_t value_size) = 0; + virtual core::ValueInput* taperAngle_raw() const = 0; + virtual bool taperAngle_raw(core::ValueInput* value) = 0; + virtual core::ValueInput* twistAngle_raw() const = 0; + virtual bool twistAngle_raw(core::ValueInput* value) = 0; + virtual SweepExtentTypes extent_raw() const = 0; + virtual bool extent_raw(SweepExtentTypes value) = 0; +}; + +// Inline wrappers + +inline core::Ptr SweepFeatureInput::profile() const +{ + core::Ptr res = profile_raw(); + return res; +} + +inline bool SweepFeatureInput::profile(const core::Ptr& value) +{ + return profile_raw(value.get()); +} + +inline FeatureOperations SweepFeatureInput::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool SweepFeatureInput::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline core::Ptr SweepFeatureInput::path() const +{ + core::Ptr res = path_raw(); + return res; +} + +inline bool SweepFeatureInput::path(const core::Ptr& value) +{ + return path_raw(value.get()); +} + +inline core::Ptr SweepFeatureInput::distanceOne() const +{ + core::Ptr res = distanceOne_raw(); + return res; +} + +inline bool SweepFeatureInput::distanceOne(const core::Ptr& value) +{ + return distanceOne_raw(value.get()); +} + +inline core::Ptr SweepFeatureInput::distanceTwo() const +{ + core::Ptr res = distanceTwo_raw(); + return res; +} + +inline bool SweepFeatureInput::distanceTwo(const core::Ptr& value) +{ + return distanceTwo_raw(value.get()); +} + +inline SweepOrientationTypes SweepFeatureInput::orientation() const +{ + SweepOrientationTypes res = orientation_raw(); + return res; +} + +inline bool SweepFeatureInput::orientation(SweepOrientationTypes value) +{ + return orientation_raw(value); +} + +inline core::Ptr SweepFeatureInput::creationOccurrence() const +{ + core::Ptr res = creationOccurrence_raw(); + return res; +} + +inline bool SweepFeatureInput::creationOccurrence(const core::Ptr& value) +{ + return creationOccurrence_raw(value.get()); +} + +inline bool SweepFeatureInput::isSolid() const +{ + bool res = isSolid_raw(); + return res; +} + +inline bool SweepFeatureInput::isSolid(bool value) +{ + return isSolid_raw(value); +} + +inline core::Ptr SweepFeatureInput::guideRail() const +{ + core::Ptr res = guideRail_raw(); + return res; +} + +inline bool SweepFeatureInput::guideRail(const core::Ptr& value) +{ + return guideRail_raw(value.get()); +} + +inline bool SweepFeatureInput::isDirectionFlipped() const +{ + bool res = isDirectionFlipped_raw(); + return res; +} + +inline bool SweepFeatureInput::isDirectionFlipped(bool value) +{ + return isDirectionFlipped_raw(value); +} + +inline SweepProfileScalingOptions SweepFeatureInput::profileScaling() const +{ + SweepProfileScalingOptions res = profileScaling_raw(); + return res; +} + +inline bool SweepFeatureInput::profileScaling(SweepProfileScalingOptions value) +{ + return profileScaling_raw(value); +} + +inline core::Ptr SweepFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool SweepFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} + +inline std::vector> SweepFeatureInput::participantBodies() const +{ + std::vector> res; + size_t s; + + BRepBody** p= participantBodies_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool SweepFeatureInput::participantBodies(const std::vector>& value) +{ + BRepBody** value_ = new BRepBody*[value.size()]; + for(size_t i=0; i SweepFeatureInput::taperAngle() const +{ + core::Ptr res = taperAngle_raw(); + return res; +} + +inline bool SweepFeatureInput::taperAngle(const core::Ptr& value) +{ + return taperAngle_raw(value.get()); +} + +inline core::Ptr SweepFeatureInput::twistAngle() const +{ + core::Ptr res = twistAngle_raw(); + return res; +} + +inline bool SweepFeatureInput::twistAngle(const core::Ptr& value) +{ + return twistAngle_raw(value.get()); +} + +inline SweepExtentTypes SweepFeatureInput::extent() const +{ + SweepExtentTypes res = extent_raw(); + return res; +} + +inline bool SweepFeatureInput::extent(SweepExtentTypes value) +{ + return extent_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SWEEPFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SweepFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/SweepFeatures.h new file mode 100644 index 0000000..05afd51 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SweepFeatures.h @@ -0,0 +1,135 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SWEEPFEATURES_CPP__ +# define ADSK_FUSION_SWEEPFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_SWEEPFEATURES_API +# endif +#else +# define ADSK_FUSION_SWEEPFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Path; + class SweepFeature; + class SweepFeatureInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing sweep features in a component +/// and supports the ability to create new sweep features. +class SweepFeatures : public core::Base { +public: + + /// Function that returns the specified sweep feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of sweep features in the collection. + size_t count() const; + + /// Creates a SweepFeatureInput object for defining a simple sweep feature with only a path and no guide rail. + /// Use properties and methods on this object to define the sweep you want to create and then use the Add method, + /// passing in the SweepFeatureInput object. + /// profile : The profile argument can be a single Profile, a single + /// planar face, or an ObjectCollection consisting of multiple profiles and planar faces. + /// When an ObjectCollection is used all of the profiles and faces must be co-planar. + /// path : The path to create the sweep. + /// operation : The feature operation to perform + /// Returns the newly created SweepFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& profile, const core::Ptr& path, FeatureOperations operation) const; + + /// Creates a new sweep feature. + /// input : A SweepFeatureInput object that defines the desired sweep. Use the createInput + /// method to create a new SweepFeatureInput object and then use methods on it + /// (the SweepFeatureInput object) to define the sweep. + /// Returns the newly created SweepFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified sweep feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef SweepFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SWEEPFEATURES_API static const char* classType(); + ADSK_FUSION_SWEEPFEATURES_API const char* objectType() const override; + ADSK_FUSION_SWEEPFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SWEEPFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SweepFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual SweepFeatureInput* createInput_raw(core::Base* profile, Path* path, FeatureOperations operation) const = 0; + virtual SweepFeature* add_raw(SweepFeatureInput* input) = 0; + virtual SweepFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SweepFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SweepFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr SweepFeatures::createInput(const core::Ptr& profile, const core::Ptr& path, FeatureOperations operation) const +{ + core::Ptr res = createInput_raw(profile.get(), path.get(), operation); + return res; +} + +inline core::Ptr SweepFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr SweepFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void SweepFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SWEEPFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/SymmetricExtentDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/SymmetricExtentDefinition.h new file mode 100644 index 0000000..5e0c4d8 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/SymmetricExtentDefinition.h @@ -0,0 +1,111 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExtentDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SYMMETRICEXTENTDEFINITION_CPP__ +# define ADSK_FUSION_SYMMETRICEXTENTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_SYMMETRICEXTENTDEFINITION_API +# endif +#else +# define ADSK_FUSION_SYMMETRICEXTENTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// A definition object that is used to define the extents of a feature to be symmetric. +class SymmetricExtentDefinition : public ExtentDefinition { +public: + + /// Statically creates a new SymmetricExtentDefinition object. This is used as input when + /// create a new feature and defining the starting condition. + /// distance : An input ValueInput objects that defines either half the extent of the extrude or the full extent, depending + /// on the value of the isFullLength argument. + /// isFullLength : An input boolean that specifies if the distance specified defines the full or half length of the extrusion. + /// Returns the newly created SymmetricExtentDefinition or null in the case of a failure. + static core::Ptr create(const core::Ptr& distance, bool isFullLength); + + /// Gets and sets if the distance defines the full extent length or half the length. A value of + /// True indicates if defines the full length. + bool isFullLength() const; + bool isFullLength(bool value); + + /// Returns the current extent distance. If the SymmetricExtentDefinition object has been created statically and isn't associated with + /// a feature this will return a ValueInput object. If the SymmetricExtentDefinition object is obtained from a feature this + /// will return a ModelParameter object. You can use properties of the parameter to edit it's value which will result in + /// the feature updating. + core::Ptr distance() const; + + /// Returns the current taper angle. If the SymmetricExtentDefinition object has been created statically and isn't associated with + /// a feature this will return a ValueInput object. If the SymmetricExtentDefinition object is obtained from a feature this + /// will return a ModelParameter object. You can use properties of the parameter to edit it's value which will result in + /// the feature updating. + core::Ptr taperAngle() const; + + ADSK_FUSION_SYMMETRICEXTENTDEFINITION_API static const char* classType(); + ADSK_FUSION_SYMMETRICEXTENTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_SYMMETRICEXTENTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SYMMETRICEXTENTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_SYMMETRICEXTENTDEFINITION_API static SymmetricExtentDefinition* create_raw(core::ValueInput* distance, bool isFullLength); + virtual bool isFullLength_raw() const = 0; + virtual bool isFullLength_raw(bool value) = 0; + virtual core::Base* distance_raw() const = 0; + virtual core::Base* taperAngle_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SymmetricExtentDefinition::create(const core::Ptr& distance, bool isFullLength) +{ + core::Ptr res = create_raw(distance.get(), isFullLength); + return res; +} + +inline bool SymmetricExtentDefinition::isFullLength() const +{ + bool res = isFullLength_raw(); + return res; +} + +inline bool SymmetricExtentDefinition::isFullLength(bool value) +{ + return isFullLength_raw(value); +} + +inline core::Ptr SymmetricExtentDefinition::distance() const +{ + core::Ptr res = distance_raw(); + return res; +} + +inline core::Ptr SymmetricExtentDefinition::taperAngle() const +{ + core::Ptr res = taperAngle_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SYMMETRICEXTENTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ThickenFeature.h b/usr/autodesk/CPP/include/Fusion/Features/ThickenFeature.h new file mode 100644 index 0000000..84777bf --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ThickenFeature.h @@ -0,0 +1,179 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_THICKENFEATURE_CPP__ +# define ADSK_FUSION_THICKENFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_THICKENFEATURE_API +# endif +#else +# define ADSK_FUSION_THICKENFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; + class Occurrence; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing Thicken feature in a design. +class ThickenFeature : public Feature { +public: + + /// Sets the faces and patch bodies to thicken. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// inputFaces : The faces or patch bodies to thicken. Faces need not be from the same component or body, nor do they need to be + /// connected or touching one another. + /// isChainSelection : A boolean value for setting whether or not faces that are tangentially connected to + /// the input faces (if any) will be included in the offset. The default value is true. + /// Returns true if successful + bool setInputEntities(const core::Ptr& inputFaces, bool isChainSelection = true); + + /// Gets and sets the ObjectCollection containing the face and/or patch bodies to thicken. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr inputFaces() const; + bool inputFaces(const core::Ptr& value); + + /// Returns the parameter controlling the thickness. You can edit the thickness value + /// by editing the value of the parameter object. + core::Ptr thickness() const; + + /// Gets and sets whether to add thickness symmetrically or only on one side of the face/s to thicken. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isSymmetric() const; + bool isSymmetric(bool value); + + /// Gets and sets the feature operation to perform. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// Get and sets whether faces that are tangentially connected to the input faces will be included in the thicken feature. + bool isChainSelection() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_THICKENFEATURE_API static const char* classType(); + ADSK_FUSION_THICKENFEATURE_API const char* objectType() const override; + ADSK_FUSION_THICKENFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_THICKENFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool setInputEntities_raw(core::ObjectCollection* inputFaces, bool isChainSelection) = 0; + virtual core::ObjectCollection* inputFaces_raw() const = 0; + virtual bool inputFaces_raw(core::ObjectCollection* value) = 0; + virtual ModelParameter* thickness_raw() const = 0; + virtual bool isSymmetric_raw() const = 0; + virtual bool isSymmetric_raw(bool value) = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual bool isChainSelection_raw() const = 0; + virtual ThickenFeature* nativeObject_raw() const = 0; + virtual ThickenFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline bool ThickenFeature::setInputEntities(const core::Ptr& inputFaces, bool isChainSelection) +{ + bool res = setInputEntities_raw(inputFaces.get(), isChainSelection); + return res; +} + +inline core::Ptr ThickenFeature::inputFaces() const +{ + core::Ptr res = inputFaces_raw(); + return res; +} + +inline bool ThickenFeature::inputFaces(const core::Ptr& value) +{ + return inputFaces_raw(value.get()); +} + +inline core::Ptr ThickenFeature::thickness() const +{ + core::Ptr res = thickness_raw(); + return res; +} + +inline bool ThickenFeature::isSymmetric() const +{ + bool res = isSymmetric_raw(); + return res; +} + +inline bool ThickenFeature::isSymmetric(bool value) +{ + return isSymmetric_raw(value); +} + +inline FeatureOperations ThickenFeature::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool ThickenFeature::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline bool ThickenFeature::isChainSelection() const +{ + bool res = isChainSelection_raw(); + return res; +} + +inline core::Ptr ThickenFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr ThickenFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_THICKENFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ThickenFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/ThickenFeatureInput.h new file mode 100644 index 0000000..e2b10bc --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ThickenFeatureInput.h @@ -0,0 +1,165 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_THICKENFEATUREINPUT_CPP__ +# define ADSK_FUSION_THICKENFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_THICKENFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_THICKENFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a Thicken feature. +class ThickenFeatureInput : public core::Base { +public: + + /// An ObjectCollection containing the face and/or patch bodies to thicken. + core::Ptr inputFaces() const; + bool inputFaces(const core::Ptr& value); + + /// Gets and sets the ValueInput object that defines the thickness distance. + core::Ptr thickness() const; + bool thickness(const core::Ptr& value); + + /// Gets and sets whether to add thickness symmetrically or only on one side of the face/s to thicken + bool isSymmetric() const; + bool isSymmetric(bool value); + + /// Gets and sets the feature operation to perform. + FeatureOperations operation() const; + bool operation(FeatureOperations value); + + /// Get and sets whether faces that are tangentially connected to the input faces will be included in the thicken feature. + bool isChainSelection() const; + bool isChainSelection(bool value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_THICKENFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_THICKENFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_THICKENFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_THICKENFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* inputFaces_raw() const = 0; + virtual bool inputFaces_raw(core::ObjectCollection* value) = 0; + virtual core::ValueInput* thickness_raw() const = 0; + virtual bool thickness_raw(core::ValueInput* value) = 0; + virtual bool isSymmetric_raw() const = 0; + virtual bool isSymmetric_raw(bool value) = 0; + virtual FeatureOperations operation_raw() const = 0; + virtual bool operation_raw(FeatureOperations value) = 0; + virtual bool isChainSelection_raw() const = 0; + virtual bool isChainSelection_raw(bool value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr ThickenFeatureInput::inputFaces() const +{ + core::Ptr res = inputFaces_raw(); + return res; +} + +inline bool ThickenFeatureInput::inputFaces(const core::Ptr& value) +{ + return inputFaces_raw(value.get()); +} + +inline core::Ptr ThickenFeatureInput::thickness() const +{ + core::Ptr res = thickness_raw(); + return res; +} + +inline bool ThickenFeatureInput::thickness(const core::Ptr& value) +{ + return thickness_raw(value.get()); +} + +inline bool ThickenFeatureInput::isSymmetric() const +{ + bool res = isSymmetric_raw(); + return res; +} + +inline bool ThickenFeatureInput::isSymmetric(bool value) +{ + return isSymmetric_raw(value); +} + +inline FeatureOperations ThickenFeatureInput::operation() const +{ + FeatureOperations res = operation_raw(); + return res; +} + +inline bool ThickenFeatureInput::operation(FeatureOperations value) +{ + return operation_raw(value); +} + +inline bool ThickenFeatureInput::isChainSelection() const +{ + bool res = isChainSelection_raw(); + return res; +} + +inline bool ThickenFeatureInput::isChainSelection(bool value) +{ + return isChainSelection_raw(value); +} + +inline core::Ptr ThickenFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool ThickenFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_THICKENFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ThickenFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/ThickenFeatures.h new file mode 100644 index 0000000..028b4b2 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ThickenFeatures.h @@ -0,0 +1,140 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_THICKENFEATURES_CPP__ +# define ADSK_FUSION_THICKENFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_THICKENFEATURES_API +# endif +#else +# define ADSK_FUSION_THICKENFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ThickenFeature; + class ThickenFeatureInput; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing Thicken features in a component +/// and supports the ability to create new Thicken features. +class ThickenFeatures : public core::Base { +public: + + /// Function that returns the specified Thicken feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of Thicken features in the collection. + size_t count() const; + + /// Creates a ThickenFeatureInput object. Use properties and methods on this object + /// to define the Thicken feature you want to create and then use the Add method, passing in + /// the ThickenFeatureInput object to create the feature. + /// inputFaces : The faces or patch bodies to thicken. Faces need not be from the same component or body, nor do they need to be + /// connected or touching one another. + /// thickness : ValueInput object that defines the thickness. + /// isSymmetric : A boolean value for setting whether to add thickness symmetrically or only on one side of the face/s to thicken + /// operation : The feature operation to perform. + /// isChainSelection : A boolean value for setting whether or not faces that are tangentially connected to + /// the input faces (if any) will be included in the thicken. The default value is true. + /// Returns the newly created ThickenFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& inputFaces, const core::Ptr& thickness, bool isSymmetric, FeatureOperations operation, bool isChainSelection = true) const; + + /// Creates a new Thicken feature. + /// input : A FeatureInput object that defines the desired Thicken feature. Use the createInput + /// method to create a new ThickenFeatureInput object and then use methods on it + /// (the ThickenFeatureInput object) to define the Thicken feature. + /// Returns the newly created ThickenFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified thicken feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef ThickenFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_THICKENFEATURES_API static const char* classType(); + ADSK_FUSION_THICKENFEATURES_API const char* objectType() const override; + ADSK_FUSION_THICKENFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_THICKENFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ThickenFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual ThickenFeatureInput* createInput_raw(core::ObjectCollection* inputFaces, core::ValueInput* thickness, bool isSymmetric, FeatureOperations operation, bool isChainSelection) const = 0; + virtual ThickenFeature* add_raw(ThickenFeatureInput* input) = 0; + virtual ThickenFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr ThickenFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t ThickenFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr ThickenFeatures::createInput(const core::Ptr& inputFaces, const core::Ptr& thickness, bool isSymmetric, FeatureOperations operation, bool isChainSelection) const +{ + core::Ptr res = createInput_raw(inputFaces.get(), thickness.get(), isSymmetric, operation, isChainSelection); + return res; +} + +inline core::Ptr ThickenFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr ThickenFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void ThickenFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_THICKENFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ThreadDataQuery.h b/usr/autodesk/CPP/include/Fusion/Features/ThreadDataQuery.h new file mode 100644 index 0000000..8091d12 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ThreadDataQuery.h @@ -0,0 +1,267 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_THREADDATAQUERY_CPP__ +# define ADSK_FUSION_THREADDATAQUERY_API XI_EXPORT +# else +# define ADSK_FUSION_THREADDATAQUERY_API +# endif +#else +# define ADSK_FUSION_THREADDATAQUERY_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// This object provides methods to query the thread data contained in the XML files in ThreadData folder within the +/// Fusion 360 install folder. You can use the queried values to create a ThreadInfo object that is then used to +/// create a thread feature. +class ThreadDataQuery : public core::Base { +public: + + /// Returns an array/list of all the available thread types (families). + std::vector allThreadTypes() const; + + /// Returns an array/list of all the available thread sizes for a given thread type. You can + /// use the allThreadTypes property to get the available thread types. + /// threadType : Specify the thread type. + /// Returns the specified thread sizes or an empty array/list if an invalid thread type was specified. + std::vector allSizes(const std::string& threadType) const; + + /// returns an array/list of all the available thread designations for a thread type of a given size. Valid + /// thread types and sizes and be obtained by using the allThreadTypes and allSizes functions. + /// threadType : The thread type of the designation you want. + /// size : The thread size of the designation you want. + /// Returns the specified thread designations or empty array/list if an invalid thread type or size was specified. + std::vector allDesignations(const std::string& threadType, const std::string& size) const; + + /// Returns and array/list of all the available classes for a thread type of a given thread designation. + /// isInternal : Indicates if the thread is an internal or external thread. + /// threadType : The thread type of the thread class you want. + /// designation : The thread designation of the thread class you want. + /// Returns the specified thread classes or empty array/list if an invalid thread type or designation was specified. + std::vector allClasses(bool isInternal, const std::string& threadType, const std::string& designation) const; + + /// Method that returns the custom name for a given thread type. + /// threadType : The thread type you want to get the custom name for. + /// Returns the specified custom name or an empty string if an invalid thread type was specified. + std::string threadTypeCustomName(const std::string& threadType) const; + + /// Method that returns the unit for a given thread type. + /// threadType : The thread type you want to get the thread unit type for. + /// Returns the specified unit or an empty string if an invalid thread type was specified. + std::string threadTypeUnit(const std::string& threadType) const; + + /// Method that gets the recommended thread data for a given model diameter. + /// modelDiameter : The diameter of the cylinder the thread will be placed on. The units are centimeters. + /// isInternal : Indicates if the thread is an internal or external thread. + /// threadType : Specifies the thread type to query the thread data. + /// designation : The output thread designation. + /// threadClass : The output thread class. + /// Returns true if successful. + bool recommendThreadData(double modelDiameter, bool isInternal, const std::string& threadType, std::string& designation, std::string& threadClass) const; + + /// Gets the default thread type for inch threads. + std::string defaultInchThreadType() const; + + /// Gets the default thread type for metric threads. + std::string defaultMetricThreadType() const; + + ADSK_FUSION_THREADDATAQUERY_API static const char* classType(); + ADSK_FUSION_THREADDATAQUERY_API const char* objectType() const override; + ADSK_FUSION_THREADDATAQUERY_API void* queryInterface(const char* id) const override; + ADSK_FUSION_THREADDATAQUERY_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char** allThreadTypes_raw(size_t& return_size) const = 0; + virtual char** allSizes_raw(const char * threadType, size_t& return_size) const = 0; + virtual char** allDesignations_raw(const char * threadType, const char * size, size_t& return_size) const = 0; + virtual char** allClasses_raw(bool isInternal, const char * threadType, const char * designation, size_t& return_size) const = 0; + virtual char* threadTypeCustomName_raw(const char * threadType) const = 0; + virtual char* threadTypeUnit_raw(const char * threadType) const = 0; + virtual bool recommendThreadData_raw(double modelDiameter, bool isInternal, const char * threadType, char*& designation, char*& threadClass) const = 0; + virtual char* defaultInchThreadType_raw() const = 0; + virtual char* defaultMetricThreadType_raw() const = 0; +}; + +// Inline wrappers + +inline std::vector ThreadDataQuery::allThreadTypes() const +{ + std::vector res; + size_t s; + + char** p= allThreadTypes_raw(s); + if(p) + { + res.resize(s); + for(size_t i=0; i ThreadDataQuery::allSizes(const std::string& threadType) const +{ + std::vector res; + size_t s; + + char** p= allSizes_raw(threadType.c_str(), s); + if(p) + { + res.resize(s); + for(size_t i=0; i ThreadDataQuery::allDesignations(const std::string& threadType, const std::string& size) const +{ + std::vector res; + size_t s; + + char** p= allDesignations_raw(threadType.c_str(), size.c_str(), s); + if(p) + { + res.resize(s); + for(size_t i=0; i ThreadDataQuery::allClasses(bool isInternal, const std::string& threadType, const std::string& designation) const +{ + std::vector res; + size_t s; + + char** p= allClasses_raw(isInternal, threadType.c_str(), designation.c_str(), s); + if(p) + { + res.resize(s); + for(size_t i=0; i inputCylindricalFace() const; + bool inputCylindricalFace(const core::Ptr& value); + + /// Gets and sets if the thread is physical or cosmetic thread. A value of true indicates a physical thread. + /// It defaults to false. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isModeled() const; + bool isModeled(bool value); + + /// Gets and sets if this thread is the full length of the cylinder. + /// It only can be set to true. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isFullLength() const; + bool isFullLength(bool value); + + /// Sets the thread offset, length and location. + /// Calling this method will cause the isFullLength property to be set to false. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// threadOffset : A ValueInput object that defines the thread offset. + /// threadLength : A ValueInput object that defines the thread length. + /// threadLocation : Indicates where the thread length is measured from. + /// Returns true if successful. + bool setThreadOffsetLength(const core::Ptr& threadOffset, const core::Ptr& threadLength, ThreadLocations threadLocation); + + /// Gets the parameter that controls the depth of the thread. + /// Even though the parameter for the thread depth is always created and accessible through this property, + /// it is only used in the case where the isFullLength property is false. + /// Returns nothing in the case where the feature is non-parametric. + core::Ptr threadLength() const; + + /// Gets the parameter that controls the offset value of the thread. + /// The offset is the distance along the axis of the cylinder from the edge to the start of the thread, + /// it is only used in the case where the isFullLength property is false. + /// Returns nothing in the case where the feature is non-parametric. + core::Ptr threadOffset() const; + + /// Gets and sets where the thread length is measured from. + /// This property is only used in the case where the isFullLength property is false. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + ThreadLocations threadLocation() const; + bool threadLocation(ThreadLocations value); + + /// Gets and sets the thread data. + /// Also can edit the thread through the properties and methods on the ThreadInfo object. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr threadInfo() const; + bool threadInfo(const core::Ptr& value); + + /// Gets and sets if the thread is right or left-handed thread. A value of true indicates a right-handed thread. + /// It defaults to true. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isRightHanded() const; + bool isRightHanded(bool value); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Gets and sets the cylindrical input faces. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr inputCylindricalFaces() const; + bool inputCylindricalFaces(const core::Ptr& value); + + ADSK_FUSION_THREADFEATURE_API static const char* classType(); + ADSK_FUSION_THREADFEATURE_API const char* objectType() const override; + ADSK_FUSION_THREADFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_THREADFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepFace* inputCylindricalFace_raw() const = 0; + virtual bool inputCylindricalFace_raw(BRepFace* value) = 0; + virtual bool isModeled_raw() const = 0; + virtual bool isModeled_raw(bool value) = 0; + virtual bool isFullLength_raw() const = 0; + virtual bool isFullLength_raw(bool value) = 0; + virtual bool setThreadOffsetLength_raw(core::ValueInput* threadOffset, core::ValueInput* threadLength, ThreadLocations threadLocation) = 0; + virtual ModelParameter* threadLength_raw() const = 0; + virtual ModelParameter* threadOffset_raw() const = 0; + virtual ThreadLocations threadLocation_raw() const = 0; + virtual bool threadLocation_raw(ThreadLocations value) = 0; + virtual ThreadInfo* threadInfo_raw() const = 0; + virtual bool threadInfo_raw(ThreadInfo* value) = 0; + virtual bool isRightHanded_raw() const = 0; + virtual bool isRightHanded_raw(bool value) = 0; + virtual ThreadFeature* nativeObject_raw() const = 0; + virtual ThreadFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual core::ObjectCollection* inputCylindricalFaces_raw() const = 0; + virtual bool inputCylindricalFaces_raw(core::ObjectCollection* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr ThreadFeature::inputCylindricalFace() const +{ + core::Ptr res = inputCylindricalFace_raw(); + return res; +} + +inline bool ThreadFeature::inputCylindricalFace(const core::Ptr& value) +{ + return inputCylindricalFace_raw(value.get()); +} + +inline bool ThreadFeature::isModeled() const +{ + bool res = isModeled_raw(); + return res; +} + +inline bool ThreadFeature::isModeled(bool value) +{ + return isModeled_raw(value); +} + +inline bool ThreadFeature::isFullLength() const +{ + bool res = isFullLength_raw(); + return res; +} + +inline bool ThreadFeature::isFullLength(bool value) +{ + return isFullLength_raw(value); +} + +inline bool ThreadFeature::setThreadOffsetLength(const core::Ptr& threadOffset, const core::Ptr& threadLength, ThreadLocations threadLocation) +{ + bool res = setThreadOffsetLength_raw(threadOffset.get(), threadLength.get(), threadLocation); + return res; +} + +inline core::Ptr ThreadFeature::threadLength() const +{ + core::Ptr res = threadLength_raw(); + return res; +} + +inline core::Ptr ThreadFeature::threadOffset() const +{ + core::Ptr res = threadOffset_raw(); + return res; +} + +inline ThreadLocations ThreadFeature::threadLocation() const +{ + ThreadLocations res = threadLocation_raw(); + return res; +} + +inline bool ThreadFeature::threadLocation(ThreadLocations value) +{ + return threadLocation_raw(value); +} + +inline core::Ptr ThreadFeature::threadInfo() const +{ + core::Ptr res = threadInfo_raw(); + return res; +} + +inline bool ThreadFeature::threadInfo(const core::Ptr& value) +{ + return threadInfo_raw(value.get()); +} + +inline bool ThreadFeature::isRightHanded() const +{ + bool res = isRightHanded_raw(); + return res; +} + +inline bool ThreadFeature::isRightHanded(bool value) +{ + return isRightHanded_raw(value); +} + +inline core::Ptr ThreadFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr ThreadFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr ThreadFeature::inputCylindricalFaces() const +{ + core::Ptr res = inputCylindricalFaces_raw(); + return res; +} + +inline bool ThreadFeature::inputCylindricalFaces(const core::Ptr& value) +{ + return inputCylindricalFaces_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_THREADFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ThreadFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/ThreadFeatureInput.h new file mode 100644 index 0000000..fa07cc8 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ThreadFeatureInput.h @@ -0,0 +1,247 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_THREADFEATUREINPUT_CPP__ +# define ADSK_FUSION_THREADFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_THREADFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_THREADFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class BRepFace; + class ThreadInfo; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a thread +/// feature. +class ThreadFeatureInput : public core::Base { +public: + + /// Gets and sets the threaded face. In the case where there are multiple faces, only the first one is returned. + /// Setting this results in a thread being applied to only a single face. + /// It is recommended that you use the inputCylindricalfaces property in order to have full access to the collection of faces + /// to be threaded. + core::Ptr inputCylindricalFace() const; + bool inputCylindricalFace(const core::Ptr& value); + + /// Gets and sets if the thread is physical or cosmetic thread. A value of true indicates a physical thread. + /// It defaults to false. + bool isModeled() const; + bool isModeled(bool value); + + /// Gets and sets if this thread is the full length of the cylinder. + /// It defaults to true. + bool isFullLength() const; + bool isFullLength(bool value); + + /// Gets and sets the thread length. + /// It is only used in the case where the isFullLength property is false. + core::Ptr threadLength() const; + bool threadLength(const core::Ptr& value); + + /// Gets and sets the thread offset. + /// The offset is the distance along the axis of the cylinder from the edge to the start of the thread. + /// It is only used in the case where the isFullLength property is false. + /// Returns nothing in the case where the feature is non-parametric. + core::Ptr threadOffset() const; + bool threadOffset(const core::Ptr& value); + + /// Gets and sets where the thread length is measured from. + /// This property is only used in the case where the isFullLength property is false. + ThreadLocations threadLocation() const; + bool threadLocation(ThreadLocations value); + + /// Gets and sets the thread data. + core::Ptr threadInfo() const; + bool threadInfo(const core::Ptr& value); + + /// Gets and sets if the thread is right or left-handed thread. A value of true indicates a right-handed thread. + /// It defaults to true. + bool isRightHanded() const; + bool isRightHanded(bool value); + + /// Gets and sets the cylindrical input faces. + core::Ptr inputCylindricalFaces() const; + bool inputCylindricalFaces(const core::Ptr& value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + ADSK_FUSION_THREADFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_THREADFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_THREADFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_THREADFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepFace* inputCylindricalFace_raw() const = 0; + virtual bool inputCylindricalFace_raw(BRepFace* value) = 0; + virtual bool isModeled_raw() const = 0; + virtual bool isModeled_raw(bool value) = 0; + virtual bool isFullLength_raw() const = 0; + virtual bool isFullLength_raw(bool value) = 0; + virtual core::ValueInput* threadLength_raw() const = 0; + virtual bool threadLength_raw(core::ValueInput* value) = 0; + virtual core::ValueInput* threadOffset_raw() const = 0; + virtual bool threadOffset_raw(core::ValueInput* value) = 0; + virtual ThreadLocations threadLocation_raw() const = 0; + virtual bool threadLocation_raw(ThreadLocations value) = 0; + virtual ThreadInfo* threadInfo_raw() const = 0; + virtual bool threadInfo_raw(ThreadInfo* value) = 0; + virtual bool isRightHanded_raw() const = 0; + virtual bool isRightHanded_raw(bool value) = 0; + virtual core::ObjectCollection* inputCylindricalFaces_raw() const = 0; + virtual bool inputCylindricalFaces_raw(core::ObjectCollection* value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr ThreadFeatureInput::inputCylindricalFace() const +{ + core::Ptr res = inputCylindricalFace_raw(); + return res; +} + +inline bool ThreadFeatureInput::inputCylindricalFace(const core::Ptr& value) +{ + return inputCylindricalFace_raw(value.get()); +} + +inline bool ThreadFeatureInput::isModeled() const +{ + bool res = isModeled_raw(); + return res; +} + +inline bool ThreadFeatureInput::isModeled(bool value) +{ + return isModeled_raw(value); +} + +inline bool ThreadFeatureInput::isFullLength() const +{ + bool res = isFullLength_raw(); + return res; +} + +inline bool ThreadFeatureInput::isFullLength(bool value) +{ + return isFullLength_raw(value); +} + +inline core::Ptr ThreadFeatureInput::threadLength() const +{ + core::Ptr res = threadLength_raw(); + return res; +} + +inline bool ThreadFeatureInput::threadLength(const core::Ptr& value) +{ + return threadLength_raw(value.get()); +} + +inline core::Ptr ThreadFeatureInput::threadOffset() const +{ + core::Ptr res = threadOffset_raw(); + return res; +} + +inline bool ThreadFeatureInput::threadOffset(const core::Ptr& value) +{ + return threadOffset_raw(value.get()); +} + +inline ThreadLocations ThreadFeatureInput::threadLocation() const +{ + ThreadLocations res = threadLocation_raw(); + return res; +} + +inline bool ThreadFeatureInput::threadLocation(ThreadLocations value) +{ + return threadLocation_raw(value); +} + +inline core::Ptr ThreadFeatureInput::threadInfo() const +{ + core::Ptr res = threadInfo_raw(); + return res; +} + +inline bool ThreadFeatureInput::threadInfo(const core::Ptr& value) +{ + return threadInfo_raw(value.get()); +} + +inline bool ThreadFeatureInput::isRightHanded() const +{ + bool res = isRightHanded_raw(); + return res; +} + +inline bool ThreadFeatureInput::isRightHanded(bool value) +{ + return isRightHanded_raw(value); +} + +inline core::Ptr ThreadFeatureInput::inputCylindricalFaces() const +{ + core::Ptr res = inputCylindricalFaces_raw(); + return res; +} + +inline bool ThreadFeatureInput::inputCylindricalFaces(const core::Ptr& value) +{ + return inputCylindricalFaces_raw(value.get()); +} + +inline core::Ptr ThreadFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool ThreadFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_THREADFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ThreadFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/ThreadFeatures.h new file mode 100644 index 0000000..90ef9a3 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ThreadFeatures.h @@ -0,0 +1,173 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_THREADFEATURES_CPP__ +# define ADSK_FUSION_THREADFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_THREADFEATURES_API +# endif +#else +# define ADSK_FUSION_THREADFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ThreadDataQuery; + class ThreadFeature; + class ThreadFeatureInput; + class ThreadInfo; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing thread features in a component +/// and supports the ability to create new thread features. +class ThreadFeatures : public core::Base { +public: + + /// Function that returns the specified thread feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of thread features in the collection. + size_t count() const; + + /// Property that returns the ThreadDataQuery object. When creating a thread, the type and size of the thread + /// is specified by referencing thread information defined in one of the XML files in the ThreadData folder. + /// The ThreadDataQuery is an object that supports methods to query the existing threads defined in these files. + core::Ptr threadDataQuery() const; + + /// Creates a ThreadFeatureInput object. This object is the API equivalent of the Thread feature dialog. It collects + /// the required input and once fully defined you can pass this object to the ThreadFeatures.add method to create + /// the thread feature. + /// inputCylindricalFaces : A single cylindrical BRep face or a collection of cylindrical BRep faces to thread. + /// A collection of faces must all be from either holes (for internal threading) or all from cylinders (for external threading). + /// Both internal and external threads cannot be created in the same feature. + /// The faces in a collection can come from different bodies or components. + /// threadInfo : The ThreadInfo object that defines the type and size of the thread to create. When creating a thread, the type and size + /// of the thread is specified by referencing thread information defined in one of the XML files in the ThreadData folder within + /// the Fusion 360 install folder. You can use the ThreadDataQuery object to query these XML files to find the specific thread you + /// want to create. The ThreadDataQuery object can be obtained by using the ThreadFeatures.threadDataQuery property. You then use + /// this information to create a ThreadInfo object using the ThreadFeatures.createThreadInfo method. + /// Returns the newly created ThreadFeatureInput object or null/None if the creation failed. + core::Ptr createInput(const core::Ptr& inputCylindricalFaces, const core::Ptr& threadInfo) const; + + /// Method that creates a new ThreadInfo object that can be used in creating thread features. + /// The ThreadInfo object that defines the type and size of the thread to create. When creating a thread, the type and size + /// of the thread is specified by referencing thread information defined in one of the XML files in the ThreadData folder within + /// the Fusion 360 install folder. You can use the ThreadDataQuery object to query these XML files to find the specific thread you + /// want to create. The ThreadDataQuery object can be obtained by using the ThreadFeatures.threadDataQuery property. + /// isInternal : Input Boolean that indicates if the thread is an internal or external thread. A value of true indicates an internal thread. + /// threadType : Input string that defines the thread type. + /// threadDesignation : Input string that contains the thread designation. + /// This is input as the full thread designation that will be used in a drawing for the thread call-out. + /// The nominal size and pitch information are extracted from the designation. + /// threadClass : Input string that defines the thread class. + /// Returns the newly created ThreadInfo object or null if the creation failed. + core::Ptr createThreadInfo(bool isInternal, const std::string& threadType, const std::string& threadDesignation, const std::string& threadClass) const; + + /// Creates a new thread feature. + /// input : A ThreadFeatureInput object that defines the desired thread. Use the createInput + /// method to create a new ThreadFeatureInput object and then use methods on it + /// (the ThreadFeatureInput object) to define the thread. + /// Returns the newly created ThreadFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified thread feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef ThreadFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_THREADFEATURES_API static const char* classType(); + ADSK_FUSION_THREADFEATURES_API const char* objectType() const override; + ADSK_FUSION_THREADFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_THREADFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ThreadFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual ThreadDataQuery* threadDataQuery_raw() const = 0; + virtual ThreadFeatureInput* createInput_raw(core::Base* inputCylindricalFaces, ThreadInfo* threadInfo) const = 0; + virtual ThreadInfo* createThreadInfo_raw(bool isInternal, const char * threadType, const char * threadDesignation, const char * threadClass) const = 0; + virtual ThreadFeature* add_raw(ThreadFeatureInput* input) = 0; + virtual ThreadFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr ThreadFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t ThreadFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr ThreadFeatures::threadDataQuery() const +{ + core::Ptr res = threadDataQuery_raw(); + return res; +} + +inline core::Ptr ThreadFeatures::createInput(const core::Ptr& inputCylindricalFaces, const core::Ptr& threadInfo) const +{ + core::Ptr res = createInput_raw(inputCylindricalFaces.get(), threadInfo.get()); + return res; +} + +inline core::Ptr ThreadFeatures::createThreadInfo(bool isInternal, const std::string& threadType, const std::string& threadDesignation, const std::string& threadClass) const +{ + core::Ptr res = createThreadInfo_raw(isInternal, threadType.c_str(), threadDesignation.c_str(), threadClass.c_str()); + return res; +} + +inline core::Ptr ThreadFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr ThreadFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void ThreadFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_THREADFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ThreadInfo.h b/usr/autodesk/CPP/include/Fusion/Features/ThreadInfo.h new file mode 100644 index 0000000..ab4980c --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ThreadInfo.h @@ -0,0 +1,210 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_THREADINFO_CPP__ +# define ADSK_FUSION_THREADINFO_API XI_EXPORT +# else +# define ADSK_FUSION_THREADINFO_API +# endif +#else +# define ADSK_FUSION_THREADINFO_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that define the type and size of a thread. This object is used +/// to create new thread features and to query and edit existing thread features. A new ThreadInfo object is created +/// by using the ThreadFeatures.createThreadInfo method. If the ThreadInfo object is obtained from an existing thread +/// feature, modifying properties on the ThreadInfo object will modify the feature. +class ThreadInfo : public core::Base { +public: + + /// Returns and sets the string that defines the thread type. + std::string threadType() const; + bool threadType(const std::string& value); + + /// Returns the string that defines the thread size. This is + std::string threadSize() const; + + /// Returns and sets the string that defines the thread designation. + std::string threadDesignation() const; + bool threadDesignation(const std::string& value); + + /// Returns and sets the string that defines the thread class. + std::string threadClass() const; + bool threadClass(const std::string& value); + + /// Returns and sets if the thread is an internal or external thread. A value of true indicates an internal thread. + /// It defaults to true. + bool isInternal() const; + bool isInternal(bool value); + + /// Returns the value that defines the thread angle. The units are degrees. + double threadAngle() const; + + /// Returns the value that defines the thread pitch. The units are centimeters. + double threadPitch() const; + + /// Returns the value that defines the major diameter. The units are centimeters. + double majorDiameter() const; + + /// Returns the value that defines the minor diameter. The units are centimeters. + double minorDiameter() const; + + /// Returns the value that defines the pitch diameter. The units are centimeters. + double pitchDiameter() const; + + ADSK_FUSION_THREADINFO_API static const char* classType(); + ADSK_FUSION_THREADINFO_API const char* objectType() const override; + ADSK_FUSION_THREADINFO_API void* queryInterface(const char* id) const override; + ADSK_FUSION_THREADINFO_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* threadType_raw() const = 0; + virtual bool threadType_raw(const char * value) = 0; + virtual char* threadSize_raw() const = 0; + virtual char* threadDesignation_raw() const = 0; + virtual bool threadDesignation_raw(const char * value) = 0; + virtual char* threadClass_raw() const = 0; + virtual bool threadClass_raw(const char * value) = 0; + virtual bool isInternal_raw() const = 0; + virtual bool isInternal_raw(bool value) = 0; + virtual double threadAngle_raw() const = 0; + virtual double threadPitch_raw() const = 0; + virtual double majorDiameter_raw() const = 0; + virtual double minorDiameter_raw() const = 0; + virtual double pitchDiameter_raw() const = 0; +}; + +// Inline wrappers + +inline std::string ThreadInfo::threadType() const +{ + std::string res; + + char* p= threadType_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool ThreadInfo::threadType(const std::string& value) +{ + return threadType_raw(value.c_str()); +} + +inline std::string ThreadInfo::threadSize() const +{ + std::string res; + + char* p= threadSize_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string ThreadInfo::threadDesignation() const +{ + std::string res; + + char* p= threadDesignation_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool ThreadInfo::threadDesignation(const std::string& value) +{ + return threadDesignation_raw(value.c_str()); +} + +inline std::string ThreadInfo::threadClass() const +{ + std::string res; + + char* p= threadClass_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool ThreadInfo::threadClass(const std::string& value) +{ + return threadClass_raw(value.c_str()); +} + +inline bool ThreadInfo::isInternal() const +{ + bool res = isInternal_raw(); + return res; +} + +inline bool ThreadInfo::isInternal(bool value) +{ + return isInternal_raw(value); +} + +inline double ThreadInfo::threadAngle() const +{ + double res = threadAngle_raw(); + return res; +} + +inline double ThreadInfo::threadPitch() const +{ + double res = threadPitch_raw(); + return res; +} + +inline double ThreadInfo::majorDiameter() const +{ + double res = majorDiameter_raw(); + return res; +} + +inline double ThreadInfo::minorDiameter() const +{ + double res = minorDiameter_raw(); + return res; +} + +inline double ThreadInfo::pitchDiameter() const +{ + double res = pitchDiameter_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_THREADINFO_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ThroughAllExtentDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/ThroughAllExtentDefinition.h new file mode 100644 index 0000000..75df57d --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ThroughAllExtentDefinition.h @@ -0,0 +1,80 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExtentDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_THROUGHALLEXTENTDEFINITION_CPP__ +# define ADSK_FUSION_THROUGHALLEXTENTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_THROUGHALLEXTENTDEFINITION_API +# endif +#else +# define ADSK_FUSION_THROUGHALLEXTENTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// A definition object that is used to define the extents of a feature to be through all. +class ThroughAllExtentDefinition : public ExtentDefinition { +public: + + /// Statically creates a new ThroughAllExtentDefinition object. This is used as input when + /// defining the extents of a feature to be through all. + /// Returns the newly created ThroughAllExtentDefinition or null in the case of a failure. + static core::Ptr create(); + + /// Gets and sets if the direction is positive or negative. A value of true indicates it is + /// in the same direction as the z direction of the profile's sketch plane. + /// This is only used when the extrusion is only defined in a single direction from the + /// profile plane. If it's a two sided extrusion, this value is ignored. + bool isPositiveDirection() const; + bool isPositiveDirection(bool value); + + ADSK_FUSION_THROUGHALLEXTENTDEFINITION_API static const char* classType(); + ADSK_FUSION_THROUGHALLEXTENTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_THROUGHALLEXTENTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_THROUGHALLEXTENTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_THROUGHALLEXTENTDEFINITION_API static ThroughAllExtentDefinition* create_raw(); + virtual bool isPositiveDirection_raw() const = 0; + virtual bool isPositiveDirection_raw(bool value) = 0; +}; + +// Inline wrappers + +inline core::Ptr ThroughAllExtentDefinition::create() +{ + core::Ptr res = create_raw(); + return res; +} + +inline bool ThroughAllExtentDefinition::isPositiveDirection() const +{ + bool res = isPositiveDirection_raw(); + return res; +} + +inline bool ThroughAllExtentDefinition::isPositiveDirection(bool value) +{ + return isPositiveDirection_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_THROUGHALLEXTENTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/ToEntityExtentDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/ToEntityExtentDefinition.h new file mode 100644 index 0000000..8587264 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/ToEntityExtentDefinition.h @@ -0,0 +1,159 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExtentDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TOENTITYEXTENTDEFINITION_CPP__ +# define ADSK_FUSION_TOENTITYEXTENTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_TOENTITYEXTENTDEFINITION_API +# endif +#else +# define ADSK_FUSION_TOENTITYEXTENTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class ValueInput; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// A definition object that is used to define the extents of a feature to be up to a specified +/// construction plane or face. +class ToEntityExtentDefinition : public ExtentDefinition { +public: + + /// Statically creates a new ToEntityExtentDefinition object. This is used as input when + /// defining the extents of a feature to be up to a construction plane or face. + /// entity : The construction plane or face that the feature extent it up to. + /// isChained : + /// offset : A optional input value that defines an offset distance of the entity that will be used + /// for the extent. Positive and negative values can be used to offset in both directions. + /// If this argument is not provided a value of zero will be used. + /// Returns the newly created ToEntityExtentDefinition object or null if the creation failed. + static core::Ptr create(const core::Ptr& entity, bool isChained, const core::Ptr& offset = core::Ptr()); + + /// Gets and sets the entity that the feature extent is defined up to. This can be a ConstructionPlane, Profile, BrepFace, + /// BrepBody, or BRepVertex. + core::Ptr entity() const; + bool entity(const core::Ptr& value); + + /// Returns the current offset. If the EntityExtentDefinition object has been created statically and isn't associated with + /// a feature this will return a ValueInput object. If the EntityExtentDefinition object is obtained from a feature this + /// will return a ModelParameter object. You can use properties of the parameter to edit it's value which will result in + /// the feature updating. + core::Ptr offset() const; + + /// Gets and sets whether connected faces to the input entity should also be used when calculating the extent or if the + /// input entity should be extended. A value of true indicates that connected entities should be used. + bool isChained() const; + bool isChained(bool value); + + /// Gets and sets a direction that is used when the result is ambiguous. For example, if you have a profile in + /// the center of a torus and are extruding to the torus, the extrusion can go in either direction. When needed, + /// this provides the information to tell Fusion 360 which direction to go. In most cases this is not needed and + /// the property will be null. + core::Ptr directionHint() const; + bool directionHint(const core::Ptr& value); + + /// Gets and sets if the minimum or maximum solution is calculated. This is only used when the input entity is + /// a body and defines if the extrusion to go to the near side (minimum solution) of the body or the far side. + /// When a new ToEntityExtentDefinition object is created, this property defaults to True. + bool isMinimumSolution() const; + bool isMinimumSolution(bool value); + + ADSK_FUSION_TOENTITYEXTENTDEFINITION_API static const char* classType(); + ADSK_FUSION_TOENTITYEXTENTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_TOENTITYEXTENTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TOENTITYEXTENTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_TOENTITYEXTENTDEFINITION_API static ToEntityExtentDefinition* create_raw(core::Base* entity, bool isChained, core::ValueInput* offset); + virtual core::Base* entity_raw() const = 0; + virtual bool entity_raw(core::Base* value) = 0; + virtual core::Base* offset_raw() const = 0; + virtual bool isChained_raw() const = 0; + virtual bool isChained_raw(bool value) = 0; + virtual core::Vector3D* directionHint_raw() const = 0; + virtual bool directionHint_raw(core::Vector3D* value) = 0; + virtual bool isMinimumSolution_raw() const = 0; + virtual bool isMinimumSolution_raw(bool value) = 0; +}; + +// Inline wrappers + +inline core::Ptr ToEntityExtentDefinition::create(const core::Ptr& entity, bool isChained, const core::Ptr& offset) +{ + core::Ptr res = create_raw(entity.get(), isChained, offset.get()); + return res; +} + +inline core::Ptr ToEntityExtentDefinition::entity() const +{ + core::Ptr res = entity_raw(); + return res; +} + +inline bool ToEntityExtentDefinition::entity(const core::Ptr& value) +{ + return entity_raw(value.get()); +} + +inline core::Ptr ToEntityExtentDefinition::offset() const +{ + core::Ptr res = offset_raw(); + return res; +} + +inline bool ToEntityExtentDefinition::isChained() const +{ + bool res = isChained_raw(); + return res; +} + +inline bool ToEntityExtentDefinition::isChained(bool value) +{ + return isChained_raw(value); +} + +inline core::Ptr ToEntityExtentDefinition::directionHint() const +{ + core::Ptr res = directionHint_raw(); + return res; +} + +inline bool ToEntityExtentDefinition::directionHint(const core::Ptr& value) +{ + return directionHint_raw(value.get()); +} + +inline bool ToEntityExtentDefinition::isMinimumSolution() const +{ + bool res = isMinimumSolution_raw(); + return res; +} + +inline bool ToEntityExtentDefinition::isMinimumSolution(bool value) +{ + return isMinimumSolution_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TOENTITYEXTENTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/TorusFeature.h b/usr/autodesk/CPP/include/Fusion/Features/TorusFeature.h new file mode 100644 index 0000000..c9dbd6a --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/TorusFeature.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TORUSFEATURE_CPP__ +# define ADSK_FUSION_TORUSFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_TORUSFEATURE_API +# endif +#else +# define ADSK_FUSION_TORUSFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Object that represents an existing torus feature in a design. +class TorusFeature : public Feature { +public: + + ADSK_FUSION_TORUSFEATURE_API static const char* classType(); + ADSK_FUSION_TORUSFEATURE_API const char* objectType() const override; + ADSK_FUSION_TORUSFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TORUSFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TORUSFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/TorusFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/TorusFeatures.h new file mode 100644 index 0000000..ab39069 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/TorusFeatures.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TORUSFEATURES_CPP__ +# define ADSK_FUSION_TORUSFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_TORUSFEATURES_API +# endif +#else +# define ADSK_FUSION_TORUSFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class TorusFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing torus features in a design. +class TorusFeatures : public core::Base { +public: + + /// Function that returns the specified torus feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified torus feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of torus features in the collection. + size_t count() const; + + typedef TorusFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_TORUSFEATURES_API static const char* classType(); + ADSK_FUSION_TORUSFEATURES_API const char* objectType() const override; + ADSK_FUSION_TORUSFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TORUSFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual TorusFeature* item_raw(size_t index) const = 0; + virtual TorusFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr TorusFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr TorusFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t TorusFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void TorusFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TORUSFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/TrimFeature.h b/usr/autodesk/CPP/include/Fusion/Features/TrimFeature.h new file mode 100644 index 0000000..b009db6 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/TrimFeature.h @@ -0,0 +1,126 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TRIMFEATURE_CPP__ +# define ADSK_FUSION_TRIMFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_TRIMFEATURE_API +# endif +#else +# define ADSK_FUSION_TRIMFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepCells; + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing trim feature in a design. +class TrimFeature : public Feature { +public: + + /// Gets and sets the entity (a patch body, B-Rep face, construction plane or sketch curve) that intersects the trim tool. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr trimTool() const; + bool trimTool(const core::Ptr& value); + + /// Gets the set of valid cells that have been calculated based on the current inputs. + /// To get this collection the model must be in the state it was when the feature + /// was initially computed, which means the timeline marker must be positioned to immediately + /// before this feature. + /// After changing any selected cells you must call the applyCellChanges method to update + /// the feature with the changes. + core::Ptr bRepCells() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// After making any changes to the set of selected cells you must call this method to + /// indicate all changes have been made and to apply those changes to the feature. + /// Returns true if the apply was successful. + bool applyCellChanges(); + + ADSK_FUSION_TRIMFEATURE_API static const char* classType(); + ADSK_FUSION_TRIMFEATURE_API const char* objectType() const override; + ADSK_FUSION_TRIMFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TRIMFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* trimTool_raw() const = 0; + virtual bool trimTool_raw(core::Base* value) = 0; + virtual BRepCells* bRepCells_raw() const = 0; + virtual TrimFeature* nativeObject_raw() const = 0; + virtual TrimFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual bool applyCellChanges_raw() = 0; +}; + +// Inline wrappers + +inline core::Ptr TrimFeature::trimTool() const +{ + core::Ptr res = trimTool_raw(); + return res; +} + +inline bool TrimFeature::trimTool(const core::Ptr& value) +{ + return trimTool_raw(value.get()); +} + +inline core::Ptr TrimFeature::bRepCells() const +{ + core::Ptr res = bRepCells_raw(); + return res; +} + +inline core::Ptr TrimFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr TrimFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline bool TrimFeature::applyCellChanges() +{ + bool res = applyCellChanges_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TRIMFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/TrimFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/TrimFeatureInput.h new file mode 100644 index 0000000..2924594 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/TrimFeatureInput.h @@ -0,0 +1,121 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TRIMFEATUREINPUT_CPP__ +# define ADSK_FUSION_TRIMFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_TRIMFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_TRIMFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BaseFeature; + class BRepCells; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a TrimFeatureInput. +class TrimFeatureInput : public core::Base { +public: + + /// Returns the collection of the valid cells that have been calculated based on the trim tool. + /// Use this collection to specify which cells to trim away. + core::Ptr bRepCells() const; + + /// Gets and sets the entity (a patch body, B-Rep face, construction plane or sketch curve) that intersects the trim tool + core::Ptr trimTool() const; + bool trimTool(const core::Ptr& value); + + /// When creating a feature that is owned by a base feature, set this property to the + /// base feature you want to associate the new feature with. By default, this is null, + /// meaning it will not be associated with a base feature. + /// Because of a current limitation, if you want to create a feature associated with a base + /// feature, you must set this property AND call the startEdit method of the base feature, + /// create the feature, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + core::Ptr targetBaseFeature() const; + bool targetBaseFeature(const core::Ptr& value); + + /// To determine the possible boundaries and allow you to choose which cells to keep, the trim + /// feature does a partial compute when the input object is created. To do this it starts a trim + /// feature transaction and completes the transaction when you call the add method. If you don't + /// call the add method it leaves Fusion 360 in a bad state and there will be undo problems and it + /// will possibly crash. If you have created a TrimFeatureInput object and don't want to finish + /// the feature creation, you need to call the cancel method on the TrimFeatureInput object to + /// safely abort the current trim feature transaction. + bool cancel(); + + ADSK_FUSION_TRIMFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_TRIMFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_TRIMFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TRIMFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual BRepCells* bRepCells_raw() const = 0; + virtual core::Base* trimTool_raw() const = 0; + virtual bool trimTool_raw(core::Base* value) = 0; + virtual BaseFeature* targetBaseFeature_raw() const = 0; + virtual bool targetBaseFeature_raw(BaseFeature* value) = 0; + virtual bool cancel_raw() = 0; +}; + +// Inline wrappers + +inline core::Ptr TrimFeatureInput::bRepCells() const +{ + core::Ptr res = bRepCells_raw(); + return res; +} + +inline core::Ptr TrimFeatureInput::trimTool() const +{ + core::Ptr res = trimTool_raw(); + return res; +} + +inline bool TrimFeatureInput::trimTool(const core::Ptr& value) +{ + return trimTool_raw(value.get()); +} + +inline core::Ptr TrimFeatureInput::targetBaseFeature() const +{ + core::Ptr res = targetBaseFeature_raw(); + return res; +} + +inline bool TrimFeatureInput::targetBaseFeature(const core::Ptr& value) +{ + return targetBaseFeature_raw(value.get()); +} + +inline bool TrimFeatureInput::cancel() +{ + bool res = cancel_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TRIMFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/TrimFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/TrimFeatures.h new file mode 100644 index 0000000..0a5084e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/TrimFeatures.h @@ -0,0 +1,137 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TRIMFEATURES_CPP__ +# define ADSK_FUSION_TRIMFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_TRIMFEATURES_API +# endif +#else +# define ADSK_FUSION_TRIMFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class TrimFeature; + class TrimFeatureInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing trim features in a component +/// and supports the ability to create new trim features. +class TrimFeatures : public core::Base { +public: + + /// Function that returns the specified trim feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of trim features in the collection. + size_t count() const; + + /// Creates a TrimFeatureInput object. Use properties and methods on this object + /// to define the trim feature you want to create and then use the Add method, passing in + /// the TrimFeatureInput object. + /// To determine the possible boundaries and allow you to choose which cells to keep, the trim + /// feature does a partial compute when the input object is created. To do this it starts a trim + /// feature transaction and completes the transaction when you call the add method. If you don't call + /// the add method to finish the transaction it leaves Fusion 360 in a bad state and there will be undo + /// problems and possibly a crash. If you have created a TrimFeatureInput object and don't want to + /// finish the feature creation, you need to call the cancel method on the TrimFeatureInput object to + /// safely abort the current boundary fill transaction. + /// trimTool : A patch body, B-Rep face, construction plane or sketch curve that intersects the surface or surfaces to be trimmed + /// Returns the newly created TrimFeatureInput object or null if the creation failed. + core::Ptr createInput(const core::Ptr& trimTool) const; + + /// Creates a new trim feature. + /// input : A TrimFeatureInput object that defines the desired trim feature. Use the createInput + /// method to create a new TrimFeatureInput object and then use methods on it + /// (the TrimFeatureInput object) to define the trim feature. + /// Returns the newly created TrimFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified trim feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef TrimFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_TRIMFEATURES_API static const char* classType(); + ADSK_FUSION_TRIMFEATURES_API const char* objectType() const override; + ADSK_FUSION_TRIMFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TRIMFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual TrimFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual TrimFeatureInput* createInput_raw(core::Base* trimTool) const = 0; + virtual TrimFeature* add_raw(TrimFeatureInput* input) = 0; + virtual TrimFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr TrimFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t TrimFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr TrimFeatures::createInput(const core::Ptr& trimTool) const +{ + core::Ptr res = createInput_raw(trimTool.get()); + return res; +} + +inline core::Ptr TrimFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr TrimFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void TrimFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TRIMFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/TwoDistancesChamferEdgeSet.h b/usr/autodesk/CPP/include/Fusion/Features/TwoDistancesChamferEdgeSet.h new file mode 100644 index 0000000..8bbc958 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/TwoDistancesChamferEdgeSet.h @@ -0,0 +1,117 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ChamferEdgeSet.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TWODISTANCESCHAMFEREDGESET_CPP__ +# define ADSK_FUSION_TWODISTANCESCHAMFEREDGESET_API XI_EXPORT +# else +# define ADSK_FUSION_TWODISTANCESCHAMFEREDGESET_API +# endif +#else +# define ADSK_FUSION_TWODISTANCESCHAMFEREDGESET_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the edges and the parameters associated with a two distances chamfer. +class TwoDistancesChamferEdgeSet : public ChamferEdgeSet { +public: + + /// Gets and sets the edges that will be chamfered. This collection can contain BRepEdge, BRepFace, + /// and Feature objects. If BRepFace or Feature are objects are provided, all of the edges associated + /// with those objects will be chamfered. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr edges() const; + bool edges(const core::Ptr& value); + + /// Returns the model parameter that controls the first offset distance of the chamfer. + /// You can edit the distance by using the properties on the returned ModelParameter object. + core::Ptr distanceOne() const; + + /// Returns the model parameter that controls the first offset distance of the chamfer. + /// You can edit the distance by using the properties on the returned ModelParameter object. + core::Ptr distanceTwo() const; + + /// Gets and sets if the chamfer is flipped. This swaps the directions for distance one and two. + /// To set this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + bool isFlipped() const; + bool isFlipped(bool value); + + ADSK_FUSION_TWODISTANCESCHAMFEREDGESET_API static const char* classType(); + ADSK_FUSION_TWODISTANCESCHAMFEREDGESET_API const char* objectType() const override; + ADSK_FUSION_TWODISTANCESCHAMFEREDGESET_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TWODISTANCESCHAMFEREDGESET_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* edges_raw() const = 0; + virtual bool edges_raw(core::ObjectCollection* value) = 0; + virtual ModelParameter* distanceOne_raw() const = 0; + virtual ModelParameter* distanceTwo_raw() const = 0; + virtual bool isFlipped_raw() const = 0; + virtual bool isFlipped_raw(bool value) = 0; +}; + +// Inline wrappers + +inline core::Ptr TwoDistancesChamferEdgeSet::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline bool TwoDistancesChamferEdgeSet::edges(const core::Ptr& value) +{ + return edges_raw(value.get()); +} + +inline core::Ptr TwoDistancesChamferEdgeSet::distanceOne() const +{ + core::Ptr res = distanceOne_raw(); + return res; +} + +inline core::Ptr TwoDistancesChamferEdgeSet::distanceTwo() const +{ + core::Ptr res = distanceTwo_raw(); + return res; +} + +inline bool TwoDistancesChamferEdgeSet::isFlipped() const +{ + bool res = isFlipped_raw(); + return res; +} + +inline bool TwoDistancesChamferEdgeSet::isFlipped(bool value) +{ + return isFlipped_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TWODISTANCESCHAMFEREDGESET_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/TwoDistancesChamferTypeDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/TwoDistancesChamferTypeDefinition.h new file mode 100644 index 0000000..ccca92f --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/TwoDistancesChamferTypeDefinition.h @@ -0,0 +1,74 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ChamferTypeDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TWODISTANCESCHAMFERTYPEDEFINITION_CPP__ +# define ADSK_FUSION_TWODISTANCESCHAMFERTYPEDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_TWODISTANCESCHAMFERTYPEDEFINITION_API +# endif +#else +# define ADSK_FUSION_TWODISTANCESCHAMFERTYPEDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; +}} + +namespace adsk { namespace fusion { + +/// Provides information to create a chamfer that is defined by a two distances from the edge. +class TwoDistancesChamferTypeDefinition : public ChamferTypeDefinition { +public: + + /// Returns the parameter controlling the first distance. You can edit the distance + /// by editing the value of the parameter object. + core::Ptr distanceOne() const; + + /// Returns the parameter controlling the second distance. You can edit the distance + /// by editing the value of the parameter object. + core::Ptr distanceTwo() const; + + ADSK_FUSION_TWODISTANCESCHAMFERTYPEDEFINITION_API static const char* classType(); + ADSK_FUSION_TWODISTANCESCHAMFERTYPEDEFINITION_API const char* objectType() const override; + ADSK_FUSION_TWODISTANCESCHAMFERTYPEDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TWODISTANCESCHAMFERTYPEDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ModelParameter* distanceOne_raw() const = 0; + virtual ModelParameter* distanceTwo_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr TwoDistancesChamferTypeDefinition::distanceOne() const +{ + core::Ptr res = distanceOne_raw(); + return res; +} + +inline core::Ptr TwoDistancesChamferTypeDefinition::distanceTwo() const +{ + core::Ptr res = distanceTwo_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TWODISTANCESCHAMFERTYPEDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/TwoSidesAngleExtentDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/TwoSidesAngleExtentDefinition.h new file mode 100644 index 0000000..d5bcb14 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/TwoSidesAngleExtentDefinition.h @@ -0,0 +1,75 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExtentDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TWOSIDESANGLEEXTENTDEFINITION_CPP__ +# define ADSK_FUSION_TWOSIDESANGLEEXTENTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_TWOSIDESANGLEEXTENTDEFINITION_API +# endif +#else +# define ADSK_FUSION_TWOSIDESANGLEEXTENTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; +}} + +namespace adsk { namespace fusion { + +/// Defines the inputs for a TwoSidesAngleExtentDefinition object. +/// This feature extent type defines the extents of the feature using angle extents on two sides. +class TwoSidesAngleExtentDefinition : public ExtentDefinition { +public: + + /// Gets the ModelParameter that defines the angle on the first side. + /// The value of the angle can be edited by using the properties on the ModelParameter object to edit the parameter. + core::Ptr angleOne() const; + + /// Gets the ModelParameter that defines the angle on the second side. + /// The value of the angle can be edited by using the properties on the ModelParameter object to edit the parameter. + core::Ptr angleTwo() const; + + ADSK_FUSION_TWOSIDESANGLEEXTENTDEFINITION_API static const char* classType(); + ADSK_FUSION_TWOSIDESANGLEEXTENTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_TWOSIDESANGLEEXTENTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TWOSIDESANGLEEXTENTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ModelParameter* angleOne_raw() const = 0; + virtual ModelParameter* angleTwo_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr TwoSidesAngleExtentDefinition::angleOne() const +{ + core::Ptr res = angleOne_raw(); + return res; +} + +inline core::Ptr TwoSidesAngleExtentDefinition::angleTwo() const +{ + core::Ptr res = angleTwo_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TWOSIDESANGLEEXTENTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/TwoSidesDistanceExtentDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/TwoSidesDistanceExtentDefinition.h new file mode 100644 index 0000000..a6cf249 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/TwoSidesDistanceExtentDefinition.h @@ -0,0 +1,73 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExtentDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TWOSIDESDISTANCEEXTENTDEFINITION_CPP__ +# define ADSK_FUSION_TWOSIDESDISTANCEEXTENTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_TWOSIDESDISTANCEEXTENTDEFINITION_API +# endif +#else +# define ADSK_FUSION_TWOSIDESDISTANCEEXTENTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; +}} + +namespace adsk { namespace fusion { + +/// Defines the inputs for a TwoSidesDistanceExtentDefinition object. +/// This defines a feature extent where the distance in each direction can be a different value. +class TwoSidesDistanceExtentDefinition : public ExtentDefinition { +public: + + /// Gets the ModelParameter that defines the first distance + core::Ptr distanceOne() const; + + /// Gets the ModelParameter that defines the second distance + core::Ptr distanceTwo() const; + + ADSK_FUSION_TWOSIDESDISTANCEEXTENTDEFINITION_API static const char* classType(); + ADSK_FUSION_TWOSIDESDISTANCEEXTENTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_TWOSIDESDISTANCEEXTENTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TWOSIDESDISTANCEEXTENTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ModelParameter* distanceOne_raw() const = 0; + virtual ModelParameter* distanceTwo_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr TwoSidesDistanceExtentDefinition::distanceOne() const +{ + core::Ptr res = distanceOne_raw(); + return res; +} + +inline core::Ptr TwoSidesDistanceExtentDefinition::distanceTwo() const +{ + core::Ptr res = distanceTwo_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TWOSIDESDISTANCEEXTENTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/TwoSidesToExtentDefinition.h b/usr/autodesk/CPP/include/Fusion/Features/TwoSidesToExtentDefinition.h new file mode 100644 index 0000000..060f779 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/TwoSidesToExtentDefinition.h @@ -0,0 +1,102 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExtentDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TWOSIDESTOEXTENTDEFINITION_CPP__ +# define ADSK_FUSION_TWOSIDESTOEXTENTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_TWOSIDESTOEXTENTDEFINITION_API +# endif +#else +# define ADSK_FUSION_TWOSIDESTOEXTENTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Defines the inputs for a TwoSidesToExtentDefinition object +/// This defines a feature extent where the extents of feature go up to faces or construction planes in both directions. +class TwoSidesToExtentDefinition : public ExtentDefinition { +public: + + /// Gets and sets the entity that defines the extent on side one. The valid types of entities can vary depending on + /// the type of feature this is being used with. + core::Ptr toEntityOne() const; + bool toEntityOne(const core::Ptr& value); + + /// Gets and sets the entity that defines the extent on side two. The valid types of entities can vary depending on + /// the type of feature this is being used with. + core::Ptr toEntityTwo() const; + bool toEntityTwo(const core::Ptr& value); + + /// Gets and sets whether the toEntity is extended to fully intersect the extrusion. + bool matchShape() const; + bool matchShape(bool value); + + ADSK_FUSION_TWOSIDESTOEXTENTDEFINITION_API static const char* classType(); + ADSK_FUSION_TWOSIDESTOEXTENTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_TWOSIDESTOEXTENTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TWOSIDESTOEXTENTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* toEntityOne_raw() const = 0; + virtual bool toEntityOne_raw(core::Base* value) = 0; + virtual core::Base* toEntityTwo_raw() const = 0; + virtual bool toEntityTwo_raw(core::Base* value) = 0; + virtual bool matchShape_raw() const = 0; + virtual bool matchShape_raw(bool value) = 0; +}; + +// Inline wrappers + +inline core::Ptr TwoSidesToExtentDefinition::toEntityOne() const +{ + core::Ptr res = toEntityOne_raw(); + return res; +} + +inline bool TwoSidesToExtentDefinition::toEntityOne(const core::Ptr& value) +{ + return toEntityOne_raw(value.get()); +} + +inline core::Ptr TwoSidesToExtentDefinition::toEntityTwo() const +{ + core::Ptr res = toEntityTwo_raw(); + return res; +} + +inline bool TwoSidesToExtentDefinition::toEntityTwo(const core::Ptr& value) +{ + return toEntityTwo_raw(value.get()); +} + +inline bool TwoSidesToExtentDefinition::matchShape() const +{ + bool res = matchShape_raw(); + return res; +} + +inline bool TwoSidesToExtentDefinition::matchShape(bool value) +{ + return matchShape_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TWOSIDESTOEXTENTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/UnfoldFeature.h b/usr/autodesk/CPP/include/Fusion/Features/UnfoldFeature.h new file mode 100644 index 0000000..33e5cce --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/UnfoldFeature.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_UNFOLDFEATURE_CPP__ +# define ADSK_FUSION_UNFOLDFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_UNFOLDFEATURE_API +# endif +#else +# define ADSK_FUSION_UNFOLDFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Object that represents an existing unfold feature in a design. +class UnfoldFeature : public Feature { +public: + + ADSK_FUSION_UNFOLDFEATURE_API static const char* classType(); + ADSK_FUSION_UNFOLDFEATURE_API const char* objectType() const override; + ADSK_FUSION_UNFOLDFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_UNFOLDFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_UNFOLDFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/UnfoldFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/UnfoldFeatures.h new file mode 100644 index 0000000..eff6857 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/UnfoldFeatures.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_UNFOLDFEATURES_CPP__ +# define ADSK_FUSION_UNFOLDFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_UNFOLDFEATURES_API +# endif +#else +# define ADSK_FUSION_UNFOLDFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class UnfoldFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing unfold features in a design. +class UnfoldFeatures : public core::Base { +public: + + /// Function that returns the specified unfold feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of unfold features in the collection. + size_t count() const; + + /// Function that returns the specified unfold feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef UnfoldFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_UNFOLDFEATURES_API static const char* classType(); + ADSK_FUSION_UNFOLDFEATURES_API const char* objectType() const override; + ADSK_FUSION_UNFOLDFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_UNFOLDFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual UnfoldFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual UnfoldFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr UnfoldFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t UnfoldFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr UnfoldFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void UnfoldFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_UNFOLDFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/UnstitchFeature.h b/usr/autodesk/CPP/include/Fusion/Features/UnstitchFeature.h new file mode 100644 index 0000000..a4f7358 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/UnstitchFeature.h @@ -0,0 +1,122 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_UNSTITCHFEATURE_CPP__ +# define ADSK_FUSION_UNSTITCHFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_UNSTITCHFEATURE_API +# endif +#else +# define ADSK_FUSION_UNSTITCHFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing Unstitch feature in a design. +class UnstitchFeature : public Feature { +public: + + /// Sets the faces and/or bodies to be unstiched. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// faces : The faces and/or bodies to Unstitch. Individual faces can be unstitched from solids and/or patch bodies. + /// The faces being unstitched need not all come from the same body. + /// isChainSelection : A boolean value for setting whether or not faces that are connected and adjacent to + /// the input faces will be included in the selection. The default value is true. + /// Returns true if successful. + bool setInputFaces(const core::Ptr& faces, bool isChainSelection = true) const; + + /// Gets the faces that were input to be unstitched. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr inputFaces() const; + + /// A boolean value for setting whether or not faces that are connected and adjacent to + /// the input faces will be included in the selection. The default value is true. + bool isChainSelection() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_UNSTITCHFEATURE_API static const char* classType(); + ADSK_FUSION_UNSTITCHFEATURE_API const char* objectType() const override; + ADSK_FUSION_UNSTITCHFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_UNSTITCHFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool setInputFaces_raw(core::ObjectCollection* faces, bool isChainSelection) const = 0; + virtual core::ObjectCollection* inputFaces_raw() const = 0; + virtual bool isChainSelection_raw() const = 0; + virtual UnstitchFeature* nativeObject_raw() const = 0; + virtual UnstitchFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline bool UnstitchFeature::setInputFaces(const core::Ptr& faces, bool isChainSelection) const +{ + bool res = setInputFaces_raw(faces.get(), isChainSelection); + return res; +} + +inline core::Ptr UnstitchFeature::inputFaces() const +{ + core::Ptr res = inputFaces_raw(); + return res; +} + +inline bool UnstitchFeature::isChainSelection() const +{ + bool res = isChainSelection_raw(); + return res; +} + +inline core::Ptr UnstitchFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr UnstitchFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_UNSTITCHFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/UnstitchFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/UnstitchFeatures.h new file mode 100644 index 0000000..5c9750e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/UnstitchFeatures.h @@ -0,0 +1,119 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_UNSTITCHFEATURES_CPP__ +# define ADSK_FUSION_UNSTITCHFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_UNSTITCHFEATURES_API +# endif +#else +# define ADSK_FUSION_UNSTITCHFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class UnstitchFeature; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing Unstitch features in a component +/// and supports the ability to create new Unstitch features. +class UnstitchFeatures : public core::Base { +public: + + /// Function that returns the specified Unstitch feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of Unstitch features in the collection. + size_t count() const; + + /// Creates a new Unstitch feature. + /// faces : The faces and/or bodies to Unstitch. Individual faces can be unstitched from solid and/or patch bodies. The faces being unstitched + /// need not all come from the same body. + /// isChainSelection : A boolean value for setting whether or not faces that are connected and adjacent to + /// the input faces will be included in the selection. The default value is true. + /// Returns the newly created UnstitchFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& faces, bool isChainSelection = true); + + /// Function that returns the specified unstitch feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef UnstitchFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_UNSTITCHFEATURES_API static const char* classType(); + ADSK_FUSION_UNSTITCHFEATURES_API const char* objectType() const override; + ADSK_FUSION_UNSTITCHFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_UNSTITCHFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual UnstitchFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual UnstitchFeature* add_raw(core::ObjectCollection* faces, bool isChainSelection) = 0; + virtual UnstitchFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr UnstitchFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t UnstitchFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr UnstitchFeatures::add(const core::Ptr& faces, bool isChainSelection) +{ + core::Ptr res = add_raw(faces.get(), isChainSelection); + return res; +} + +inline core::Ptr UnstitchFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void UnstitchFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_UNSTITCHFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/UntrimFeature.h b/usr/autodesk/CPP/include/Fusion/Features/UntrimFeature.h new file mode 100644 index 0000000..747eb95 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/UntrimFeature.h @@ -0,0 +1,183 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "Feature.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_UNTRIMFEATURE_CPP__ +# define ADSK_FUSION_UNTRIMFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_UNTRIMFEATURE_API +# endif +#else +# define ADSK_FUSION_UNTRIMFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepFace; + class BRepLoop; + class ModelParameter; + class Occurrence; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an existing Untrim feature in a design. +class UntrimFeature : public Feature { +public: + + /// Gets the loop type that was untrimmed. To change the trim type, use one of the redefine methods. + UntrimLoopTypes untrimLoopType() const; + + /// Gets the face objects to untrim. + /// Returns null/None in the case where loops are specified instead of faces. + std::vector> facesToUntrim() const; + + /// Set the loops to be removed from a set of faces. + /// faces : An array of BRepFace objects that will have the loops of the specified types removed. + /// Only loops that do not have a connected face can be removed (the edges in the loop have a single face). + /// The array can only contain faces from surface bodies, (the isSolid property of the BRepBody returns false). + /// untrimLoopType : The loop type to be untrimmed (AllLoopUntrimType, InternalLoopUntrimType, or ExternalLoopUntrimType). + /// Returns whether the operation was successful + bool redefineLoopsFromFaces(const std::vector>& faces, UntrimLoopTypes untrimLoopType); + + /// Gets the loop objects to untrim. + /// Returns null/None in the case where faces are specified instead of loops + std::vector> loopsToUntrim() const; + + /// Set the loops to be removed. + /// loops : Input the entities that define loops to remove. + /// Only loops that do not have a connected face can be removed (the edges in the loop have a single face) + /// The array can only contain loops from surface bodies, (the isSolid property of the BRepBody returns false). + /// Returns whether the operation was successful + bool redefineLoops(const std::vector>& loops); + + /// Gets the ModelParameter that defines the extension distance used to extend external boundaries. + /// This can return null in the case where only internal boundaries have been removed. + /// The value can be edited by using the properties of the returned ModelParameter object. + core::Ptr extensionDistance() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this is not the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_UNTRIMFEATURE_API static const char* classType(); + ADSK_FUSION_UNTRIMFEATURE_API const char* objectType() const override; + ADSK_FUSION_UNTRIMFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_UNTRIMFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual UntrimLoopTypes untrimLoopType_raw() const = 0; + virtual BRepFace** facesToUntrim_raw(size_t& return_size) const = 0; + virtual bool redefineLoopsFromFaces_raw(BRepFace** faces, size_t faces_size, UntrimLoopTypes untrimLoopType) = 0; + virtual BRepLoop** loopsToUntrim_raw(size_t& return_size) const = 0; + virtual bool redefineLoops_raw(BRepLoop** loops, size_t loops_size) = 0; + virtual ModelParameter* extensionDistance_raw() const = 0; + virtual UntrimFeature* nativeObject_raw() const = 0; + virtual UntrimFeature* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline UntrimLoopTypes UntrimFeature::untrimLoopType() const +{ + UntrimLoopTypes res = untrimLoopType_raw(); + return res; +} + +inline std::vector> UntrimFeature::facesToUntrim() const +{ + std::vector> res; + size_t s; + + BRepFace** p= facesToUntrim_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool UntrimFeature::redefineLoopsFromFaces(const std::vector>& faces, UntrimLoopTypes untrimLoopType) +{ + BRepFace** faces_ = new BRepFace*[faces.size()]; + for(size_t i=0; i> UntrimFeature::loopsToUntrim() const +{ + std::vector> res; + size_t s; + + BRepLoop** p= loopsToUntrim_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool UntrimFeature::redefineLoops(const std::vector>& loops) +{ + BRepLoop** loops_ = new BRepLoop*[loops.size()]; + for(size_t i=0; i UntrimFeature::extensionDistance() const +{ + core::Ptr res = extensionDistance_raw(); + return res; +} + +inline core::Ptr UntrimFeature::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr UntrimFeature::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_UNTRIMFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/UntrimFeatureInput.h b/usr/autodesk/CPP/include/Fusion/Features/UntrimFeatureInput.h new file mode 100644 index 0000000..8506004 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/UntrimFeatureInput.h @@ -0,0 +1,163 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_UNTRIMFEATUREINPUT_CPP__ +# define ADSK_FUSION_UNTRIMFEATUREINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_UNTRIMFEATUREINPUT_API +# endif +#else +# define ADSK_FUSION_UNTRIMFEATUREINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepFace; + class BRepLoop; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// This class defines the methods and properties that pertain to the definition of a Untrim feature. +class UntrimFeatureInput : public core::Base { +public: + + /// Gets the loop type to be untrimmed. This is only used when faces are being untrimmed and is ignored for loops. + UntrimLoopTypes untrimLoopType() const; + + /// Gets the face objects to untrim. + /// Returns null/None in the case where loops are specified instead of faces. + std::vector> facesToUntrim() const; + + /// Set the loops to be removed from a set of faces. + /// faces : An array of BRepFace objects that will have the loops of the specified types removed. + /// Only loops that do not have a connected face can be removed (the edges in the loop have a single face). + /// The array can only contain faces from surface bodies, (the isSolid property of the BRepBody returns false). + /// untrimLoopType : The loop type to be untrimmed (AllLoopUntrimType, InternalLoopUntrimType, or ExternalLoopUntrimType). + /// Returns whether the operation was successful + bool setLoopsFromFaces(const std::vector>& faces, UntrimLoopTypes untrimLoopType); + + /// Gets the loop objects to untrim. + /// Returns null/None in the case where faces are specified instead of loops + std::vector> loopsToUntrim() const; + + /// Set the loops to be removed. + /// loops : Redefines this input to remove loops from the body. If faces were previously defined, that information will be lost. + /// Only loops that do not have a connected face can be removed (the edges in the loop have a single face) + /// The array can only contain loops from surface bodies, (the isSolid property of the BRepBody returns false). + /// Returns whether the operation was successful + bool setLoops(const std::vector>& loops); + + /// Gets and sets the ValueInput object that defines the extension distance applied to faces when an + /// external boundary is removed. + core::Ptr extensionDistance() const; + bool extensionDistance(const core::Ptr& value); + + ADSK_FUSION_UNTRIMFEATUREINPUT_API static const char* classType(); + ADSK_FUSION_UNTRIMFEATUREINPUT_API const char* objectType() const override; + ADSK_FUSION_UNTRIMFEATUREINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_UNTRIMFEATUREINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual UntrimLoopTypes untrimLoopType_raw() const = 0; + virtual BRepFace** facesToUntrim_raw(size_t& return_size) const = 0; + virtual bool setLoopsFromFaces_raw(BRepFace** faces, size_t faces_size, UntrimLoopTypes untrimLoopType) = 0; + virtual BRepLoop** loopsToUntrim_raw(size_t& return_size) const = 0; + virtual bool setLoops_raw(BRepLoop** loops, size_t loops_size) = 0; + virtual core::ValueInput* extensionDistance_raw() const = 0; + virtual bool extensionDistance_raw(core::ValueInput* value) = 0; +}; + +// Inline wrappers + +inline UntrimLoopTypes UntrimFeatureInput::untrimLoopType() const +{ + UntrimLoopTypes res = untrimLoopType_raw(); + return res; +} + +inline std::vector> UntrimFeatureInput::facesToUntrim() const +{ + std::vector> res; + size_t s; + + BRepFace** p= facesToUntrim_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool UntrimFeatureInput::setLoopsFromFaces(const std::vector>& faces, UntrimLoopTypes untrimLoopType) +{ + BRepFace** faces_ = new BRepFace*[faces.size()]; + for(size_t i=0; i> UntrimFeatureInput::loopsToUntrim() const +{ + std::vector> res; + size_t s; + + BRepLoop** p= loopsToUntrim_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool UntrimFeatureInput::setLoops(const std::vector>& loops) +{ + BRepLoop** loops_ = new BRepLoop*[loops.size()]; + for(size_t i=0; i UntrimFeatureInput::extensionDistance() const +{ + core::Ptr res = extensionDistance_raw(); + return res; +} + +inline bool UntrimFeatureInput::extensionDistance(const core::Ptr& value) +{ + return extensionDistance_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_UNTRIMFEATUREINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/UntrimFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/UntrimFeatures.h new file mode 100644 index 0000000..75bee0b --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/UntrimFeatures.h @@ -0,0 +1,165 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_UNTRIMFEATURES_CPP__ +# define ADSK_FUSION_UNTRIMFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_UNTRIMFEATURES_API +# endif +#else +# define ADSK_FUSION_UNTRIMFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepFace; + class BRepLoop; + class UntrimFeature; + class UntrimFeatureInput; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing Untrim features in a component +/// and supports the ability to create new Untrim features. +class UntrimFeatures : public core::Base { +public: + + /// Function that returns the specified Untrim feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of Untrim features in the collection. + size_t count() const; + + /// Creates a UntrimFeatureInput object that defines the input needed to create a untrim feature. Use the input + /// object to define the input to create the desired feature and then use the Add method, passing in the UntrimFeatureInput object. + /// faces : An array of BRepFace objects that will have the loops of the specified type removed. + /// Only loops that do not have a connected face can be removed (the edges in the loop have a single face). + /// The array can only contain faces from surface bodies, (the isSolid property of the BRepBody returns false). + /// untrimLoopType : The loop type to be untrimmed (AllLoopUntrimType, InternalLoopUntrimType, or ExternalLoopUntrimType). + /// extensionDistance : If the untrim loop type is AllLoopUntrimType or ExternalLoopUntrimType the untrimmed faces can be extended by a specified distance. + /// Returns the newly created UntrimFeatureInput object or null if the creation failed. + core::Ptr createInputFromFaces(const std::vector>& faces, UntrimLoopTypes untrimLoopType, const core::Ptr& extensionDistance = NULL) const; + + /// Creates a UntrimFeatureInput object that defines the input needed to create a untrim feature. Use the input + /// object to define the input to create the desired feature and then use the Add method, passing in the UntrimFeatureInput object. + /// loops : Input the entities that define loops to remove. + /// Only loops that do not have a connected face can be removed (the edges in the loop have a single face) + /// The array can only contain loops from surface bodies, (the isSolid property of the BRepBody returns false). + /// extensionDistance : If an external boundary is removed the untrimmed face can be extended by a specified distance. + /// Returns the newly created UntrimFeatureInput object or null if the creation failed. + core::Ptr createInputFromLoops(const std::vector>& loops, const core::Ptr& extensionDistance = NULL) const; + + /// Creates a new Untrim feature. + /// input : An UntrimFeatureInput object that defines the desired Untrim feature. Use the createInput + /// method to create a new UntrimFeatureInput object and then use methods on it + /// (the UntrimFeatureInput object) to define the desired options for the Untrim feature. + /// Returns the newly created UntrimFeature object or null if the creation failed. + core::Ptr add(const core::Ptr& input); + + /// Function that returns the specified Untrim feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + typedef UntrimFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_UNTRIMFEATURES_API static const char* classType(); + ADSK_FUSION_UNTRIMFEATURES_API const char* objectType() const override; + ADSK_FUSION_UNTRIMFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_UNTRIMFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual UntrimFeature* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual UntrimFeatureInput* createInputFromFaces_raw(BRepFace** faces, size_t faces_size, UntrimLoopTypes untrimLoopType, core::ValueInput* extensionDistance) const = 0; + virtual UntrimFeatureInput* createInputFromLoops_raw(BRepLoop** loops, size_t loops_size, core::ValueInput* extensionDistance) const = 0; + virtual UntrimFeature* add_raw(UntrimFeatureInput* input) = 0; + virtual UntrimFeature* itemByName_raw(const char * name) const = 0; +}; + +// Inline wrappers + +inline core::Ptr UntrimFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t UntrimFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr UntrimFeatures::createInputFromFaces(const std::vector>& faces, UntrimLoopTypes untrimLoopType, const core::Ptr& extensionDistance) const +{ + BRepFace** faces_ = new BRepFace*[faces.size()]; + for(size_t i=0; i res = createInputFromFaces_raw(faces_, faces.size(), untrimLoopType, extensionDistance.get()); + delete[] faces_; + return res; +} + +inline core::Ptr UntrimFeatures::createInputFromLoops(const std::vector>& loops, const core::Ptr& extensionDistance) const +{ + BRepLoop** loops_ = new BRepLoop*[loops.size()]; + for(size_t i=0; i res = createInputFromLoops_raw(loops_, loops.size(), extensionDistance.get()); + delete[] loops_; + return res; +} + +inline core::Ptr UntrimFeatures::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr UntrimFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +template inline void UntrimFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_UNTRIMFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/VariableRadiusFilletEdgeSet.h b/usr/autodesk/CPP/include/Fusion/Features/VariableRadiusFilletEdgeSet.h new file mode 100644 index 0000000..e12c28a --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/VariableRadiusFilletEdgeSet.h @@ -0,0 +1,158 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "FilletEdgeSet.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_VARIABLERADIUSFILLETEDGESET_CPP__ +# define ADSK_FUSION_VARIABLERADIUSFILLETEDGESET_API XI_EXPORT +# else +# define ADSK_FUSION_VARIABLERADIUSFILLETEDGESET_API +# endif +#else +# define ADSK_FUSION_VARIABLERADIUSFILLETEDGESET_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; + class ParameterList; +}} +namespace adsk { namespace core { + class ObjectCollection; + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the edges and the parameters associated with a variable radius fillet. +class VariableRadiusFilletEdgeSet : public FilletEdgeSet { +public: + + /// Gets and sets the edges that will be filleted. + /// To use this property, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + core::Ptr edges() const; + bool edges(const core::Ptr& value); + + /// Returns the model parameter that controls the start radius of the fillet. You can edit + /// the start radius by using the properties on the returned ModelParameter object. + core::Ptr startRadius() const; + + /// Returns the model parameter that controls the end radius of the fillet. You can edit + /// the end radius by using the properties on the returned ModelParameter object. + core::Ptr endRadius() const; + + /// Returns a list of model parameters that control radius of the fillet at each position defined along the edge set. + /// You can edit any of these radii by using the properties on its returned ModelParameter object. This list does + /// not include the parameters for the start and end radii. Use the startRadius and endRadius properties to get those. + core::Ptr midRadii() const; + + /// Returns a list of model parameters that control the location of each mid point radius. These positions are defined + /// from 0 to 1 where 0 is at the start of the edge and 1 is at the end. You can edit any of these positions by + /// using the properties on its returned ModelParameter object. + core::Ptr midPositions() const; + + /// Creates a new mid position radius on the variable radius edge set. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// position : The position where the new radius is to be created. This is a value between 0 and 1 where 0 is at the start of the + /// edge and 1 is at the end. If the ValueInput uses a real then it is interpreted as a unitless value. If it is a string + /// then it must resolve to a unitless value. + /// radius : A ValueInput object that defines the radius at the defined position. If the ValueInput uses a real + /// then it is interpreted as centimeters. If it is a string then the units can be defined as part of + /// the string (i.e. "2 in"). If no units are specified it will be interpreted using the current + /// default units for length. + /// Returns true if successful. + bool addMidPosition(const core::Ptr& position, const core::Ptr& radius); + + /// Deletes the specified mid position from the variable radius fillet. + /// To use this method, you need to position the timeline marker to immediately before this feature. + /// This can be accomplished using the following code: thisFeature.timelineObject.rollTo(True) + /// positionIndex : The index of the mid position to delete. The points are in the order they appear along the edge + /// where the first point has an index of 0. The number of mid positions and their locations can be + /// obtained by getting the list of mid positions using the midPositions property. + /// Returns true if successful. + bool deleteMidPosition(size_t positionIndex); + + ADSK_FUSION_VARIABLERADIUSFILLETEDGESET_API static const char* classType(); + ADSK_FUSION_VARIABLERADIUSFILLETEDGESET_API const char* objectType() const override; + ADSK_FUSION_VARIABLERADIUSFILLETEDGESET_API void* queryInterface(const char* id) const override; + ADSK_FUSION_VARIABLERADIUSFILLETEDGESET_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* edges_raw() const = 0; + virtual bool edges_raw(core::ObjectCollection* value) = 0; + virtual ModelParameter* startRadius_raw() const = 0; + virtual ModelParameter* endRadius_raw() const = 0; + virtual ParameterList* midRadii_raw() const = 0; + virtual ParameterList* midPositions_raw() const = 0; + virtual bool addMidPosition_raw(core::ValueInput* position, core::ValueInput* radius) = 0; + virtual bool deleteMidPosition_raw(size_t positionIndex) = 0; +}; + +// Inline wrappers + +inline core::Ptr VariableRadiusFilletEdgeSet::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline bool VariableRadiusFilletEdgeSet::edges(const core::Ptr& value) +{ + return edges_raw(value.get()); +} + +inline core::Ptr VariableRadiusFilletEdgeSet::startRadius() const +{ + core::Ptr res = startRadius_raw(); + return res; +} + +inline core::Ptr VariableRadiusFilletEdgeSet::endRadius() const +{ + core::Ptr res = endRadius_raw(); + return res; +} + +inline core::Ptr VariableRadiusFilletEdgeSet::midRadii() const +{ + core::Ptr res = midRadii_raw(); + return res; +} + +inline core::Ptr VariableRadiusFilletEdgeSet::midPositions() const +{ + core::Ptr res = midPositions_raw(); + return res; +} + +inline bool VariableRadiusFilletEdgeSet::addMidPosition(const core::Ptr& position, const core::Ptr& radius) +{ + bool res = addMidPosition_raw(position.get(), radius.get()); + return res; +} + +inline bool VariableRadiusFilletEdgeSet::deleteMidPosition(size_t positionIndex) +{ + bool res = deleteMidPosition_raw(positionIndex); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_VARIABLERADIUSFILLETEDGESET_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/WebFeature.h b/usr/autodesk/CPP/include/Fusion/Features/WebFeature.h new file mode 100644 index 0000000..be5543f --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/WebFeature.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Feature.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_WEBFEATURE_CPP__ +# define ADSK_FUSION_WEBFEATURE_API XI_EXPORT +# else +# define ADSK_FUSION_WEBFEATURE_API +# endif +#else +# define ADSK_FUSION_WEBFEATURE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Object that represents an existing web feature in a design. +class WebFeature : public Feature { +public: + + ADSK_FUSION_WEBFEATURE_API static const char* classType(); + ADSK_FUSION_WEBFEATURE_API const char* objectType() const override; + ADSK_FUSION_WEBFEATURE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_WEBFEATURE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_WEBFEATURE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Features/WebFeatures.h b/usr/autodesk/CPP/include/Fusion/Features/WebFeatures.h new file mode 100644 index 0000000..f7efc81 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Features/WebFeatures.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_WEBFEATURES_CPP__ +# define ADSK_FUSION_WEBFEATURES_API XI_EXPORT +# else +# define ADSK_FUSION_WEBFEATURES_API +# endif +#else +# define ADSK_FUSION_WEBFEATURES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class WebFeature; +}} + +namespace adsk { namespace fusion { + +/// Collection that provides access to all of the existing web features in a design. +class WebFeatures : public core::Base { +public: + + /// Function that returns the specified web feature using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified web feature using the name of the feature. + /// name : The name of the feature within the collection to return. This is the name seen in the timeline. + /// Returns the specified item or null if the specified name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// The number of web features in the collection. + size_t count() const; + + typedef WebFeature iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_WEBFEATURES_API static const char* classType(); + ADSK_FUSION_WEBFEATURES_API const char* objectType() const override; + ADSK_FUSION_WEBFEATURES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_WEBFEATURES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual WebFeature* item_raw(size_t index) const = 0; + virtual WebFeature* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr WebFeatures::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr WebFeatures::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t WebFeatures::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void WebFeatures::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_WEBFEATURES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/AreaProperties.h b/usr/autodesk/CPP/include/Fusion/Fusion/AreaProperties.h new file mode 100644 index 0000000..566cfe9 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/AreaProperties.h @@ -0,0 +1,188 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_AREAPROPERTIES_CPP__ +# define ADSK_FUSION_AREAPROPERTIES_API XI_EXPORT +# else +# define ADSK_FUSION_AREAPROPERTIES_API +# endif +#else +# define ADSK_FUSION_AREAPROPERTIES_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Point3D; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// The Area properties of a sketch profile or planar surface. +class AreaProperties : public core::Base { +public: + + /// Gets the area in the square centimeters. + double area() const; + + /// Gets the centroid where the units are centimeters. + /// The Location is relative to the sketch origin for a profile or relative to the world coordinate system for a planar face. + core::Ptr centroid() const; + + /// Gets the perimeter in centimeters. + /// The perimeter is the sum of the length of all the curves or edges of the profile or planar surface + double perimeter() const; + + /// Gets the angle of rotation of the principal axes. + double rotationToPrincipal() const; + + /// Returns the accuracy that was used for the calculation. + CalculationAccuracy accuracy() const; + + /// Method that returns the principal axes. + /// xAxis : The output Vector3D object that indicates the direction of the x axis. + /// yAxis : The output Vector3D object that indicates the direction of the y axis. + /// Returns true if successful + bool getPrincipalAxes(core::Ptr& xAxis, core::Ptr& yAxis) const; + + /// Method that, for a sketch, returns the moments of inertia about the sketch origin. + /// For a planar face, this method returns the moments about the world coordinate system origin. + /// Unit for returned values is kg/cm^2. + /// ixx : Output Double that returns the XX partial moment. + /// iyy : Output Double that returns the YY partial moment. + /// izz : Output Double that returns the ZZ partial moment. + /// ixy : Output Double that returns the XY partial moment. + /// iyz : Output Double that returns the YZ partial moment. + /// ixz : Output Double that returns the XZ partial moment. + /// Returns true if successful + bool getMomentsOfInertia(double& ixx, double& iyy, double& izz, double& ixy, double& iyz, double& ixz) const; + + /// Method that returns the moments of inertia about the centroid. Unit for returned values is kg/cm^2. + /// ixx : Output Double that returns the XX partial moment. + /// iyy : Output Double that returns the YY partial moment. + /// izz : Output Double that returns the ZZ partial moment. + /// ixy : Output Double that returns the XY partial moment. + /// iyz : Output Double that returns the YZ partial moment. + /// ixz : Output Double that returns the XZ partial moment. + /// Returns true if successful + bool getCentroidMomentsOfInertia(double& ixx, double& iyy, double& izz, double& ixy, double& iyz, double& ixz) const; + + /// Method that returns the moments of inertia about the principal axes. Unit for returned values is kg/cm^2. + /// i1 : Output Double that specifies the first moment of inertia. + /// i2 : Output Double that specifies the second moment of inertia. + /// i3 : Output Double that specifies the third moment of inertia. + /// Returns true if successful + bool getPrincipalMomentsOfInertia(double& i1, double& i2, double& i3) const; + + /// Method that returns the radius of gyration about the principal axes. Unit for returned values is cm. + /// kxx : Output Double that returns the X partial radius of gyration. + /// kyy : Output Double that returns the Y partial radius of gyration. + /// kzz : Output Double that returns the Z partial radius of gyration. + /// Returns true if successful + bool getRadiusOfGyration(double& kxx, double& kyy, double& kzz) const; + + ADSK_FUSION_AREAPROPERTIES_API static const char* classType(); + ADSK_FUSION_AREAPROPERTIES_API const char* objectType() const override; + ADSK_FUSION_AREAPROPERTIES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_AREAPROPERTIES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual double area_raw() const = 0; + virtual core::Point3D* centroid_raw() const = 0; + virtual double perimeter_raw() const = 0; + virtual double rotationToPrincipal_raw() const = 0; + virtual CalculationAccuracy accuracy_raw() const = 0; + virtual bool getPrincipalAxes_raw(core::Vector3D*& xAxis, core::Vector3D*& yAxis) const = 0; + virtual bool getMomentsOfInertia_raw(double& ixx, double& iyy, double& izz, double& ixy, double& iyz, double& ixz) const = 0; + virtual bool getCentroidMomentsOfInertia_raw(double& ixx, double& iyy, double& izz, double& ixy, double& iyz, double& ixz) const = 0; + virtual bool getPrincipalMomentsOfInertia_raw(double& i1, double& i2, double& i3) const = 0; + virtual bool getRadiusOfGyration_raw(double& kxx, double& kyy, double& kzz) const = 0; +}; + +// Inline wrappers + +inline double AreaProperties::area() const +{ + double res = area_raw(); + return res; +} + +inline core::Ptr AreaProperties::centroid() const +{ + core::Ptr res = centroid_raw(); + return res; +} + +inline double AreaProperties::perimeter() const +{ + double res = perimeter_raw(); + return res; +} + +inline double AreaProperties::rotationToPrincipal() const +{ + double res = rotationToPrincipal_raw(); + return res; +} + +inline CalculationAccuracy AreaProperties::accuracy() const +{ + CalculationAccuracy res = accuracy_raw(); + return res; +} + +inline bool AreaProperties::getPrincipalAxes(core::Ptr& xAxis, core::Ptr& yAxis) const +{ + core::Vector3D* xAxis_ = nullptr; + core::Vector3D* yAxis_ = nullptr; + + bool res = getPrincipalAxes_raw(xAxis_, yAxis_); + xAxis = xAxis_; + yAxis = yAxis_; + return res; +} + +inline bool AreaProperties::getMomentsOfInertia(double& ixx, double& iyy, double& izz, double& ixy, double& iyz, double& ixz) const +{ + bool res = getMomentsOfInertia_raw(ixx, iyy, izz, ixy, iyz, ixz); + return res; +} + +inline bool AreaProperties::getCentroidMomentsOfInertia(double& ixx, double& iyy, double& izz, double& ixy, double& iyz, double& ixz) const +{ + bool res = getCentroidMomentsOfInertia_raw(ixx, iyy, izz, ixy, iyz, ixz); + return res; +} + +inline bool AreaProperties::getPrincipalMomentsOfInertia(double& i1, double& i2, double& i3) const +{ + bool res = getPrincipalMomentsOfInertia_raw(i1, i2, i3); + return res; +} + +inline bool AreaProperties::getRadiusOfGyration(double& kxx, double& kyy, double& kzz) const +{ + bool res = getRadiusOfGyration_raw(kxx, kyy, kzz); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_AREAPROPERTIES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/BooleanParameterValue.h b/usr/autodesk/CPP/include/Fusion/Fusion/BooleanParameterValue.h new file mode 100644 index 0000000..805c9b0 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/BooleanParameterValue.h @@ -0,0 +1,65 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ParameterValue.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_BOOLEANPARAMETERVALUE_CPP__ +# define ADSK_FUSION_BOOLEANPARAMETERVALUE_API XI_EXPORT +# else +# define ADSK_FUSION_BOOLEANPARAMETERVALUE_API +# endif +#else +# define ADSK_FUSION_BOOLEANPARAMETERVALUE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// A parameter value that is a boolean. +class BooleanParameterValue : public ParameterValue { +public: + + /// Get or set the value of the parameter. + bool value() const; + bool value(bool value); + + ADSK_FUSION_BOOLEANPARAMETERVALUE_API static const char* classType(); + ADSK_FUSION_BOOLEANPARAMETERVALUE_API const char* objectType() const override; + ADSK_FUSION_BOOLEANPARAMETERVALUE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_BOOLEANPARAMETERVALUE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool value_raw() const = 0; + virtual bool value_raw(bool value) = 0; +}; + +// Inline wrappers + +inline bool BooleanParameterValue::value() const +{ + bool res = value_raw(); + return res; +} + +inline bool BooleanParameterValue::value(bool value) +{ + return value_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_BOOLEANPARAMETERVALUE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/C3MFExportOptions.h b/usr/autodesk/CPP/include/Fusion/Fusion/C3MFExportOptions.h new file mode 100644 index 0000000..dcf5d67 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/C3MFExportOptions.h @@ -0,0 +1,239 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "ExportOptions.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_C3MFEXPORTOPTIONS_CPP__ +# define ADSK_FUSION_C3MFEXPORTOPTIONS_API XI_EXPORT +# else +# define ADSK_FUSION_C3MFEXPORTOPTIONS_API +# endif +#else +# define ADSK_FUSION_C3MFEXPORTOPTIONS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Defines that a 3MF export is to be done and specifies the various options. +class C3MFExportOptions : public ExportOptions { +public: + + /// If the input is an Occurrence or the root Component, this specifies if a single file should be created containing + /// all of the bodies within that occurrence or component or if multiple files should be created; one for each body. + /// If multiple files are created, the body name is appended to the filename. The default is false. + bool isOneFilePerBody() const; + bool isOneFilePerBody(bool value); + + /// Gets and sets the current simple mesh refinement settings. Setting this property + /// will reset the surfaceDeviation, normalDeviation, maximumEdgeLength, and aspectRatio + /// to values that correspond to the specified mesh refinement. The default is MeshRefinementMedium + MeshRefinementSettings meshRefinement() const; + bool meshRefinement(MeshRefinementSettings value); + + /// Gets and sets the current surface deviation, or the distance the mesh can deviate + /// from the actual surface. This is defined in centimeter. Setting this property + /// will automatically set the meshRefinement to MeshRefinementCustom. The default is the value + /// associated with medium mesh refinement. + double surfaceDeviation() const; + bool surfaceDeviation(double value); + + /// Gets and sets the current normal deviation, or the angle the mesh normals at the vertices can deviate + /// from the actual surface normals. This is defined in radians. Setting this property + /// will automatically set the meshRefinement to MeshRefinementCustom. The default is the value + /// associated with medium mesh refinement. + double normalDeviation() const; + bool normalDeviation(double value); + + /// Gets and sets the maximum length of any mesh edge. This is defined in centimeter. Setting this property + /// will automatically set the meshRefinement to MeshRefinementCustom. The default is the value + /// associated with medium mesh refinement. + double maximumEdgeLength() const; + bool maximumEdgeLength(double value); + + /// Gets and sets the minimum aspect ratio for that triangles that are generated for the mesh. Setting this property + /// will automatically set the meshRefinement to MeshRefinementCustom. The default is the value + /// associated with medium mesh refinement. + double aspectRatio() const; + bool aspectRatio(double value); + + /// Returns a list of the known available print utilities. These strings can be used to set the PrintUtility + /// property to specify which print utility to open the 3MF file in. + std::vector availablePrintUtilities() const; + + /// Specifies which print utility to use when opening the 3MF file if the sendToPrintUtility property is true. + /// The value of this property can be one of the strings returned by the availalbePrintUtilities property, which + /// will specify one of the know print utilities. You can also specify a custom print utility by specifying + /// the full path to the print utility executable. The default value of this property is the last setting specified + /// in the user-interface. + std::string printUtility() const; + bool printUtility(const std::string& value); + + /// Gets and sets whether the created 3MF file will be sent to the print utility specified by the printUtility property. If this + /// is false a filename must be defined. + bool sendToPrintUtility() const; + bool sendToPrintUtility(bool value); + + ADSK_FUSION_C3MFEXPORTOPTIONS_API static const char* classType(); + ADSK_FUSION_C3MFEXPORTOPTIONS_API const char* objectType() const override; + ADSK_FUSION_C3MFEXPORTOPTIONS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_C3MFEXPORTOPTIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool isOneFilePerBody_raw() const = 0; + virtual bool isOneFilePerBody_raw(bool value) = 0; + virtual MeshRefinementSettings meshRefinement_raw() const = 0; + virtual bool meshRefinement_raw(MeshRefinementSettings value) = 0; + virtual double surfaceDeviation_raw() const = 0; + virtual bool surfaceDeviation_raw(double value) = 0; + virtual double normalDeviation_raw() const = 0; + virtual bool normalDeviation_raw(double value) = 0; + virtual double maximumEdgeLength_raw() const = 0; + virtual bool maximumEdgeLength_raw(double value) = 0; + virtual double aspectRatio_raw() const = 0; + virtual bool aspectRatio_raw(double value) = 0; + virtual char** availablePrintUtilities_raw(size_t& return_size) const = 0; + virtual char* printUtility_raw() const = 0; + virtual bool printUtility_raw(const char * value) = 0; + virtual bool sendToPrintUtility_raw() const = 0; + virtual bool sendToPrintUtility_raw(bool value) = 0; +}; + +// Inline wrappers + +inline bool C3MFExportOptions::isOneFilePerBody() const +{ + bool res = isOneFilePerBody_raw(); + return res; +} + +inline bool C3MFExportOptions::isOneFilePerBody(bool value) +{ + return isOneFilePerBody_raw(value); +} + +inline MeshRefinementSettings C3MFExportOptions::meshRefinement() const +{ + MeshRefinementSettings res = meshRefinement_raw(); + return res; +} + +inline bool C3MFExportOptions::meshRefinement(MeshRefinementSettings value) +{ + return meshRefinement_raw(value); +} + +inline double C3MFExportOptions::surfaceDeviation() const +{ + double res = surfaceDeviation_raw(); + return res; +} + +inline bool C3MFExportOptions::surfaceDeviation(double value) +{ + return surfaceDeviation_raw(value); +} + +inline double C3MFExportOptions::normalDeviation() const +{ + double res = normalDeviation_raw(); + return res; +} + +inline bool C3MFExportOptions::normalDeviation(double value) +{ + return normalDeviation_raw(value); +} + +inline double C3MFExportOptions::maximumEdgeLength() const +{ + double res = maximumEdgeLength_raw(); + return res; +} + +inline bool C3MFExportOptions::maximumEdgeLength(double value) +{ + return maximumEdgeLength_raw(value); +} + +inline double C3MFExportOptions::aspectRatio() const +{ + double res = aspectRatio_raw(); + return res; +} + +inline bool C3MFExportOptions::aspectRatio(double value) +{ + return aspectRatio_raw(value); +} + +inline std::vector C3MFExportOptions::availablePrintUtilities() const +{ + std::vector res; + size_t s; + + char** p= availablePrintUtilities_raw(s); + if(p) + { + res.resize(s); + for(size_t i=0; i +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CHOICEPARAMETERVALUE_CPP__ +# define ADSK_FUSION_CHOICEPARAMETERVALUE_API XI_EXPORT +# else +# define ADSK_FUSION_CHOICEPARAMETERVALUE_API +# endif +#else +# define ADSK_FUSION_CHOICEPARAMETERVALUE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// A parameter value that is a list of choices. +class ChoiceParameterValue : public ParameterValue { +public: + + /// Method that returns the list of available choices. + /// names : An array of the names of the choices. These coincide with the array of possible values returned by the values argument. + /// values : An array of the possible values. These coincide with the array of names returned by the names argument. + /// Returns true if the call was successful. + bool getChoices(std::vector& names, std::vector& values); + + /// Get or set the value of the parameter. + /// This value will correspond to one of the available values of the parameter. + std::string value() const; + bool value(const std::string& value); + + ADSK_FUSION_CHOICEPARAMETERVALUE_API static const char* classType(); + ADSK_FUSION_CHOICEPARAMETERVALUE_API const char* objectType() const override; + ADSK_FUSION_CHOICEPARAMETERVALUE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CHOICEPARAMETERVALUE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool getChoices_raw(char**& names, size_t& names_size, char**& values, size_t& values_size) = 0; + virtual char* value_raw() const = 0; + virtual bool value_raw(const char * value) = 0; +}; + +// Inline wrappers + +inline bool ChoiceParameterValue::getChoices(std::vector& names, std::vector& values) +{ + char** names_ = nullptr; + size_t names_size; + char** values_ = nullptr; + size_t values_size; + + bool res = getChoices_raw(names_, names_size, values_, values_size); + if(names_) + { + names.resize( names_size); + for(size_t i=0; i< names_size; ++i) + { + char* pChar = names_[i]; + if(pChar) + names[i] = pChar; + core::DeallocateArray(pChar); + } + core::DeallocateArray(names_); + } + if(values_) + { + values.resize( values_size); + for(size_t i=0; i< values_size; ++i) + { + char* pChar = values_[i]; + if(pChar) + values[i] = pChar; + core::DeallocateArray(pChar); + } + core::DeallocateArray(values_); + } + return res; +} + +inline std::string ChoiceParameterValue::value() const +{ + std::string res; + + char* p= value_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool ChoiceParameterValue::value(const std::string& value) +{ + return value_raw(value.c_str()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CHOICEPARAMETERVALUE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/Design.h b/usr/autodesk/CPP/include/Fusion/Fusion/Design.h new file mode 100644 index 0000000..fbad98a --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/Design.h @@ -0,0 +1,415 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "../../Core/Application/Product.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_DESIGN_CPP__ +# define ADSK_FUSION_DESIGN_API XI_EXPORT +# else +# define ADSK_FUSION_DESIGN_API +# endif +#else +# define ADSK_FUSION_DESIGN_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class AreaProperties; + class Component; + class Components; + class ContactSets; + class ExportManager; + class FusionUnitsManager; + class InterferenceInput; + class InterferenceResults; + class Occurrence; + class ParameterList; + class PhysicalProperties; + class Snapshots; + class Timeline; + class UserParameters; +}} +namespace adsk { namespace core { + class Appearances; + class Materials; + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Object that represents an open Fusion 360 design. This derives from the +/// Design base class and adds the Fusion 360 specific functionality. +class Design : public core::Product { +public: + + /// Gets and sets the current design type (DirectDesignType or ParametricDesignType) + /// Changing an existing design from ParametricDesignType to DirectDesignType will result in the timeline and all design + /// history being removed and further operations will not be captured in the timeline. + DesignTypes designType() const; + bool designType(DesignTypes value); + + /// Returns the root Component + core::Ptr rootComponent() const; + + /// Returns the Components collection that provides access to existing components + /// in a design + core::Ptr allComponents() const; + + /// Returns the current edit target as seen in the user interface. This edit target + /// is defined as the container object that will be added to if something is created. + /// For example, a component can be an edit target so that when new bodies are created they + /// are added to that component. A sketch can also be an edit target. + core::Ptr activeEditObject() const; + + /// Returns the component that is current being edited. This can return the root component + /// or another component within the design. + core::Ptr activeComponent() const; + + /// Returns the Snapshots object associated with this design which provides access to the + /// existing snapshots and the creation of new snapshots. + core::Ptr snapshots() const; + + /// Returns the timeline associated with this design. + core::Ptr timeline() const; + + /// Returns the collection of User Parameters in a design + core::Ptr userParameters() const; + + /// Returns a read only list of all parameters in the design. This includes + /// the user parameters and model parameters from all components in this design. The parameters from Externally Referenced components + /// are NOT included because they are in actuality, separate designs. + core::Ptr allParameters() const; + + /// Returns a specialized UnitsManager that can set the default length units and work + /// with parameters. + core::Ptr fusionUnitsManager() const; + + /// Returns the ExportManager for this design. You use the ExportManager + /// to export the current design in various formats. + core::Ptr exportManager() const; + + /// Gets whether the root component is the active edit target in the user interface. + /// This is the same as checking the state of the radio button next to the root component in the browser. + /// To activate the root component use the ActivateRootComponent method. + bool isRootComponentActive() const; + + /// Makes the root component the active component in the user interface. This is the same + /// as enabling the radio button next to the root component in the browser. + /// Returns true if the activation was successful. + bool activateRootComponent(); + + /// Returns the materials contained in this document. + core::Ptr materials() const; + + /// Returns the appearances contained in this document. + core::Ptr appearances() const; + + /// Creates an InterferenceInput object. This object collects the entities and options that are + /// used when calculating interference. To analyze interference you first create an InterferenceInput + /// supplying the entities and set any other settings and then provide this object as input to the + /// analyzeInterference method. + /// entities : An ObjectCollection containing the BRepBody and/or Occurrence entities that will be used in the + /// interference calculation. All entities must be in the context of the root component of the top-level design. + /// Returns an InterferenceInput object which you can use to set any other interference settings and then + /// use as input to the analyzeInterference method to calculate the interference. Returns null if the + /// creation failed. + core::Ptr createInterferenceInput(const core::Ptr& entities); + + /// Calculates the interference between the input bodies and/or occurrences. + /// input : An InterferenceInput that defines all of the necessary input needed to calculate the interference. + /// An InterferenceInput object is created using the createInterferenceInput method. + /// Returns an InterferenceResults object that can be used to examine the interference results. + core::Ptr analyzeInterference(const core::Ptr& input); + + /// Returns the occurrence that is currently activated, if any. This can return null in the case + /// where no occurrence is activated and the root component is active. + core::Ptr activeOccurrence() const; + + /// Returns the AreaProperties object that has properties for getting the area, perimeter, centroid, etc + /// for a collection of 2D sketch profiles and/or planar surfaces that all lie on the same plane. + /// inputs : A collection of one or more 2D sketch profile and/or planar surface input objects to perform the calculations on. + /// Supported input object types are 2D closed sketch profiles and planar surfaces. Object must all lie on the same plane. + /// Calculation results reflect the sums of the input objects (i.e. total area of multiple sketch profiles) + /// accuracy : Specifies the desired level of computational accuracy of the property calculations. + /// The default value of 'LowCalculationAccuracy' returns results within a +/- 1% error margin. + /// Returns an AreaProperties object that can be used to examine the area results. + core::Ptr areaProperties(const core::Ptr& inputs, CalculationAccuracy accuracy = adsk::fusion::LowCalculationAccuracy) const; + + /// Returns the PhysicalProperties object that has properties for getting the area, density, mass, volume, moments, etc + /// for a collection of 3D solid objects. + /// inputs : A collection of one or more 3D solid input objects to perform the calculations on. + /// Supported input object types are Components, Occurrences and BRepBodies. + /// Calculation results reflect the sums of the input objects (i.e. total volume of multiple bodies) + /// accuracy : Specifies the desired level of computational accuracy of the property calculations. + /// The default value of 'LowCalculationAccuracy' returns results within a +/- 1% error margin. + core::Ptr physicalProperties(const core::Ptr& inputs, CalculationAccuracy accuracy = adsk::fusion::LowCalculationAccuracy) const; + + /// Returns the contact sets associated with this design. + core::Ptr contactSets() const; + + /// Gets and sets whether contact analysis is enabled for all components. This + /// is the equivalent of the "Disable Contact / Enable Contact" command. If this + /// if True then any contact analysis defined (either all or contact sets) is enabled. + /// if False, then no contact analysis is performed. + bool isContactAnalysisEnabled() const; + bool isContactAnalysisEnabled(bool value); + + /// Gets and sets whether contact analysis is done using contact sets + /// or between all bodies, independent of any contact sets. If True and + /// the isContactAnalysisEnabled property is True then contact analysis + /// is performed using contact sets. If False and isContactAnalysisEnabled + /// is True, then contact analysis is performed between all bodies. If + /// isContactAnalysisEnabled is False then no contact analysis is performed. + bool isContactSetAnalysis() const; + bool isContactSetAnalysis(bool value); + + /// Returns the entities associated with the provided token. The return is an + /// array of entities. In most cases an array containing a single entity will be returned but + /// there are cases where more than one entity can be returned. An example of this + /// is where a token is obtained from a face and subsequent modeling operations cause + /// the face to be split into two or more pieces. All of the faces that represent + /// the original face will be returned with the first face being the most logical + /// match to the original face. + /// entityToken : The input entity token you want to find the matching entity for. + /// Returns an array of entities associated with the provided token, or an empty array + /// in the case where there are no matches. + std::vector> findEntityByToken(const std::string& entityToken); + + /// Forces a recompute of the entire design. This is the equivalent of the "Compute All" + /// command. + /// Returns true if the compute completed. This doesn't indicate if all the items in the + /// timeline successfully computed or not. You need to check the health state of each item + /// in the timeline to determine if everything successfully computed or not. + bool computeAll(); + + ADSK_FUSION_DESIGN_API static const char* classType(); + ADSK_FUSION_DESIGN_API const char* objectType() const override; + ADSK_FUSION_DESIGN_API void* queryInterface(const char* id) const override; + ADSK_FUSION_DESIGN_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual DesignTypes designType_raw() const = 0; + virtual bool designType_raw(DesignTypes value) = 0; + virtual Component* rootComponent_raw() const = 0; + virtual Components* allComponents_raw() const = 0; + virtual core::Base* activeEditObject_raw() const = 0; + virtual Component* activeComponent_raw() const = 0; + virtual Snapshots* snapshots_raw() const = 0; + virtual Timeline* timeline_raw() const = 0; + virtual UserParameters* userParameters_raw() const = 0; + virtual ParameterList* allParameters_raw() const = 0; + virtual FusionUnitsManager* fusionUnitsManager_raw() const = 0; + virtual ExportManager* exportManager_raw() const = 0; + virtual bool isRootComponentActive_raw() const = 0; + virtual bool activateRootComponent_raw() = 0; + virtual core::Materials* materials_raw() const = 0; + virtual core::Appearances* appearances_raw() const = 0; + virtual InterferenceInput* createInterferenceInput_raw(core::ObjectCollection* entities) = 0; + virtual InterferenceResults* analyzeInterference_raw(InterferenceInput* input) = 0; + virtual Occurrence* activeOccurrence_raw() const = 0; + virtual AreaProperties* areaProperties_raw(core::ObjectCollection* inputs, CalculationAccuracy accuracy) const = 0; + virtual PhysicalProperties* physicalProperties_raw(core::ObjectCollection* inputs, CalculationAccuracy accuracy) const = 0; + virtual ContactSets* contactSets_raw() const = 0; + virtual bool isContactAnalysisEnabled_raw() const = 0; + virtual bool isContactAnalysisEnabled_raw(bool value) = 0; + virtual bool isContactSetAnalysis_raw() const = 0; + virtual bool isContactSetAnalysis_raw(bool value) = 0; + virtual core::Base** findEntityByToken_raw(const char * entityToken, size_t& return_size) = 0; + virtual bool computeAll_raw() = 0; +}; + +// Inline wrappers + +inline DesignTypes Design::designType() const +{ + DesignTypes res = designType_raw(); + return res; +} + +inline bool Design::designType(DesignTypes value) +{ + return designType_raw(value); +} + +inline core::Ptr Design::rootComponent() const +{ + core::Ptr res = rootComponent_raw(); + return res; +} + +inline core::Ptr Design::allComponents() const +{ + core::Ptr res = allComponents_raw(); + return res; +} + +inline core::Ptr Design::activeEditObject() const +{ + core::Ptr res = activeEditObject_raw(); + return res; +} + +inline core::Ptr Design::activeComponent() const +{ + core::Ptr res = activeComponent_raw(); + return res; +} + +inline core::Ptr Design::snapshots() const +{ + core::Ptr res = snapshots_raw(); + return res; +} + +inline core::Ptr Design::timeline() const +{ + core::Ptr res = timeline_raw(); + return res; +} + +inline core::Ptr Design::userParameters() const +{ + core::Ptr res = userParameters_raw(); + return res; +} + +inline core::Ptr Design::allParameters() const +{ + core::Ptr res = allParameters_raw(); + return res; +} + +inline core::Ptr Design::fusionUnitsManager() const +{ + core::Ptr res = fusionUnitsManager_raw(); + return res; +} + +inline core::Ptr Design::exportManager() const +{ + core::Ptr res = exportManager_raw(); + return res; +} + +inline bool Design::isRootComponentActive() const +{ + bool res = isRootComponentActive_raw(); + return res; +} + +inline bool Design::activateRootComponent() +{ + bool res = activateRootComponent_raw(); + return res; +} + +inline core::Ptr Design::materials() const +{ + core::Ptr res = materials_raw(); + return res; +} + +inline core::Ptr Design::appearances() const +{ + core::Ptr res = appearances_raw(); + return res; +} + +inline core::Ptr Design::createInterferenceInput(const core::Ptr& entities) +{ + core::Ptr res = createInterferenceInput_raw(entities.get()); + return res; +} + +inline core::Ptr Design::analyzeInterference(const core::Ptr& input) +{ + core::Ptr res = analyzeInterference_raw(input.get()); + return res; +} + +inline core::Ptr Design::activeOccurrence() const +{ + core::Ptr res = activeOccurrence_raw(); + return res; +} + +inline core::Ptr Design::areaProperties(const core::Ptr& inputs, CalculationAccuracy accuracy) const +{ + core::Ptr res = areaProperties_raw(inputs.get(), accuracy); + return res; +} + +inline core::Ptr Design::physicalProperties(const core::Ptr& inputs, CalculationAccuracy accuracy) const +{ + core::Ptr res = physicalProperties_raw(inputs.get(), accuracy); + return res; +} + +inline core::Ptr Design::contactSets() const +{ + core::Ptr res = contactSets_raw(); + return res; +} + +inline bool Design::isContactAnalysisEnabled() const +{ + bool res = isContactAnalysisEnabled_raw(); + return res; +} + +inline bool Design::isContactAnalysisEnabled(bool value) +{ + return isContactAnalysisEnabled_raw(value); +} + +inline bool Design::isContactSetAnalysis() const +{ + bool res = isContactSetAnalysis_raw(); + return res; +} + +inline bool Design::isContactSetAnalysis(bool value) +{ + return isContactSetAnalysis_raw(value); +} + +inline std::vector> Design::findEntityByToken(const std::string& entityToken) +{ + std::vector> res; + size_t s; + + core::Base** p= findEntityByToken_raw(entityToken.c_str(), s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool Design::computeAll() +{ + bool res = computeAll_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_DESIGN_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/ExportManager.h b/usr/autodesk/CPP/include/Fusion/Fusion/ExportManager.h new file mode 100644 index 0000000..ecee95c --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/ExportManager.h @@ -0,0 +1,189 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_EXPORTMANAGER_CPP__ +# define ADSK_FUSION_EXPORTMANAGER_API XI_EXPORT +# else +# define ADSK_FUSION_EXPORTMANAGER_API +# endif +#else +# define ADSK_FUSION_EXPORTMANAGER_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class C3MFExportOptions; + class ExportOptions; + class FusionArchiveExportOptions; + class IGESExportOptions; + class SATExportOptions; + class SMTExportOptions; + class STEPExportOptions; + class STLExportOptions; +}} + +namespace adsk { namespace fusion { + +/// Provides support for exporting model data to various formats. +class ExportManager : public core::Base { +public: + + /// Creates an IGESExportOptions object that's used to export a design in IGES format. Creation + /// of the IGESExportOptions object does not perform the export. You must pass this object to the + /// ExportManager.execute method to perform the export. The IGESExportOptions supports any available + /// options when exporting to IGES format. + /// filename : The filename of the IGES file to be created. + /// geometry : The geometry to export. Valid geometry for this is currently a Component object. This argument is optional + /// and if not specified, it results in the root component and it entire contents being exported. + /// The created IGESExportOptions object or null if the creation failed. + core::Ptr createIGESExportOptions(const std::string& filename, const core::Ptr& geometry = NULL); + + /// Creates an STEPExportOptions object that's used to export a design in STEP format. Creation + /// of the STEPExportOptions object does not perform the export. You must pass this object to the + /// ExportManager.execute method to perform the export. The STEPExportOptions supports any available + /// options when exporting to STEP format. + /// filename : The filename of the STEP file to be created. + /// geometry : The geometry to export. Valid geometry for this is currently a Component object. This argument is optional + /// and if not specified, it results in the root component and it entire contents being exported. + /// The created STEPExportOptions object or null if the creation failed. + core::Ptr createSTEPExportOptions(const std::string& filename, const core::Ptr& geometry = NULL); + + /// Creates an SATExportOptions object that's used to export a design in SAT format. Creation + /// of the SATExportOptions object does not perform the export. You must pass this object to the + /// ExportManager.execute method to perform the export. The SATExportOptions supports any available + /// options when exporting to SAT format. + /// filename : The filename of the SAT file to be created. + /// geometry : The geometry to export. Valid geometry for this is currently a Component object. This argument is optional + /// and if not specified, it results in the root component and it entire contents being exported. + /// The created SATExportOptions object or null if the creation failed. + core::Ptr createSATExportOptions(const std::string& filename, const core::Ptr& geometry = NULL); + + /// Creates an SMTExportOptions object that's used to export a design in SMT format. Creation + /// of the SMTExportOptions object does not perform the export. You must pass this object to the + /// ExportManager.execute method to perform the export. The SMTExportOptions supports any available + /// options when exporting to SMT format. + /// filename : The filename of the SMT file to be created. + /// geometry : The geometry to export. Valid geometry for this is currently a Component object. This argument is optional + /// and if not specified, it results in the root component and it entire contents being exported. + /// The created SMTExportOptions object or null if the creation failed. + core::Ptr createSMTExportOptions(const std::string& filename, const core::Ptr& geometry = NULL); + + /// Creates an FusionArchiveExportOptions object that's used to export a design in Fusion 360 archive format. Creation + /// of the FusionArchiveExportOptions object does not perform the export. You must pass this object to the + /// ExportManager.execute method to perform the export. The FusionArchiveExportOptions supports any available + /// options when exporting to Fusion 360 archive format. + /// filename : The filename of the Fusion 360 archive file to be created. + /// geometry : The geometry to export. Valid geometry for this is currently a Component object. This argument is optional + /// and if not specified, it results in the root component and it entire contents being exported. + /// The created FusionArchiveExportOptions object or null if the creation failed. + core::Ptr createFusionArchiveExportOptions(const std::string& filename, const core::Ptr& geometry = NULL); + + /// Creates an STLExportOptions object that's used to export a design in STL format. Creation + /// of the STLExportOptions object does not perform the export. You must pass this object to the + /// ExportManager.execute method to perform the export. + /// geometry : The geometry to export. This can be a BRepBody, Occurrence, or Component object. + /// filename : The filename of the STL file to be created. This is optional and can be left out if the mesh will be opened in a mesh editor. + /// The created createSTLExportOptions object or null if the creation failed. + core::Ptr createSTLExportOptions(const core::Ptr& geometry, const std::string& filename = ""); + + /// Executes the export operation to create the file in the format specified by the input ExportOptions object. + /// exportOptions : An ExportOptions object that is created using one of the create methods on the ExportManager object. This + /// defines the type of file and any available options supported for that file type. + /// Returns true if the export was successful. + bool execute(const core::Ptr& exportOptions); + + /// Creates an C3MFExportOptions object that's used to export a design in 3MF format. Creation + /// of the C3MFExportOptions object does not perform the export. You must pass this object to the + /// ExportManager.execute method to perform the export. + /// geometry : The geometry to export. This can be a BRepBody, Occurrence, or Component object. + /// filename : The filename of the 3MF file to be created. This is optional and can be left out if the mesh will be opened in a mesh editor. + /// The created createC3MFExportOptions object or null if the creation failed. + core::Ptr createC3MFExportOptions(const core::Ptr& geometry, const std::string& filename = ""); + + ADSK_FUSION_EXPORTMANAGER_API static const char* classType(); + ADSK_FUSION_EXPORTMANAGER_API const char* objectType() const override; + ADSK_FUSION_EXPORTMANAGER_API void* queryInterface(const char* id) const override; + ADSK_FUSION_EXPORTMANAGER_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual IGESExportOptions* createIGESExportOptions_raw(const char * filename, core::Base* geometry) = 0; + virtual STEPExportOptions* createSTEPExportOptions_raw(const char * filename, core::Base* geometry) = 0; + virtual SATExportOptions* createSATExportOptions_raw(const char * filename, core::Base* geometry) = 0; + virtual SMTExportOptions* createSMTExportOptions_raw(const char * filename, core::Base* geometry) = 0; + virtual FusionArchiveExportOptions* createFusionArchiveExportOptions_raw(const char * filename, core::Base* geometry) = 0; + virtual STLExportOptions* createSTLExportOptions_raw(core::Base* geometry, const char * filename) = 0; + virtual bool execute_raw(ExportOptions* exportOptions) = 0; + virtual C3MFExportOptions* createC3MFExportOptions_raw(core::Base* geometry, const char * filename) = 0; +}; + +// Inline wrappers + +inline core::Ptr ExportManager::createIGESExportOptions(const std::string& filename, const core::Ptr& geometry) +{ + core::Ptr res = createIGESExportOptions_raw(filename.c_str(), geometry.get()); + return res; +} + +inline core::Ptr ExportManager::createSTEPExportOptions(const std::string& filename, const core::Ptr& geometry) +{ + core::Ptr res = createSTEPExportOptions_raw(filename.c_str(), geometry.get()); + return res; +} + +inline core::Ptr ExportManager::createSATExportOptions(const std::string& filename, const core::Ptr& geometry) +{ + core::Ptr res = createSATExportOptions_raw(filename.c_str(), geometry.get()); + return res; +} + +inline core::Ptr ExportManager::createSMTExportOptions(const std::string& filename, const core::Ptr& geometry) +{ + core::Ptr res = createSMTExportOptions_raw(filename.c_str(), geometry.get()); + return res; +} + +inline core::Ptr ExportManager::createFusionArchiveExportOptions(const std::string& filename, const core::Ptr& geometry) +{ + core::Ptr res = createFusionArchiveExportOptions_raw(filename.c_str(), geometry.get()); + return res; +} + +inline core::Ptr ExportManager::createSTLExportOptions(const core::Ptr& geometry, const std::string& filename) +{ + core::Ptr res = createSTLExportOptions_raw(geometry.get(), filename.c_str()); + return res; +} + +inline bool ExportManager::execute(const core::Ptr& exportOptions) +{ + bool res = execute_raw(exportOptions.get()); + return res; +} + +inline core::Ptr ExportManager::createC3MFExportOptions(const core::Ptr& geometry, const std::string& filename) +{ + core::Ptr res = createC3MFExportOptions_raw(geometry.get(), filename.c_str()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_EXPORTMANAGER_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/ExportOptions.h b/usr/autodesk/CPP/include/Fusion/Fusion/ExportOptions.h new file mode 100644 index 0000000..4dfc7ef --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/ExportOptions.h @@ -0,0 +1,123 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_EXPORTOPTIONS_CPP__ +# define ADSK_FUSION_EXPORTOPTIONS_API XI_EXPORT +# else +# define ADSK_FUSION_EXPORTOPTIONS_API +# endif +#else +# define ADSK_FUSION_EXPORTOPTIONS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// The base class for the different export types. This class is never directly used +/// in an export because you need the specific export type to specify the type of +/// export to be performed. +class ExportOptions : public core::Base { +public: + + /// Gets and sets the filename that the exported file will be written to. This can + /// be empty in the case of STL export and sending the result to the mesh editor. + std::string filename() const; + bool filename(const std::string& value); + + /// Specifies the geometry to export. This can be an Occurrence, or the root Component. + /// For STL export, it can also be a BRepBody. For DXF export, it can be a sketch of flat pattern. + core::Ptr geometry() const; + bool geometry(const core::Ptr& value); + + ADSK_FUSION_EXPORTOPTIONS_API static const char* classType(); + ADSK_FUSION_EXPORTOPTIONS_API const char* objectType() const override; + ADSK_FUSION_EXPORTOPTIONS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_EXPORTOPTIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* filename_raw() const = 0; + virtual bool filename_raw(const char * value) = 0; + virtual core::Base* geometry_raw() const = 0; + virtual bool geometry_raw(core::Base* value) = 0; + virtual void placeholderExportOptions0() {} + virtual void placeholderExportOptions1() {} + virtual void placeholderExportOptions2() {} + virtual void placeholderExportOptions3() {} + virtual void placeholderExportOptions4() {} + virtual void placeholderExportOptions5() {} + virtual void placeholderExportOptions6() {} + virtual void placeholderExportOptions7() {} + virtual void placeholderExportOptions8() {} + virtual void placeholderExportOptions9() {} + virtual void placeholderExportOptions10() {} + virtual void placeholderExportOptions11() {} + virtual void placeholderExportOptions12() {} + virtual void placeholderExportOptions13() {} + virtual void placeholderExportOptions14() {} + virtual void placeholderExportOptions15() {} + virtual void placeholderExportOptions16() {} + virtual void placeholderExportOptions17() {} + virtual void placeholderExportOptions18() {} + virtual void placeholderExportOptions19() {} + virtual void placeholderExportOptions20() {} + virtual void placeholderExportOptions21() {} + virtual void placeholderExportOptions22() {} + virtual void placeholderExportOptions23() {} + virtual void placeholderExportOptions24() {} + virtual void placeholderExportOptions25() {} + virtual void placeholderExportOptions26() {} + virtual void placeholderExportOptions27() {} +}; + +// Inline wrappers + +inline std::string ExportOptions::filename() const +{ + std::string res; + + char* p= filename_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool ExportOptions::filename(const std::string& value) +{ + return filename_raw(value.c_str()); +} + +inline core::Ptr ExportOptions::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline bool ExportOptions::geometry(const core::Ptr& value) +{ + return geometry_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_EXPORTOPTIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/FloatParameterValue.h b/usr/autodesk/CPP/include/Fusion/Fusion/FloatParameterValue.h new file mode 100644 index 0000000..217b809 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/FloatParameterValue.h @@ -0,0 +1,65 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ParameterValue.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FLOATPARAMETERVALUE_CPP__ +# define ADSK_FUSION_FLOATPARAMETERVALUE_API XI_EXPORT +# else +# define ADSK_FUSION_FLOATPARAMETERVALUE_API +# endif +#else +# define ADSK_FUSION_FLOATPARAMETERVALUE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// A parameter value that is a floating point value. +class FloatParameterValue : public ParameterValue { +public: + + /// Get or set the value of the parameter. + double value() const; + bool value(double value); + + ADSK_FUSION_FLOATPARAMETERVALUE_API static const char* classType(); + ADSK_FUSION_FLOATPARAMETERVALUE_API const char* objectType() const override; + ADSK_FUSION_FLOATPARAMETERVALUE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FLOATPARAMETERVALUE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual double value_raw() const = 0; + virtual bool value_raw(double value) = 0; +}; + +// Inline wrappers + +inline double FloatParameterValue::value() const +{ + double res = value_raw(); + return res; +} + +inline bool FloatParameterValue::value(double value) +{ + return value_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FLOATPARAMETERVALUE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/FusionArchiveExportOptions.h b/usr/autodesk/CPP/include/Fusion/Fusion/FusionArchiveExportOptions.h new file mode 100644 index 0000000..5898941 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/FusionArchiveExportOptions.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExportOptions.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FUSIONARCHIVEEXPORTOPTIONS_CPP__ +# define ADSK_FUSION_FUSIONARCHIVEEXPORTOPTIONS_API XI_EXPORT +# else +# define ADSK_FUSION_FUSIONARCHIVEEXPORTOPTIONS_API +# endif +#else +# define ADSK_FUSION_FUSIONARCHIVEEXPORTOPTIONS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Defines that a Fusion 360 Archive export is to be done and specifies the various options. +class FusionArchiveExportOptions : public ExportOptions { +public: + + ADSK_FUSION_FUSIONARCHIVEEXPORTOPTIONS_API static const char* classType(); + ADSK_FUSION_FUSIONARCHIVEEXPORTOPTIONS_API const char* objectType() const override; + ADSK_FUSION_FUSIONARCHIVEEXPORTOPTIONS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FUSIONARCHIVEEXPORTOPTIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FUSIONARCHIVEEXPORTOPTIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/FusionDefaultUnitsPreferences.h b/usr/autodesk/CPP/include/Fusion/Fusion/FusionDefaultUnitsPreferences.h new file mode 100644 index 0000000..fdc4236 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/FusionDefaultUnitsPreferences.h @@ -0,0 +1,66 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "../../Core/Application/DefaultUnitsPreferences.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FUSIONDEFAULTUNITSPREFERENCES_CPP__ +# define ADSK_FUSION_FUSIONDEFAULTUNITSPREFERENCES_API XI_EXPORT +# else +# define ADSK_FUSION_FUSIONDEFAULTUNITSPREFERENCES_API +# endif +#else +# define ADSK_FUSION_FUSIONDEFAULTUNITSPREFERENCES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Fusion 360 Default Units for Design Preferences +class FusionDefaultUnitsPreferences : public core::DefaultUnitsPreferences { +public: + + /// Gets and sets the default units for length when creating a new Fusion 360 file. + DistanceUnits distanceDisplayUnits() const; + bool distanceDisplayUnits(DistanceUnits value); + + ADSK_FUSION_FUSIONDEFAULTUNITSPREFERENCES_API static const char* classType(); + ADSK_FUSION_FUSIONDEFAULTUNITSPREFERENCES_API const char* objectType() const override; + ADSK_FUSION_FUSIONDEFAULTUNITSPREFERENCES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FUSIONDEFAULTUNITSPREFERENCES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual DistanceUnits distanceDisplayUnits_raw() const = 0; + virtual bool distanceDisplayUnits_raw(DistanceUnits value) = 0; +}; + +// Inline wrappers + +inline DistanceUnits FusionDefaultUnitsPreferences::distanceDisplayUnits() const +{ + DistanceUnits res = distanceDisplayUnits_raw(); + return res; +} + +inline bool FusionDefaultUnitsPreferences::distanceDisplayUnits(DistanceUnits value) +{ + return distanceDisplayUnits_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FUSIONDEFAULTUNITSPREFERENCES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/FusionDocument.h b/usr/autodesk/CPP/include/Fusion/Fusion/FusionDocument.h new file mode 100644 index 0000000..a5a7f91 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/FusionDocument.h @@ -0,0 +1,62 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Application/Document.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FUSIONDOCUMENT_CPP__ +# define ADSK_FUSION_FUSIONDOCUMENT_API XI_EXPORT +# else +# define ADSK_FUSION_FUSIONDOCUMENT_API +# endif +#else +# define ADSK_FUSION_FUSIONDOCUMENT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Design; +}} + +namespace adsk { namespace fusion { + +/// Object that represents a Fusion 360 specific document. +class FusionDocument : public core::Document { +public: + + /// Returns the design associated with this Fusion 360 document. + core::Ptr design() const; + + ADSK_FUSION_FUSIONDOCUMENT_API static const char* classType(); + ADSK_FUSION_FUSIONDOCUMENT_API const char* objectType() const override; + ADSK_FUSION_FUSIONDOCUMENT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FUSIONDOCUMENT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Design* design_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr FusionDocument::design() const +{ + core::Ptr res = design_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FUSIONDOCUMENT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/FusionProductPreferences.h b/usr/autodesk/CPP/include/Fusion/Fusion/FusionProductPreferences.h new file mode 100644 index 0000000..88e33a4 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/FusionProductPreferences.h @@ -0,0 +1,204 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "../../Core/Application/ProductPreferences.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FUSIONPRODUCTPREFERENCES_CPP__ +# define ADSK_FUSION_FUSIONPRODUCTPREFERENCES_API XI_EXPORT +# else +# define ADSK_FUSION_FUSIONPRODUCTPREFERENCES_API +# endif +#else +# define ADSK_FUSION_FUSIONPRODUCTPREFERENCES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Fusion 360 General Design Preferences +class FusionProductPreferences : public core::ProductPreferences { +public: + + /// Gets and sets the Active Component Visibility option + bool isActiveComponentVisibilityUsed() const; + bool isActiveComponentVisibilityUsed(bool value); + + /// Gets and sets the Design History (default design type) setting + DefaultDesignTypeOptions defaultDesignType() const; + bool defaultDesignType(DefaultDesignTypeOptions value); + + /// Gets and sets the Default workspace setting. (Model, Sculpt or Patch) + DefaultWorkspaces defaultWorkspace() const; + bool defaultWorkspace(DefaultWorkspaces value); + + /// Gets and sets the Animate joint preview option + bool isJointPreviewAnimated() const; + bool isJointPreviewAnimated(bool value); + + /// Gets and sets the Allow 3D sketching of lines and splines option + /// which controls if 3D sketching is allowed or if sketching is forced to + /// be on the x-y plane of the sketch. + bool is3DSketchingAllowed() const; + bool is3DSketchingAllowed(bool value); + + /// Gets and sets the Show ghosted result body option + bool isGhostedResultBodyShown() const; + bool isGhostedResultBodyShown(bool value); + + /// Gets and sets if dimension value is edited when the dimension is created. + bool isDimensionEditedWhenCreated() const; + bool isDimensionEditedWhenCreated(bool value); + + /// Gets and sets if the view is re-oriented to view the newly created sketch. + bool isAutoLookAtSketch() const; + bool isAutoLookAtSketch(bool value); + + /// Gets and Sets if geometry, not in the active sketch plane, is to be automatically projected. + bool isAutoProjectGeometry() const; + bool isAutoProjectGeometry(bool value); + + ADSK_FUSION_FUSIONPRODUCTPREFERENCES_API static const char* classType(); + ADSK_FUSION_FUSIONPRODUCTPREFERENCES_API const char* objectType() const override; + ADSK_FUSION_FUSIONPRODUCTPREFERENCES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FUSIONPRODUCTPREFERENCES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool isActiveComponentVisibilityUsed_raw() const = 0; + virtual bool isActiveComponentVisibilityUsed_raw(bool value) = 0; + virtual DefaultDesignTypeOptions defaultDesignType_raw() const = 0; + virtual bool defaultDesignType_raw(DefaultDesignTypeOptions value) = 0; + virtual DefaultWorkspaces defaultWorkspace_raw() const = 0; + virtual bool defaultWorkspace_raw(DefaultWorkspaces value) = 0; + virtual bool isJointPreviewAnimated_raw() const = 0; + virtual bool isJointPreviewAnimated_raw(bool value) = 0; + virtual bool is3DSketchingAllowed_raw() const = 0; + virtual bool is3DSketchingAllowed_raw(bool value) = 0; + virtual bool isGhostedResultBodyShown_raw() const = 0; + virtual bool isGhostedResultBodyShown_raw(bool value) = 0; + virtual bool isDimensionEditedWhenCreated_raw() const = 0; + virtual bool isDimensionEditedWhenCreated_raw(bool value) = 0; + virtual bool isAutoLookAtSketch_raw() const = 0; + virtual bool isAutoLookAtSketch_raw(bool value) = 0; + virtual bool isAutoProjectGeometry_raw() const = 0; + virtual bool isAutoProjectGeometry_raw(bool value) = 0; +}; + +// Inline wrappers + +inline bool FusionProductPreferences::isActiveComponentVisibilityUsed() const +{ + bool res = isActiveComponentVisibilityUsed_raw(); + return res; +} + +inline bool FusionProductPreferences::isActiveComponentVisibilityUsed(bool value) +{ + return isActiveComponentVisibilityUsed_raw(value); +} + +inline DefaultDesignTypeOptions FusionProductPreferences::defaultDesignType() const +{ + DefaultDesignTypeOptions res = defaultDesignType_raw(); + return res; +} + +inline bool FusionProductPreferences::defaultDesignType(DefaultDesignTypeOptions value) +{ + return defaultDesignType_raw(value); +} + +inline DefaultWorkspaces FusionProductPreferences::defaultWorkspace() const +{ + DefaultWorkspaces res = defaultWorkspace_raw(); + return res; +} + +inline bool FusionProductPreferences::defaultWorkspace(DefaultWorkspaces value) +{ + return defaultWorkspace_raw(value); +} + +inline bool FusionProductPreferences::isJointPreviewAnimated() const +{ + bool res = isJointPreviewAnimated_raw(); + return res; +} + +inline bool FusionProductPreferences::isJointPreviewAnimated(bool value) +{ + return isJointPreviewAnimated_raw(value); +} + +inline bool FusionProductPreferences::is3DSketchingAllowed() const +{ + bool res = is3DSketchingAllowed_raw(); + return res; +} + +inline bool FusionProductPreferences::is3DSketchingAllowed(bool value) +{ + return is3DSketchingAllowed_raw(value); +} + +inline bool FusionProductPreferences::isGhostedResultBodyShown() const +{ + bool res = isGhostedResultBodyShown_raw(); + return res; +} + +inline bool FusionProductPreferences::isGhostedResultBodyShown(bool value) +{ + return isGhostedResultBodyShown_raw(value); +} + +inline bool FusionProductPreferences::isDimensionEditedWhenCreated() const +{ + bool res = isDimensionEditedWhenCreated_raw(); + return res; +} + +inline bool FusionProductPreferences::isDimensionEditedWhenCreated(bool value) +{ + return isDimensionEditedWhenCreated_raw(value); +} + +inline bool FusionProductPreferences::isAutoLookAtSketch() const +{ + bool res = isAutoLookAtSketch_raw(); + return res; +} + +inline bool FusionProductPreferences::isAutoLookAtSketch(bool value) +{ + return isAutoLookAtSketch_raw(value); +} + +inline bool FusionProductPreferences::isAutoProjectGeometry() const +{ + bool res = isAutoProjectGeometry_raw(); + return res; +} + +inline bool FusionProductPreferences::isAutoProjectGeometry(bool value) +{ + return isAutoProjectGeometry_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FUSIONPRODUCTPREFERENCES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/FusionUnitsManager.h b/usr/autodesk/CPP/include/Fusion/Fusion/FusionUnitsManager.h new file mode 100644 index 0000000..f0cef8e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/FusionUnitsManager.h @@ -0,0 +1,84 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "../../Core/Application/UnitsManager.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FUSIONUNITSMANAGER_CPP__ +# define ADSK_FUSION_FUSIONUNITSMANAGER_API XI_EXPORT +# else +# define ADSK_FUSION_FUSIONUNITSMANAGER_API +# endif +#else +# define ADSK_FUSION_FUSIONUNITSMANAGER_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Design; +}} + +namespace adsk { namespace fusion { + +/// Utility class used to work with Values and control default units. +/// Internal values are held in SI units (e.g. seconds, radians, kg for time, angle, mass) +/// with the exception that all lengths are in cm rather than meter and this affects derived +/// units (e.g. velocity is cm/s, volume is cm^3). Units are specified flexibly via strings +/// (e.g. "cm", "in", "inch", "cm^3", "cm*cm*cm", "mph", "mps" "m/s"). +class FusionUnitsManager : public core::UnitsManager { +public: + + /// Returns the parent design + core::Ptr design() const; + + /// Gets and sets the default distance units for this design. + DistanceUnits distanceDisplayUnits() const; + bool distanceDisplayUnits(DistanceUnits value); + + ADSK_FUSION_FUSIONUNITSMANAGER_API static const char* classType(); + ADSK_FUSION_FUSIONUNITSMANAGER_API const char* objectType() const override; + ADSK_FUSION_FUSIONUNITSMANAGER_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FUSIONUNITSMANAGER_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Design* design_raw() const = 0; + virtual DistanceUnits distanceDisplayUnits_raw() const = 0; + virtual bool distanceDisplayUnits_raw(DistanceUnits value) = 0; +}; + +// Inline wrappers + +inline core::Ptr FusionUnitsManager::design() const +{ + core::Ptr res = design_raw(); + return res; +} + +inline DistanceUnits FusionUnitsManager::distanceDisplayUnits() const +{ + DistanceUnits res = distanceDisplayUnits_raw(); + return res; +} + +inline bool FusionUnitsManager::distanceDisplayUnits(DistanceUnits value) +{ + return distanceDisplayUnits_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FUSIONUNITSMANAGER_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/IGESExportOptions.h b/usr/autodesk/CPP/include/Fusion/Fusion/IGESExportOptions.h new file mode 100644 index 0000000..f4ee846 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/IGESExportOptions.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExportOptions.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_IGESEXPORTOPTIONS_CPP__ +# define ADSK_FUSION_IGESEXPORTOPTIONS_API XI_EXPORT +# else +# define ADSK_FUSION_IGESEXPORTOPTIONS_API +# endif +#else +# define ADSK_FUSION_IGESEXPORTOPTIONS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Defines that an IGES export is to be done and specifies the various options. +class IGESExportOptions : public ExportOptions { +public: + + ADSK_FUSION_IGESEXPORTOPTIONS_API static const char* classType(); + ADSK_FUSION_IGESEXPORTOPTIONS_API const char* objectType() const override; + ADSK_FUSION_IGESEXPORTOPTIONS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_IGESEXPORTOPTIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_IGESEXPORTOPTIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/IntegerParameterValue.h b/usr/autodesk/CPP/include/Fusion/Fusion/IntegerParameterValue.h new file mode 100644 index 0000000..d39a105 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/IntegerParameterValue.h @@ -0,0 +1,65 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ParameterValue.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_INTEGERPARAMETERVALUE_CPP__ +# define ADSK_FUSION_INTEGERPARAMETERVALUE_API XI_EXPORT +# else +# define ADSK_FUSION_INTEGERPARAMETERVALUE_API +# endif +#else +# define ADSK_FUSION_INTEGERPARAMETERVALUE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// A parameter value that is an integer. +class IntegerParameterValue : public ParameterValue { +public: + + /// Get or set the value of the parameter. + int value() const; + bool value(int value); + + ADSK_FUSION_INTEGERPARAMETERVALUE_API static const char* classType(); + ADSK_FUSION_INTEGERPARAMETERVALUE_API const char* objectType() const override; + ADSK_FUSION_INTEGERPARAMETERVALUE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_INTEGERPARAMETERVALUE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual int value_raw() const = 0; + virtual bool value_raw(int value) = 0; +}; + +// Inline wrappers + +inline int IntegerParameterValue::value() const +{ + int res = value_raw(); + return res; +} + +inline bool IntegerParameterValue::value(int value) +{ + return value_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_INTEGERPARAMETERVALUE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/InterferenceInput.h b/usr/autodesk/CPP/include/Fusion/Fusion/InterferenceInput.h new file mode 100644 index 0000000..74b52e9 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/InterferenceInput.h @@ -0,0 +1,91 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_INTERFERENCEINPUT_CPP__ +# define ADSK_FUSION_INTERFERENCEINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_INTERFERENCEINPUT_API +# endif +#else +# define ADSK_FUSION_INTERFERENCEINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Used to gather and define the various inputs and settings needed to calculate interference. This +/// object is created using the Design.createInterferenceInput method. +class InterferenceInput : public core::Base { +public: + + /// Gets and set an ObjectCollection containing BRepBody and/or Occurrence entities that + /// will be used when checking for interference. All entities must be in the context of + /// the root component of the top-level design. + core::Ptr entities() const; + bool entities(const core::Ptr& value); + + /// Gets and sets whether any coincident faces in the input bodies are considered as interference + /// or not. This property defaults to False for a newly created InterferenceInput object. + bool areCoincidentFacesIncluded() const; + bool areCoincidentFacesIncluded(bool value); + + ADSK_FUSION_INTERFERENCEINPUT_API static const char* classType(); + ADSK_FUSION_INTERFERENCEINPUT_API const char* objectType() const override; + ADSK_FUSION_INTERFERENCEINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_INTERFERENCEINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::ObjectCollection* entities_raw() const = 0; + virtual bool entities_raw(core::ObjectCollection* value) = 0; + virtual bool areCoincidentFacesIncluded_raw() const = 0; + virtual bool areCoincidentFacesIncluded_raw(bool value) = 0; +}; + +// Inline wrappers + +inline core::Ptr InterferenceInput::entities() const +{ + core::Ptr res = entities_raw(); + return res; +} + +inline bool InterferenceInput::entities(const core::Ptr& value) +{ + return entities_raw(value.get()); +} + +inline bool InterferenceInput::areCoincidentFacesIncluded() const +{ + bool res = areCoincidentFacesIncluded_raw(); + return res; +} + +inline bool InterferenceInput::areCoincidentFacesIncluded(bool value) +{ + return areCoincidentFacesIncluded_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_INTERFERENCEINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/InterferenceResult.h b/usr/autodesk/CPP/include/Fusion/Fusion/InterferenceResult.h new file mode 100644 index 0000000..b1fc666 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/InterferenceResult.h @@ -0,0 +1,103 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_INTERFERENCERESULT_CPP__ +# define ADSK_FUSION_INTERFERENCERESULT_API XI_EXPORT +# else +# define ADSK_FUSION_INTERFERENCERESULT_API +# endif +#else +# define ADSK_FUSION_INTERFERENCERESULT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; +}} + +namespace adsk { namespace fusion { + +/// Represents the interference between bodies and/or occurrences in an interference analysis. +class InterferenceResult : public core::Base { +public: + + /// Returns the first entity involved in the interference + core::Ptr entityOne() const; + + /// Returns the second entity involved in the interference + core::Ptr entityTwo() const; + + /// Returns a transient BRepBody that represents the volume of interference. + core::Ptr interferenceBody() const; + + /// Gets and sets if this interference volume should be created as a model body. Setting + /// this to true doesn't create the body just indicates that a body is desired. Calling + /// the createBodies method on the interferenceResults object will result in the creation + /// of the model body if this property is true. + bool isCreateBody() const; + bool isCreateBody(bool value); + + ADSK_FUSION_INTERFERENCERESULT_API static const char* classType(); + ADSK_FUSION_INTERFERENCERESULT_API const char* objectType() const override; + ADSK_FUSION_INTERFERENCERESULT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_INTERFERENCERESULT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* entityOne_raw() const = 0; + virtual core::Base* entityTwo_raw() const = 0; + virtual BRepBody* interferenceBody_raw() const = 0; + virtual bool isCreateBody_raw() const = 0; + virtual bool isCreateBody_raw(bool value) = 0; +}; + +// Inline wrappers + +inline core::Ptr InterferenceResult::entityOne() const +{ + core::Ptr res = entityOne_raw(); + return res; +} + +inline core::Ptr InterferenceResult::entityTwo() const +{ + core::Ptr res = entityTwo_raw(); + return res; +} + +inline core::Ptr InterferenceResult::interferenceBody() const +{ + core::Ptr res = interferenceBody_raw(); + return res; +} + +inline bool InterferenceResult::isCreateBody() const +{ + bool res = isCreateBody_raw(); + return res; +} + +inline bool InterferenceResult::isCreateBody(bool value) +{ + return isCreateBody_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_INTERFERENCERESULT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/InterferenceResults.h b/usr/autodesk/CPP/include/Fusion/Fusion/InterferenceResults.h new file mode 100644 index 0000000..b5d72b2 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/InterferenceResults.h @@ -0,0 +1,105 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_INTERFERENCERESULTS_CPP__ +# define ADSK_FUSION_INTERFERENCERESULTS_API XI_EXPORT +# else +# define ADSK_FUSION_INTERFERENCERESULTS_API +# endif +#else +# define ADSK_FUSION_INTERFERENCERESULTS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class InterferenceResult; +}} +namespace adsk { namespace core { + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// Transient object used to return the result of an interference analysis. +class InterferenceResults : public core::Base { +public: + + /// Function that returns the specified interference result using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of interference results in the collection. + size_t count() const; + + /// Creates bodies in the model that represent the interference volumes. + /// This is not supported in parametric modeling. + /// allInterferenceBodies : Sets if all bodies or only individual bodies will be created as bodies in the model. + /// If False, then only interferenceResult objects whose isCreateBody property is true + /// will be created as a model body. If true, all interface volumes will be created as + /// a body regardless of the value of the isCreateBody property. + core::Ptr createBodies(bool allInterferenceBodies); + + typedef InterferenceResult iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_INTERFERENCERESULTS_API static const char* classType(); + ADSK_FUSION_INTERFERENCERESULTS_API const char* objectType() const override; + ADSK_FUSION_INTERFERENCERESULTS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_INTERFERENCERESULTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual InterferenceResult* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual core::ObjectCollection* createBodies_raw(bool allInterferenceBodies) = 0; +}; + +// Inline wrappers + +inline core::Ptr InterferenceResults::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t InterferenceResults::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr InterferenceResults::createBodies(bool allInterferenceBodies) +{ + core::Ptr res = createBodies_raw(allInterferenceBodies); + return res; +} + +template inline void InterferenceResults::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_INTERFERENCERESULTS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/ModelParameter.h b/usr/autodesk/CPP/include/Fusion/Fusion/ModelParameter.h new file mode 100644 index 0000000..2ef0099 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/ModelParameter.h @@ -0,0 +1,131 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Parameter.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_MODELPARAMETER_CPP__ +# define ADSK_FUSION_MODELPARAMETER_API XI_EXPORT +# else +# define ADSK_FUSION_MODELPARAMETER_API +# endif +#else +# define ADSK_FUSION_MODELPARAMETER_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Component; + class ModelParameters; +}} + +namespace adsk { namespace fusion { + +/// Represents a Model Parameter. +class ModelParameter : public Parameter { +public: + + /// Returns the Collection containing the ModelParameter. + core::Ptr modelParameters() const; + + /// Returns the Component containing the ModelParameter. + core::Ptr component() const; + + /// This property identifies what the parameter is used for. For an extrude, it + /// could be "Depth", for a work plane it could be "Offset". + std::string role() const; + + /// Returns the object that created this parameter. For example, + /// a feature, a sketch dimension, or a construction plane. + core::Ptr createdBy() const; + + ADSK_FUSION_MODELPARAMETER_API static const char* classType(); + ADSK_FUSION_MODELPARAMETER_API const char* objectType() const override; + ADSK_FUSION_MODELPARAMETER_API void* queryInterface(const char* id) const override; + ADSK_FUSION_MODELPARAMETER_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ModelParameters* modelParameters_raw() const = 0; + virtual Component* component_raw() const = 0; + virtual char* role_raw() const = 0; + virtual core::Base* createdBy_raw() const = 0; + virtual void placeholderModelParameter0() {} + virtual void placeholderModelParameter1() {} + virtual void placeholderModelParameter2() {} + virtual void placeholderModelParameter3() {} + virtual void placeholderModelParameter4() {} + virtual void placeholderModelParameter5() {} + virtual void placeholderModelParameter6() {} + virtual void placeholderModelParameter7() {} + virtual void placeholderModelParameter8() {} + virtual void placeholderModelParameter9() {} + virtual void placeholderModelParameter10() {} + virtual void placeholderModelParameter11() {} + virtual void placeholderModelParameter12() {} + virtual void placeholderModelParameter13() {} + virtual void placeholderModelParameter14() {} + virtual void placeholderModelParameter15() {} + virtual void placeholderModelParameter16() {} + virtual void placeholderModelParameter17() {} + virtual void placeholderModelParameter18() {} + virtual void placeholderModelParameter19() {} + virtual void placeholderModelParameter20() {} + virtual void placeholderModelParameter21() {} + virtual void placeholderModelParameter22() {} + virtual void placeholderModelParameter23() {} + virtual void placeholderModelParameter24() {} + virtual void placeholderModelParameter25() {} + virtual void placeholderModelParameter26() {} + virtual void placeholderModelParameter27() {} +}; + +// Inline wrappers + +inline core::Ptr ModelParameter::modelParameters() const +{ + core::Ptr res = modelParameters_raw(); + return res; +} + +inline core::Ptr ModelParameter::component() const +{ + core::Ptr res = component_raw(); + return res; +} + +inline std::string ModelParameter::role() const +{ + std::string res; + + char* p= role_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline core::Ptr ModelParameter::createdBy() const +{ + core::Ptr res = createdBy_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_MODELPARAMETER_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/ModelParameters.h b/usr/autodesk/CPP/include/Fusion/Fusion/ModelParameters.h new file mode 100644 index 0000000..7428841 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/ModelParameters.h @@ -0,0 +1,113 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_MODELPARAMETERS_CPP__ +# define ADSK_FUSION_MODELPARAMETERS_API XI_EXPORT +# else +# define ADSK_FUSION_MODELPARAMETERS_API +# endif +#else +# define ADSK_FUSION_MODELPARAMETERS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Component; + class ModelParameter; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the Model Parameters within a component. +class ModelParameters : public core::Base { +public: + + /// Function that returns the specified Model Parameter using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection + /// has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified Model Parameter using the name of the parameter as it is + /// displayed in the parameters dialog. + /// name : The name of the Model Parameter as it is displayed in the parameters dialog + /// Returns the specified item or null if an invalid name was specified. + core::Ptr itemByName(const std::string& name) const; + + /// Returns the number of parameters in the collection. + size_t count() const; + + /// Returns the component that owns the Model Parameters collection + core::Ptr component() const; + + typedef ModelParameter iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_MODELPARAMETERS_API static const char* classType(); + ADSK_FUSION_MODELPARAMETERS_API const char* objectType() const override; + ADSK_FUSION_MODELPARAMETERS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_MODELPARAMETERS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ModelParameter* item_raw(size_t index) const = 0; + virtual ModelParameter* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual Component* component_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ModelParameters::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr ModelParameters::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t ModelParameters::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr ModelParameters::component() const +{ + core::Ptr res = component_raw(); + return res; +} + +template inline void ModelParameters::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_MODELPARAMETERS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/Parameter.h b/usr/autodesk/CPP/include/Fusion/Fusion/Parameter.h new file mode 100644 index 0000000..3493c72 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/Parameter.h @@ -0,0 +1,257 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PARAMETER_CPP__ +# define ADSK_FUSION_PARAMETER_API XI_EXPORT +# else +# define ADSK_FUSION_PARAMETER_API +# endif +#else +# define ADSK_FUSION_PARAMETER_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ParameterList; +}} +namespace adsk { namespace core { + class Attributes; +}} + +namespace adsk { namespace fusion { + +/// The base class Parameter object that can represent model or user parameters. +class Parameter : public core::Base { +public: + + /// Gets and sets the real value (a double) of the parameter in database units. + /// Setting this property will set/reset the expression value for this parameter + double value() const; + bool value(double value); + + /// Gets and sets the expression (i.e. "22.064 mm") used to calculate the value of the parameter + std::string expression() const; + bool expression(const std::string& value); + + /// Gets and sets the name of the parameter. Setting the name can fail if the name + /// is not unique with respect to all other parameters in the design. + std::string name() const; + bool name(const std::string& value); + + /// The unit type associated with this parameter. An empty string is returned for parameters + /// that don't have a unit type. + std::string unit() const; + + /// The comment associated with this parameter + std::string comment() const; + bool comment(const std::string& value); + + /// Gets and sets whether this parameter is included in the Favorites list in the + /// parameters dialog + bool isFavorite() const; + bool isFavorite(bool value); + + /// Returns a list of parameters that are dependent on this parameter as a result + /// of this parameter being referenced in their equation. + core::Ptr dependentParameters() const; + + /// Gets if this parameter can be deleted. Parameters that cannot be deleted are: Model Parameters and + /// User Parameters that have dependents. + bool isDeletable() const; + + /// Returns the collection of attributes associated with this face. + core::Ptr attributes() const; + + /// Returns a token for the Parameter object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same parameter. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + ADSK_FUSION_PARAMETER_API static const char* classType(); + ADSK_FUSION_PARAMETER_API const char* objectType() const override; + ADSK_FUSION_PARAMETER_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PARAMETER_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual double value_raw() const = 0; + virtual bool value_raw(double value) = 0; + virtual char* expression_raw() const = 0; + virtual bool expression_raw(const char * value) = 0; + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual char* unit_raw() const = 0; + virtual char* comment_raw() const = 0; + virtual bool comment_raw(const char * value) = 0; + virtual bool isFavorite_raw() const = 0; + virtual bool isFavorite_raw(bool value) = 0; + virtual ParameterList* dependentParameters_raw() const = 0; + virtual bool isDeletable_raw() const = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual char* entityToken_raw() const = 0; + virtual void placeholderParameter0() {} + virtual void placeholderParameter1() {} + virtual void placeholderParameter2() {} + virtual void placeholderParameter3() {} + virtual void placeholderParameter4() {} + virtual void placeholderParameter5() {} + virtual void placeholderParameter6() {} + virtual void placeholderParameter7() {} + virtual void placeholderParameter8() {} + virtual void placeholderParameter9() {} + virtual void placeholderParameter10() {} + virtual void placeholderParameter11() {} + virtual void placeholderParameter12() {} + virtual void placeholderParameter13() {} + virtual void placeholderParameter14() {} + virtual void placeholderParameter15() {} + virtual void placeholderParameter16() {} +}; + +// Inline wrappers + +inline double Parameter::value() const +{ + double res = value_raw(); + return res; +} + +inline bool Parameter::value(double value) +{ + return value_raw(value); +} + +inline std::string Parameter::expression() const +{ + std::string res; + + char* p= expression_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool Parameter::expression(const std::string& value) +{ + return expression_raw(value.c_str()); +} + +inline std::string Parameter::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool Parameter::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline std::string Parameter::unit() const +{ + std::string res; + + char* p= unit_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::string Parameter::comment() const +{ + std::string res; + + char* p= comment_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool Parameter::comment(const std::string& value) +{ + return comment_raw(value.c_str()); +} + +inline bool Parameter::isFavorite() const +{ + bool res = isFavorite_raw(); + return res; +} + +inline bool Parameter::isFavorite(bool value) +{ + return isFavorite_raw(value); +} + +inline core::Ptr Parameter::dependentParameters() const +{ + core::Ptr res = dependentParameters_raw(); + return res; +} + +inline bool Parameter::isDeletable() const +{ + bool res = isDeletable_raw(); + return res; +} + +inline core::Ptr Parameter::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline std::string Parameter::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PARAMETER_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/ParameterList.h b/usr/autodesk/CPP/include/Fusion/Fusion/ParameterList.h new file mode 100644 index 0000000..b585378 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/ParameterList.h @@ -0,0 +1,209 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PARAMETERLIST_CPP__ +# define ADSK_FUSION_PARAMETERLIST_API XI_EXPORT +# else +# define ADSK_FUSION_PARAMETERLIST_API +# endif +#else +# define ADSK_FUSION_PARAMETERLIST_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Parameter; +}} + +namespace adsk { namespace fusion { + +/// Transient object used to pass a set of parameters. +class ParameterList : public core::Base { +public: + + /// Function that returns the specified parameter using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the specified parameter using the name of the parameter + /// as it is displayed in the parameters dialog + /// name : The name of the parameter as it is displayed in the parameters dialog + /// Returns the specified item or null if an invalid name was specified. + core::Ptr itemByName(const std::string& name) const; + + /// Returns the number of parameters in the collection. + size_t count() const; + + /// Adds a parameter to the list. This does not create a + /// new parameter, it adds an existing parameter to the list. + /// Note that duplicates can exist in the list. + /// parameter : The existing parameter to add to the list + /// Returns true if successful. This method will fail if the list is read-only + bool add(const core::Ptr& parameter); + + /// Method that removes a parameter from the list using the index of the item + /// in the list + /// Will fail if the list is read only. + /// index : The index of the parameter to be removed from the list + /// Returns true if successful. This method will fail if the list is read-only + bool removeByIndex(size_t index); + + /// Method that removes a parameter from the list by specifying the parameter (item) + /// to remove + /// item : The parameter item to remove from the list + /// Returns true if successful. This method will fail if the list is read-only + bool removeByItem(const core::Ptr& item); + + /// Finds the specified parameter in the list. The search can be started at a specified + /// index rather than from the beginning of the list. + /// If not found, -1 is returned. + /// parameter : The parameter to find + /// startIndex : the index in the list to start the search from + /// Returns the index of the parameter found in the list. + int find(const core::Ptr& parameter, size_t startIndex = 0) const; + + /// Indicates whether or not ParameterList collection contains a specified parameter + /// parameter : The parameter to look for in the list + /// Returns true if list contains the specified parameter + bool contains(const core::Ptr& parameter) const; + + /// Indicates if the list is read-only + /// Some lists returned by API calls (instead of lists created by the + /// user) are read only. Items cannot be added or remove from such a list. + bool isReadOnly() const; + + /// Creates a parameter list that the client can use for various purposes. + /// Use ParameterList.Add to add parameters to the list after creating it. + /// Returns a ParameterList + static core::Ptr create(); + + typedef Parameter iterable_type; + template void copyTo(OutputIterator result); + template static core::Ptr create(Container container); + template static core::Ptr create(InputIterator first, InputIterator last); + + ADSK_FUSION_PARAMETERLIST_API static const char* classType(); + ADSK_FUSION_PARAMETERLIST_API const char* objectType() const override; + ADSK_FUSION_PARAMETERLIST_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PARAMETERLIST_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Parameter* item_raw(size_t index) const = 0; + virtual Parameter* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual bool add_raw(Parameter* parameter) = 0; + virtual bool removeByIndex_raw(size_t index) = 0; + virtual bool removeByItem_raw(Parameter* item) = 0; + virtual int find_raw(Parameter* parameter, size_t startIndex) const = 0; + virtual bool contains_raw(Parameter* parameter) const = 0; + virtual bool isReadOnly_raw() const = 0; + ADSK_FUSION_PARAMETERLIST_API static ParameterList* create_raw(); +}; + +// Inline wrappers + +inline core::Ptr ParameterList::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr ParameterList::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t ParameterList::count() const +{ + size_t res = count_raw(); + return res; +} + +inline bool ParameterList::add(const core::Ptr& parameter) +{ + bool res = add_raw(parameter.get()); + return res; +} + +inline bool ParameterList::removeByIndex(size_t index) +{ + bool res = removeByIndex_raw(index); + return res; +} + +inline bool ParameterList::removeByItem(const core::Ptr& item) +{ + bool res = removeByItem_raw(item.get()); + return res; +} + +inline int ParameterList::find(const core::Ptr& parameter, size_t startIndex) const +{ + int res = find_raw(parameter.get(), startIndex); + return res; +} + +inline bool ParameterList::contains(const core::Ptr& parameter) const +{ + bool res = contains_raw(parameter.get()); + return res; +} + +inline bool ParameterList::isReadOnly() const +{ + bool res = isReadOnly_raw(); + return res; +} + +inline core::Ptr ParameterList::create() +{ + core::Ptr res = create_raw(); + return res; +} + +template inline void ParameterList::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} + +template inline core::Ptr ParameterList::create(Container container) +{ + return create(container.begin(), container.end()); +} + +template inline core::Ptr ParameterList::create(InputIterator first, InputIterator last) +{ + core::Ptr list = create(); + if (list) + for (;first != last;++first) + list->add(*first); + return list; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PARAMETERLIST_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/ParameterValue.h b/usr/autodesk/CPP/include/Fusion/Fusion/ParameterValue.h new file mode 100644 index 0000000..b5e19a9 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/ParameterValue.h @@ -0,0 +1,75 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PARAMETERVALUE_CPP__ +# define ADSK_FUSION_PARAMETERVALUE_API XI_EXPORT +# else +# define ADSK_FUSION_PARAMETERVALUE_API +# endif +#else +# define ADSK_FUSION_PARAMETERVALUE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Base class for representing the value of a parameter. +/// Subclasses implement value handling for available parameter types. +class ParameterValue : public core::Base { +public: + + /// Get the parameter object that the value is associated with. + core::Ptr parent() const; + + ADSK_FUSION_PARAMETERVALUE_API static const char* classType(); + ADSK_FUSION_PARAMETERVALUE_API const char* objectType() const override; + ADSK_FUSION_PARAMETERVALUE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PARAMETERVALUE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* parent_raw() const = 0; + virtual void placeholderParameterValue0() {} + virtual void placeholderParameterValue1() {} + virtual void placeholderParameterValue2() {} + virtual void placeholderParameterValue3() {} + virtual void placeholderParameterValue4() {} + virtual void placeholderParameterValue5() {} + virtual void placeholderParameterValue6() {} + virtual void placeholderParameterValue7() {} + virtual void placeholderParameterValue8() {} + virtual void placeholderParameterValue9() {} + virtual void placeholderParameterValue10() {} + virtual void placeholderParameterValue11() {} + virtual void placeholderParameterValue12() {} + virtual void placeholderParameterValue13() {} + virtual void placeholderParameterValue14() {} +}; + +// Inline wrappers + +inline core::Ptr ParameterValue::parent() const +{ + core::Ptr res = parent_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PARAMETERVALUE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/PhysicalProperties.h b/usr/autodesk/CPP/include/Fusion/Fusion/PhysicalProperties.h new file mode 100644 index 0000000..da2a44d --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/PhysicalProperties.h @@ -0,0 +1,195 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PHYSICALPROPERTIES_CPP__ +# define ADSK_FUSION_PHYSICALPROPERTIES_API XI_EXPORT +# else +# define ADSK_FUSION_PHYSICALPROPERTIES_API +# endif +#else +# define ADSK_FUSION_PHYSICALPROPERTIES_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Point3D; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// The physical properties of a Component, Occurrence or BRepBody +class PhysicalProperties : public core::Base { +public: + + /// Gets the area in square centimeters. + double area() const; + + /// Gets the density in kilograms per cubic centimeter. + double density() const; + + /// Gets the mass in kilograms. + double mass() const; + + /// Gets the volume in the cubic centimeters. + double volume() const; + + /// Returns the accuracy that was used for the calculation. + CalculationAccuracy accuracy() const; + + /// Returns the center of mass position + core::Ptr centerOfMass() const; + + /// Method that returns the principal axes. + /// xAxis : The output Vector3D object that indicates the direction of the x axis. + /// yAxis : The output Vector3D object that indicates the direction of the y axis. + /// zAxis : The output Vector3D object that indicates the direction of the z axis. + /// Returns true if successful + bool getPrincipalAxes(core::Ptr& xAxis, core::Ptr& yAxis, core::Ptr& zAxis) const; + + /// Method that returns the moments of inertia about the principal axes. Unit for returned values is kg/cm^2. + /// i1 : Output Double that specifies the first moment of inertia. + /// i2 : Output Double that specifies the second moment of inertia. + /// i3 : Output Double that specifies the third moment of inertia. + /// Returns true if successful + bool getPrincipalMomentsOfInertia(double& i1, double& i2, double& i3) const; + + /// Method that returns the radius of gyration about the principal axes. Unit for returned values is cm. + /// kx : Output Double that returns the X partial radius of gyration. + /// ky : Output Double that returns the Y partial radius of gyration. + /// kz : Output Double that returns the Z partial radius of gyration. + /// Returns true if successful + bool getRadiusOfGyration(double& kx, double& ky, double& kz) const; + + /// Gets the rotation from the world coordinate system of the target to the principal coordinate system. + /// rx : + /// ry : + /// rz : + /// Returns true if successful + bool getRotationToPrincipal(double& rx, double& ry, double& rz) const; + + /// Method that gets the moment of inertia about the world coordinate system. + /// Unit for returned values is kg/cm^2. + /// xx : Output Double that returns the XX partial moment. + /// yy : Output Double that returns the YY partial moment. + /// zz : Output Double that returns the ZZ partial moment. + /// xy : Output Double that returns the XY partial moment. + /// yz : Output Double that returns the YZ partial moment. + /// xz : Output Double that returns the XZ partial moment. + /// Returns true if successful + bool getXYZMomentsOfInertia(double& xx, double& yy, double& zz, double& xy, double& yz, double& xz) const; + + ADSK_FUSION_PHYSICALPROPERTIES_API static const char* classType(); + ADSK_FUSION_PHYSICALPROPERTIES_API const char* objectType() const override; + ADSK_FUSION_PHYSICALPROPERTIES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PHYSICALPROPERTIES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual double area_raw() const = 0; + virtual double density_raw() const = 0; + virtual double mass_raw() const = 0; + virtual double volume_raw() const = 0; + virtual CalculationAccuracy accuracy_raw() const = 0; + virtual core::Point3D* centerOfMass_raw() const = 0; + virtual bool getPrincipalAxes_raw(core::Vector3D*& xAxis, core::Vector3D*& yAxis, core::Vector3D*& zAxis) const = 0; + virtual bool getPrincipalMomentsOfInertia_raw(double& i1, double& i2, double& i3) const = 0; + virtual bool getRadiusOfGyration_raw(double& kx, double& ky, double& kz) const = 0; + virtual bool getRotationToPrincipal_raw(double& rx, double& ry, double& rz) const = 0; + virtual bool getXYZMomentsOfInertia_raw(double& xx, double& yy, double& zz, double& xy, double& yz, double& xz) const = 0; +}; + +// Inline wrappers + +inline double PhysicalProperties::area() const +{ + double res = area_raw(); + return res; +} + +inline double PhysicalProperties::density() const +{ + double res = density_raw(); + return res; +} + +inline double PhysicalProperties::mass() const +{ + double res = mass_raw(); + return res; +} + +inline double PhysicalProperties::volume() const +{ + double res = volume_raw(); + return res; +} + +inline CalculationAccuracy PhysicalProperties::accuracy() const +{ + CalculationAccuracy res = accuracy_raw(); + return res; +} + +inline core::Ptr PhysicalProperties::centerOfMass() const +{ + core::Ptr res = centerOfMass_raw(); + return res; +} + +inline bool PhysicalProperties::getPrincipalAxes(core::Ptr& xAxis, core::Ptr& yAxis, core::Ptr& zAxis) const +{ + core::Vector3D* xAxis_ = nullptr; + core::Vector3D* yAxis_ = nullptr; + core::Vector3D* zAxis_ = nullptr; + + bool res = getPrincipalAxes_raw(xAxis_, yAxis_, zAxis_); + xAxis = xAxis_; + yAxis = yAxis_; + zAxis = zAxis_; + return res; +} + +inline bool PhysicalProperties::getPrincipalMomentsOfInertia(double& i1, double& i2, double& i3) const +{ + bool res = getPrincipalMomentsOfInertia_raw(i1, i2, i3); + return res; +} + +inline bool PhysicalProperties::getRadiusOfGyration(double& kx, double& ky, double& kz) const +{ + bool res = getRadiusOfGyration_raw(kx, ky, kz); + return res; +} + +inline bool PhysicalProperties::getRotationToPrincipal(double& rx, double& ry, double& rz) const +{ + bool res = getRotationToPrincipal_raw(rx, ry, rz); + return res; +} + +inline bool PhysicalProperties::getXYZMomentsOfInertia(double& xx, double& yy, double& zz, double& xy, double& yz, double& xz) const +{ + bool res = getXYZMomentsOfInertia_raw(xx, yy, zz, xy, yz, xz); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PHYSICALPROPERTIES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/SATExportOptions.h b/usr/autodesk/CPP/include/Fusion/Fusion/SATExportOptions.h new file mode 100644 index 0000000..1954651 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/SATExportOptions.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExportOptions.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SATEXPORTOPTIONS_CPP__ +# define ADSK_FUSION_SATEXPORTOPTIONS_API XI_EXPORT +# else +# define ADSK_FUSION_SATEXPORTOPTIONS_API +# endif +#else +# define ADSK_FUSION_SATEXPORTOPTIONS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Defines that a SAT export is to be done and specifies the various options. +class SATExportOptions : public ExportOptions { +public: + + ADSK_FUSION_SATEXPORTOPTIONS_API static const char* classType(); + ADSK_FUSION_SATEXPORTOPTIONS_API const char* objectType() const override; + ADSK_FUSION_SATEXPORTOPTIONS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SATEXPORTOPTIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SATEXPORTOPTIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/SMTExportOptions.h b/usr/autodesk/CPP/include/Fusion/Fusion/SMTExportOptions.h new file mode 100644 index 0000000..b22e189 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/SMTExportOptions.h @@ -0,0 +1,71 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExportOptions.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SMTEXPORTOPTIONS_CPP__ +# define ADSK_FUSION_SMTEXPORTOPTIONS_API XI_EXPORT +# else +# define ADSK_FUSION_SMTEXPORTOPTIONS_API +# endif +#else +# define ADSK_FUSION_SMTEXPORTOPTIONS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Defines that an SMT export is to be done and specifies the various options. +class SMTExportOptions : public ExportOptions { +public: + + /// Gets and set the version of the SMT format to write to. The default + /// is to use the current version of the Autodesk Shape Manager kernel + /// that Fusion 360 is using. Specifying an invalid version will result + /// in an assert. + /// Valid versions are 218 up to the current version, which is what this + /// property returns by default when a new SMTExportOptions object is + /// created. + int version() const; + bool version(int value); + + ADSK_FUSION_SMTEXPORTOPTIONS_API static const char* classType(); + ADSK_FUSION_SMTEXPORTOPTIONS_API const char* objectType() const override; + ADSK_FUSION_SMTEXPORTOPTIONS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SMTEXPORTOPTIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual int version_raw() const = 0; + virtual bool version_raw(int value) = 0; +}; + +// Inline wrappers + +inline int SMTExportOptions::version() const +{ + int res = version_raw(); + return res; +} + +inline bool SMTExportOptions::version(int value) +{ + return version_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SMTEXPORTOPTIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/STEPExportOptions.h b/usr/autodesk/CPP/include/Fusion/Fusion/STEPExportOptions.h new file mode 100644 index 0000000..db85afb --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/STEPExportOptions.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ExportOptions.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_STEPEXPORTOPTIONS_CPP__ +# define ADSK_FUSION_STEPEXPORTOPTIONS_API XI_EXPORT +# else +# define ADSK_FUSION_STEPEXPORTOPTIONS_API +# endif +#else +# define ADSK_FUSION_STEPEXPORTOPTIONS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Defines that a STEP export is to be done and specifies the various options. +class STEPExportOptions : public ExportOptions { +public: + + ADSK_FUSION_STEPEXPORTOPTIONS_API static const char* classType(); + ADSK_FUSION_STEPEXPORTOPTIONS_API const char* objectType() const override; + ADSK_FUSION_STEPEXPORTOPTIONS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_STEPEXPORTOPTIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_STEPEXPORTOPTIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/STLExportOptions.h b/usr/autodesk/CPP/include/Fusion/Fusion/STLExportOptions.h new file mode 100644 index 0000000..accca3b --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/STLExportOptions.h @@ -0,0 +1,256 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "ExportOptions.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_STLEXPORTOPTIONS_CPP__ +# define ADSK_FUSION_STLEXPORTOPTIONS_API XI_EXPORT +# else +# define ADSK_FUSION_STLEXPORTOPTIONS_API +# endif +#else +# define ADSK_FUSION_STLEXPORTOPTIONS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Defines that a STL export is to be done and specifies the various options. +class STLExportOptions : public ExportOptions { +public: + + /// Indicates if the STL file is to be an ASCII or binary STL format. The default is true. + bool isBinaryFormat() const; + bool isBinaryFormat(bool value); + + /// If the input is an Occurrence or the root Component, this specifies if a single file should be created containing + /// all of the bodies within that occurrence or component or if multiple files should be created; one for each body. + /// If multiple files are created, the body name is appended to the filename. The default is false. + bool isOneFilePerBody() const; + bool isOneFilePerBody(bool value); + + /// Gets and sets the current simple mesh refinement settings. Setting this property + /// will reset the surfaceDeviation, normalDeviation, maximumEdgeLength, and aspectRatio + /// to values that correspond to the specified mesh refinement. The default is MeshRefinementMedium + MeshRefinementSettings meshRefinement() const; + bool meshRefinement(MeshRefinementSettings value); + + /// Gets and sets the current surface deviation, or the distance the mesh can deviate + /// from the actual surface. This is defined in centimeter. Setting this property + /// will automatically set the meshRefinement to MeshRefinementCustom. The default is the value + /// associated with medium mesh refinement. + double surfaceDeviation() const; + bool surfaceDeviation(double value); + + /// Gets and sets the current normal deviation, or the angle the mesh normals at the vertices can deviate + /// from the actual surface normals. This is defined in radians. Setting this property + /// will automatically set the meshRefinement to MeshRefinementCustom. The default is the value + /// associated with medium mesh refinement. + double normalDeviation() const; + bool normalDeviation(double value); + + /// Gets and sets the maximum length of any mesh edge. This is defined in centimeter. Setting this property + /// will automatically set the meshRefinement to MeshRefinementCustom. The default is the value + /// associated with medium mesh refinement. + double maximumEdgeLength() const; + bool maximumEdgeLength(double value); + + /// Gets and sets the minimum aspect ratio for that triangles that are generated for the mesh. Setting this property + /// will automatically set the meshRefinement to MeshRefinementCustom. The default is the value + /// associated with medium mesh refinement. + double aspectRatio() const; + bool aspectRatio(double value); + + /// Returns a list of the known available print utilities. These strings can be used to set the PrintUtility + /// property to specify which print utility to open the STL file in. + std::vector availablePrintUtilities() const; + + /// Specifies which print utility to use when opening the STL file if the sendToPrintUtility property is true. + /// The value of this property can be one of the strings returned by the availalbePrintUtilities property, which + /// will specify one of the know print utilities. You can also specify a custom print utility by specifying + /// the full path to the print utility executable. The default value of this property is the last setting specified + /// in the user-interface. + std::string printUtility() const; + bool printUtility(const std::string& value); + + /// Gets and sets whether the created STL file will be sent to the print utility specified by the printUtility property. If this + /// is false a filename must be defined. + bool sendToPrintUtility() const; + bool sendToPrintUtility(bool value); + + ADSK_FUSION_STLEXPORTOPTIONS_API static const char* classType(); + ADSK_FUSION_STLEXPORTOPTIONS_API const char* objectType() const override; + ADSK_FUSION_STLEXPORTOPTIONS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_STLEXPORTOPTIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool isBinaryFormat_raw() const = 0; + virtual bool isBinaryFormat_raw(bool value) = 0; + virtual bool isOneFilePerBody_raw() const = 0; + virtual bool isOneFilePerBody_raw(bool value) = 0; + virtual MeshRefinementSettings meshRefinement_raw() const = 0; + virtual bool meshRefinement_raw(MeshRefinementSettings value) = 0; + virtual double surfaceDeviation_raw() const = 0; + virtual bool surfaceDeviation_raw(double value) = 0; + virtual double normalDeviation_raw() const = 0; + virtual bool normalDeviation_raw(double value) = 0; + virtual double maximumEdgeLength_raw() const = 0; + virtual bool maximumEdgeLength_raw(double value) = 0; + virtual double aspectRatio_raw() const = 0; + virtual bool aspectRatio_raw(double value) = 0; + virtual char** availablePrintUtilities_raw(size_t& return_size) const = 0; + virtual char* printUtility_raw() const = 0; + virtual bool printUtility_raw(const char * value) = 0; + virtual bool sendToPrintUtility_raw() const = 0; + virtual bool sendToPrintUtility_raw(bool value) = 0; +}; + +// Inline wrappers + +inline bool STLExportOptions::isBinaryFormat() const +{ + bool res = isBinaryFormat_raw(); + return res; +} + +inline bool STLExportOptions::isBinaryFormat(bool value) +{ + return isBinaryFormat_raw(value); +} + +inline bool STLExportOptions::isOneFilePerBody() const +{ + bool res = isOneFilePerBody_raw(); + return res; +} + +inline bool STLExportOptions::isOneFilePerBody(bool value) +{ + return isOneFilePerBody_raw(value); +} + +inline MeshRefinementSettings STLExportOptions::meshRefinement() const +{ + MeshRefinementSettings res = meshRefinement_raw(); + return res; +} + +inline bool STLExportOptions::meshRefinement(MeshRefinementSettings value) +{ + return meshRefinement_raw(value); +} + +inline double STLExportOptions::surfaceDeviation() const +{ + double res = surfaceDeviation_raw(); + return res; +} + +inline bool STLExportOptions::surfaceDeviation(double value) +{ + return surfaceDeviation_raw(value); +} + +inline double STLExportOptions::normalDeviation() const +{ + double res = normalDeviation_raw(); + return res; +} + +inline bool STLExportOptions::normalDeviation(double value) +{ + return normalDeviation_raw(value); +} + +inline double STLExportOptions::maximumEdgeLength() const +{ + double res = maximumEdgeLength_raw(); + return res; +} + +inline bool STLExportOptions::maximumEdgeLength(double value) +{ + return maximumEdgeLength_raw(value); +} + +inline double STLExportOptions::aspectRatio() const +{ + double res = aspectRatio_raw(); + return res; +} + +inline bool STLExportOptions::aspectRatio(double value) +{ + return aspectRatio_raw(value); +} + +inline std::vector STLExportOptions::availablePrintUtilities() const +{ + std::vector res; + size_t s; + + char** p= availablePrintUtilities_raw(s); + if(p) + { + res.resize(s); + for(size_t i=0; i + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SNAPSHOT_CPP__ +# define ADSK_FUSION_SNAPSHOT_API XI_EXPORT +# else +# define ADSK_FUSION_SNAPSHOT_API +# endif +#else +# define ADSK_FUSION_SNAPSHOT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class TimelineObject; +}} + +namespace adsk { namespace fusion { + +/// Object that represents a Snapshot in the timeline +class Snapshot : public core::Base { +public: + + /// Gets and sets the name of the snapshot as seen in the timeline. + std::string name() const; + bool name(const std::string& value); + + /// Returns the timeline object associated with this snapshot. + core::Ptr timelineObject() const; + + /// Deletes this snapshot. + /// Returns true if the delete was successful. + bool deleteMe(); + + ADSK_FUSION_SNAPSHOT_API static const char* classType(); + ADSK_FUSION_SNAPSHOT_API const char* objectType() const override; + ADSK_FUSION_SNAPSHOT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SNAPSHOT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual TimelineObject* timelineObject_raw() const = 0; + virtual bool deleteMe_raw() = 0; +}; + +// Inline wrappers + +inline std::string Snapshot::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool Snapshot::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline core::Ptr Snapshot::timelineObject() const +{ + core::Ptr res = timelineObject_raw(); + return res; +} + +inline bool Snapshot::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SNAPSHOT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/Snapshots.h b/usr/autodesk/CPP/include/Fusion/Fusion/Snapshots.h new file mode 100644 index 0000000..f1cdf21 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/Snapshots.h @@ -0,0 +1,122 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SNAPSHOTS_CPP__ +# define ADSK_FUSION_SNAPSHOTS_API XI_EXPORT +# else +# define ADSK_FUSION_SNAPSHOTS_API +# endif +#else +# define ADSK_FUSION_SNAPSHOTS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Snapshot; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the Snapshots within a design and provides +/// methods to create new Snapshots. +class Snapshots : public core::Base { +public: + + /// Creates a new snapshot. Creating a snapshot is only valid when the HasPendingTransforms property returns true. + /// Returns the newly created snapshot. + core::Ptr add(); + + /// Function that returns the specified snapshot in the collection using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of items in the collection. + size_t count() const; + + /// Indicates if there are any changes that have been made than can be snapshot. + bool hasPendingSnapshot() const; + + /// Reverts and changes that have been made that can be snapshot. This effectively + /// reverts the design back to the last snapshot. This is only valid when the + /// HasPendingSnapshot property returns true. + /// Returns true if the revert was successful. + bool revertPendingSnapshot(); + + typedef Snapshot iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SNAPSHOTS_API static const char* classType(); + ADSK_FUSION_SNAPSHOTS_API const char* objectType() const override; + ADSK_FUSION_SNAPSHOTS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SNAPSHOTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Snapshot* add_raw() = 0; + virtual Snapshot* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual bool hasPendingSnapshot_raw() const = 0; + virtual bool revertPendingSnapshot_raw() = 0; +}; + +// Inline wrappers + +inline core::Ptr Snapshots::add() +{ + core::Ptr res = add_raw(); + return res; +} + +inline core::Ptr Snapshots::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t Snapshots::count() const +{ + size_t res = count_raw(); + return res; +} + +inline bool Snapshots::hasPendingSnapshot() const +{ + bool res = hasPendingSnapshot_raw(); + return res; +} + +inline bool Snapshots::revertPendingSnapshot() +{ + bool res = revertPendingSnapshot_raw(); + return res; +} + +template inline void Snapshots::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SNAPSHOTS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/StringParameterValue.h b/usr/autodesk/CPP/include/Fusion/Fusion/StringParameterValue.h new file mode 100644 index 0000000..ed3fb79 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/StringParameterValue.h @@ -0,0 +1,73 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "ParameterValue.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_STRINGPARAMETERVALUE_CPP__ +# define ADSK_FUSION_STRINGPARAMETERVALUE_API XI_EXPORT +# else +# define ADSK_FUSION_STRINGPARAMETERVALUE_API +# endif +#else +# define ADSK_FUSION_STRINGPARAMETERVALUE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// A parameter value that is a string. +class StringParameterValue : public ParameterValue { +public: + + /// Get or set the value of the parameter. + std::string value() const; + bool value(const std::string& value); + + ADSK_FUSION_STRINGPARAMETERVALUE_API static const char* classType(); + ADSK_FUSION_STRINGPARAMETERVALUE_API const char* objectType() const override; + ADSK_FUSION_STRINGPARAMETERVALUE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_STRINGPARAMETERVALUE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* value_raw() const = 0; + virtual bool value_raw(const char * value) = 0; +}; + +// Inline wrappers + +inline std::string StringParameterValue::value() const +{ + std::string res; + + char* p= value_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool StringParameterValue::value(const std::string& value) +{ + return value_raw(value.c_str()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_STRINGPARAMETERVALUE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/Timeline.h b/usr/autodesk/CPP/include/Fusion/Fusion/Timeline.h new file mode 100644 index 0000000..c0c5589 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/Timeline.h @@ -0,0 +1,185 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TIMELINE_CPP__ +# define ADSK_FUSION_TIMELINE_API XI_EXPORT +# else +# define ADSK_FUSION_TIMELINE_API +# endif +#else +# define ADSK_FUSION_TIMELINE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class TimelineGroups; + class TimelineObject; +}} + +namespace adsk { namespace fusion { + +/// A collection of TimelineObjects in a parametric design. +class Timeline : public core::Base { +public: + + /// Moves the marker to the beginning of the timeline. + /// Returns true if the move is successful + bool moveToBeginning(); + + /// Moves the marker to the end of the timeline. + /// Returns true if the move is successful + bool moveToEnd(); + + /// Moves the marker to the next step in the timeline. + /// Returns true if the move is successful + bool movetoNextStep(); + + /// Moves the marker to the previous step in the timeline. + /// Returns true if the move is successful + bool moveToPreviousStep(); + + /// Plays the timeline beginning at the current position of the marker. + /// Returns true if playing the timeline was successful + bool play(); + + /// Gets and sets the current position of the marker where + /// 0 is at the beginning of the timeline and the value of Timeline.count is the end of the + /// timeline. + int markerPosition() const; + bool markerPosition(int value); + + /// Function that returns the specified item in the timeline using an index into the collection. + /// The items are returned in the order they appear in the timeline. + /// index : The index of the item within the collection to return. The first item in the collection + /// has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of items in the collection. + size_t count() const; + + /// Returns the collection of groups within the timeline. + core::Ptr timelineGroups() const; + + /// Deletes all objects in the timeline that are after the current position of the marker. + /// Returns true if successful. + bool deleteAllAfterMarker(); + + typedef TimelineObject iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_TIMELINE_API static const char* classType(); + ADSK_FUSION_TIMELINE_API const char* objectType() const override; + ADSK_FUSION_TIMELINE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TIMELINE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool moveToBeginning_raw() = 0; + virtual bool moveToEnd_raw() = 0; + virtual bool movetoNextStep_raw() = 0; + virtual bool moveToPreviousStep_raw() = 0; + virtual bool play_raw() = 0; + virtual int markerPosition_raw() const = 0; + virtual bool markerPosition_raw(int value) = 0; + virtual TimelineObject* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual TimelineGroups* timelineGroups_raw() const = 0; + virtual bool deleteAllAfterMarker_raw() = 0; +}; + +// Inline wrappers + +inline bool Timeline::moveToBeginning() +{ + bool res = moveToBeginning_raw(); + return res; +} + +inline bool Timeline::moveToEnd() +{ + bool res = moveToEnd_raw(); + return res; +} + +inline bool Timeline::movetoNextStep() +{ + bool res = movetoNextStep_raw(); + return res; +} + +inline bool Timeline::moveToPreviousStep() +{ + bool res = moveToPreviousStep_raw(); + return res; +} + +inline bool Timeline::play() +{ + bool res = play_raw(); + return res; +} + +inline int Timeline::markerPosition() const +{ + int res = markerPosition_raw(); + return res; +} + +inline bool Timeline::markerPosition(int value) +{ + return markerPosition_raw(value); +} + +inline core::Ptr Timeline::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t Timeline::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr Timeline::timelineGroups() const +{ + core::Ptr res = timelineGroups_raw(); + return res; +} + +inline bool Timeline::deleteAllAfterMarker() +{ + bool res = deleteAllAfterMarker_raw(); + return res; +} + +template inline void Timeline::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TIMELINE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/TimelineGroup.h b/usr/autodesk/CPP/include/Fusion/Fusion/TimelineGroup.h new file mode 100644 index 0000000..438d840 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/TimelineGroup.h @@ -0,0 +1,117 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "TimelineObject.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TIMELINEGROUP_CPP__ +# define ADSK_FUSION_TIMELINEGROUP_API XI_EXPORT +# else +# define ADSK_FUSION_TIMELINEGROUP_API +# endif +#else +# define ADSK_FUSION_TIMELINEGROUP_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class TimelineObject; +}} + +namespace adsk { namespace fusion { + +/// Represents a group in the timeline. +class TimelineGroup : public TimelineObject { +public: + + /// Deletes the group with the option of deleting or keeping the contents. + /// deleteGroupAndContents : Indicates if the group and its contents should be deleted or if only the group + /// should be deleted and the contents kept and expanded. A value of true will delete + /// the group and its contents. + /// Returns true if the delete was successful. + bool deleteMe(bool deleteGroupAndContents); + + /// Indicates if the group is collapsed or expanded. + bool isCollapsed() const; + bool isCollapsed(bool value); + + /// Function that returns the specified timeline object within the group using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of items in the group. + size_t count() const; + + typedef TimelineObject iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_TIMELINEGROUP_API static const char* classType(); + ADSK_FUSION_TIMELINEGROUP_API const char* objectType() const override; + ADSK_FUSION_TIMELINEGROUP_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TIMELINEGROUP_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool deleteMe_raw(bool deleteGroupAndContents) = 0; + virtual bool isCollapsed_raw() const = 0; + virtual bool isCollapsed_raw(bool value) = 0; + virtual TimelineObject* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline bool TimelineGroup::deleteMe(bool deleteGroupAndContents) +{ + bool res = deleteMe_raw(deleteGroupAndContents); + return res; +} + +inline bool TimelineGroup::isCollapsed() const +{ + bool res = isCollapsed_raw(); + return res; +} + +inline bool TimelineGroup::isCollapsed(bool value) +{ + return isCollapsed_raw(value); +} + +inline core::Ptr TimelineGroup::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t TimelineGroup::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void TimelineGroup::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TIMELINEGROUP_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/TimelineGroups.h b/usr/autodesk/CPP/include/Fusion/Fusion/TimelineGroups.h new file mode 100644 index 0000000..f4e9e45 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/TimelineGroups.h @@ -0,0 +1,103 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TIMELINEGROUPS_CPP__ +# define ADSK_FUSION_TIMELINEGROUPS_API XI_EXPORT +# else +# define ADSK_FUSION_TIMELINEGROUPS_API +# endif +#else +# define ADSK_FUSION_TIMELINEGROUPS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class TimelineGroup; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the time line groups within a design and provides +/// methods to create new groups. +class TimelineGroups : public core::Base { +public: + + /// Creates a new group within the timeline. The sequential set of items defined + /// by the start and end indices will be included in the group. A group cannot contains + /// another group so none of the items being grouped can be a group of this will fail. + /// startIndex : The index of the first item in the timeline that will be added to the group. + /// endIndex : The index of the last item in the timeline that will be added to the group. + /// Returns the created TimelineGroup object or null in the case of failure. + core::Ptr add(int startIndex, int endIndex); + + /// Function that returns the specified timeline group using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of items in the collection. + size_t count() const; + + typedef TimelineGroup iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_TIMELINEGROUPS_API static const char* classType(); + ADSK_FUSION_TIMELINEGROUPS_API const char* objectType() const override; + ADSK_FUSION_TIMELINEGROUPS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TIMELINEGROUPS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual TimelineGroup* add_raw(int startIndex, int endIndex) = 0; + virtual TimelineGroup* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr TimelineGroups::add(int startIndex, int endIndex) +{ + core::Ptr res = add_raw(startIndex, endIndex); + return res; +} + +inline core::Ptr TimelineGroups::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t TimelineGroups::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void TimelineGroups::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TIMELINEGROUPS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/TimelineObject.h b/usr/autodesk/CPP/include/Fusion/Fusion/TimelineObject.h new file mode 100644 index 0000000..daa7273 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/TimelineObject.h @@ -0,0 +1,284 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TIMELINEOBJECT_CPP__ +# define ADSK_FUSION_TIMELINEOBJECT_API XI_EXPORT +# else +# define ADSK_FUSION_TIMELINEOBJECT_API +# endif +#else +# define ADSK_FUSION_TIMELINEOBJECT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class TimelineGroup; +}} + +namespace adsk { namespace fusion { + +/// Represents an object in the timeline. +class TimelineObject : public core::Base { +public: + + /// Gets and sets if this object is suppressed. + bool isSuppressed() const; + bool isSuppressed(bool value); + + /// Returns the parent group, if this object is part of a group. + /// Returns null if this object is not part of a group. + core::Ptr parentGroup() const; + + /// Returns the position of this item within the timeline where + /// the first item has an index of 0. + /// This property can return -1 in the two cases where this object + /// is not currently represented in the timeline. The two cases are: + /// 1. When this is a TimelineGroup object and the group is expanded. + /// 2. When this object is part of a group and the group is collapsed. + int index() const; + + /// Indicates if this item is currently not being computed + /// because it has been rolled back. + /// If this is a timelineGroup object and the group is expanded + /// the value of this property should be ignored. + bool isRolledBack() const; + + /// Rolls the timeline by repositioning the marker to either before or after this object. + /// This method will fail if this is a timelineGroup object and the group is expanded. + /// rollBefore : Set rollBefore to true to reposition the marker before this object or to false to + /// reposition the marker after this object + /// Returns true if the move was successful + bool rollTo(bool rollBefore); + + /// Returns the entity associated with this timeline object. + /// Edit operations can be performed by getting the object + /// representing the associated entity and using the methods + /// and properties on that entity to make changes. + /// Returns null if this is a TimelineGroup object + core::Ptr entity() const; + + /// Checks to see if this object can be reordered to the specified position. + /// The default value of -1 indicates the end of the timeline. + /// This method will fail if this is a timelineGroup object and the group is expanded. + /// beforeIndex : The index number of the position in the timeline to check + /// Returns true if the object can be reordered to the specified position + bool canReorder(int beforeIndex = -1); + + /// Reorders this object to the position specified. + /// The default value of -1 indicates the end of the timeline. + /// beforeIndex : The index number of the position in the timeline to place this object before + /// Returns true if the reorder operation was successful + /// This method will fail and return false if this is a timelineGroup object and the + /// group is expanded. + bool reorder(int beforeIndex = -1); + + /// Indicates if this TimelineObject represents a group. If True you can + /// operate on this object as a TimelineGroup object. + bool isGroup() const; + + /// Gets and sets the name of this timeline object. This name is shared by the object + /// the timeline object represents. For example, if the TimelineObject represents a Sketch + /// and you change the name using the TimelineObject, the name of the sketch in the browser + /// is also changed. The reverse is also true. Setting the name of an object; sketch, feature + /// construction geometry, etc, will also change the name of the associated node in the timeline. + std::string name() const; + bool name(const std::string& value); + + /// Returns the current health state of the object associated with this TimelineObject. + FeatureHealthStates healthState() const; + + /// Returns the error or warning message in the case where the healthState property returns either + /// WarningFeatureHealthState or ErrorFeatureHealthState. Otherwise this property returns an empty string. + std::string errorOrWarningMessage() const; + + ADSK_FUSION_TIMELINEOBJECT_API static const char* classType(); + ADSK_FUSION_TIMELINEOBJECT_API const char* objectType() const override; + ADSK_FUSION_TIMELINEOBJECT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TIMELINEOBJECT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool isSuppressed_raw() const = 0; + virtual bool isSuppressed_raw(bool value) = 0; + virtual TimelineGroup* parentGroup_raw() const = 0; + virtual int index_raw() const = 0; + virtual bool isRolledBack_raw() const = 0; + virtual bool rollTo_raw(bool rollBefore) = 0; + virtual core::Base* entity_raw() const = 0; + virtual bool canReorder_raw(int beforeIndex) = 0; + virtual bool reorder_raw(int beforeIndex) = 0; + virtual bool isGroup_raw() const = 0; + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual FeatureHealthStates healthState_raw() const = 0; + virtual char* errorOrWarningMessage_raw() const = 0; + virtual void placeholderTimelineObject0() {} + virtual void placeholderTimelineObject1() {} + virtual void placeholderTimelineObject2() {} + virtual void placeholderTimelineObject3() {} + virtual void placeholderTimelineObject4() {} + virtual void placeholderTimelineObject5() {} + virtual void placeholderTimelineObject6() {} + virtual void placeholderTimelineObject7() {} + virtual void placeholderTimelineObject8() {} + virtual void placeholderTimelineObject9() {} + virtual void placeholderTimelineObject10() {} + virtual void placeholderTimelineObject11() {} + virtual void placeholderTimelineObject12() {} + virtual void placeholderTimelineObject13() {} + virtual void placeholderTimelineObject14() {} + virtual void placeholderTimelineObject15() {} + virtual void placeholderTimelineObject16() {} + virtual void placeholderTimelineObject17() {} + virtual void placeholderTimelineObject18() {} + virtual void placeholderTimelineObject19() {} + virtual void placeholderTimelineObject20() {} + virtual void placeholderTimelineObject21() {} + virtual void placeholderTimelineObject22() {} + virtual void placeholderTimelineObject23() {} + virtual void placeholderTimelineObject24() {} + virtual void placeholderTimelineObject25() {} + virtual void placeholderTimelineObject26() {} + virtual void placeholderTimelineObject27() {} + virtual void placeholderTimelineObject28() {} + virtual void placeholderTimelineObject29() {} + virtual void placeholderTimelineObject30() {} + virtual void placeholderTimelineObject31() {} + virtual void placeholderTimelineObject32() {} + virtual void placeholderTimelineObject33() {} + virtual void placeholderTimelineObject34() {} + virtual void placeholderTimelineObject35() {} + virtual void placeholderTimelineObject36() {} + virtual void placeholderTimelineObject37() {} + virtual void placeholderTimelineObject38() {} + virtual void placeholderTimelineObject39() {} + virtual void placeholderTimelineObject40() {} + virtual void placeholderTimelineObject41() {} + virtual void placeholderTimelineObject42() {} + virtual void placeholderTimelineObject43() {} + virtual void placeholderTimelineObject44() {} + virtual void placeholderTimelineObject45() {} + virtual void placeholderTimelineObject46() {} + virtual void placeholderTimelineObject47() {} + virtual void placeholderTimelineObject48() {} + virtual void placeholderTimelineObject49() {} +}; + +// Inline wrappers + +inline bool TimelineObject::isSuppressed() const +{ + bool res = isSuppressed_raw(); + return res; +} + +inline bool TimelineObject::isSuppressed(bool value) +{ + return isSuppressed_raw(value); +} + +inline core::Ptr TimelineObject::parentGroup() const +{ + core::Ptr res = parentGroup_raw(); + return res; +} + +inline int TimelineObject::index() const +{ + int res = index_raw(); + return res; +} + +inline bool TimelineObject::isRolledBack() const +{ + bool res = isRolledBack_raw(); + return res; +} + +inline bool TimelineObject::rollTo(bool rollBefore) +{ + bool res = rollTo_raw(rollBefore); + return res; +} + +inline core::Ptr TimelineObject::entity() const +{ + core::Ptr res = entity_raw(); + return res; +} + +inline bool TimelineObject::canReorder(int beforeIndex) +{ + bool res = canReorder_raw(beforeIndex); + return res; +} + +inline bool TimelineObject::reorder(int beforeIndex) +{ + bool res = reorder_raw(beforeIndex); + return res; +} + +inline bool TimelineObject::isGroup() const +{ + bool res = isGroup_raw(); + return res; +} + +inline std::string TimelineObject::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool TimelineObject::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline FeatureHealthStates TimelineObject::healthState() const +{ + FeatureHealthStates res = healthState_raw(); + return res; +} + +inline std::string TimelineObject::errorOrWarningMessage() const +{ + std::string res; + + char* p= errorOrWarningMessage_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TIMELINEOBJECT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/UserParameter.h b/usr/autodesk/CPP/include/Fusion/Fusion/UserParameter.h new file mode 100644 index 0000000..5129736 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/UserParameter.h @@ -0,0 +1,88 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "Parameter.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_USERPARAMETER_CPP__ +# define ADSK_FUSION_USERPARAMETER_API XI_EXPORT +# else +# define ADSK_FUSION_USERPARAMETER_API +# endif +#else +# define ADSK_FUSION_USERPARAMETER_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Design; + class UserParameters; +}} + +namespace adsk { namespace fusion { + +/// Represents a User Parameter. +class UserParameter : public Parameter { +public: + + /// Deletes the user parameter + /// A parameter can only be deleted if it is a UserParameter and + /// it is not referenced by other parameters. + /// Returns a bool indicating if the delete was successful or not. + /// Bug!!! Currently returning true if the parameter can't be deleted because it is + /// being referenced by other parameters. + bool deleteMe(); + + /// Returns the Collection containing the UserParameter. + core::Ptr userParameters() const; + + /// Returns the Design containing the UserParameter. + core::Ptr design() const; + + ADSK_FUSION_USERPARAMETER_API static const char* classType(); + ADSK_FUSION_USERPARAMETER_API const char* objectType() const override; + ADSK_FUSION_USERPARAMETER_API void* queryInterface(const char* id) const override; + ADSK_FUSION_USERPARAMETER_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool deleteMe_raw() = 0; + virtual UserParameters* userParameters_raw() const = 0; + virtual Design* design_raw() const = 0; +}; + +// Inline wrappers + +inline bool UserParameter::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline core::Ptr UserParameter::userParameters() const +{ + core::Ptr res = userParameters_raw(); + return res; +} + +inline core::Ptr UserParameter::design() const +{ + core::Ptr res = design_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_USERPARAMETER_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Fusion/UserParameters.h b/usr/autodesk/CPP/include/Fusion/Fusion/UserParameters.h new file mode 100644 index 0000000..8863bbc --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Fusion/UserParameters.h @@ -0,0 +1,148 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_USERPARAMETERS_CPP__ +# define ADSK_FUSION_USERPARAMETERS_API XI_EXPORT +# else +# define ADSK_FUSION_USERPARAMETERS_API +# endif +#else +# define ADSK_FUSION_USERPARAMETERS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Design; + class UserParameter; +}} +namespace adsk { namespace core { + class ValueInput; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the User Parameters within a design and provides +/// methods to create new user parameters. +class UserParameters : public core::Base { +public: + + /// Function that returns the specified User Parameter using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection + /// has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Function that returns the specified User Parameter using the name of the parameter + /// as it is displayed in the parameters dialog. + /// name : The name of the User Parameter as it is displayed in the parameters dialog + /// Returns the specified item or null if an invalid name was specified. + core::Ptr itemByName(const std::string& name) const; + + /// Returns the number of parameters in the collection. + size_t count() const; + + /// Returns the design that owns the user parameters collection. + core::Ptr design() const; + + /// Adds a new user parameter to the collection. + /// name : The name of the parameter. This is the name shown in the parameters dialog + /// value : ValueInput object that specifies the value of the parameter. If the ValueInput was created using a real, + /// the value will be interpreted using the internal unit for the unit type specified by the "units" argument. + /// For example, if the ValueInput was created using the real value 5 and the input to the "units" argument is + /// any valid length unit, the value will be interpreted as 5 centimeters since centimeters is the internal unit + /// for lengths. If the "units" argument is a valid angle unit the value will be interpreted as 5 radians. + /// If the ValueInput was created using a string, the string is used as-is for the expression of the parameter. + /// This means if there are units as part of the string it must evaluate to the same unit type as that specified + /// by the "units" argument and if no units are specified it will use the current default units specified for + /// the current document. For example, if the ValueInput was created with the string "5 in", then the "units" + /// argument must define any valid length so they are compatible. If the ValueInput was created with the string "5", + /// any unit type can be used and the result will be 5 of that unit. + /// When using a ValueInput created using a string, it's the same as creating a parameter in the user-interface. + /// You can specify any valid expression, i.e. "5", "5 in", "5 in / 2", "5 + Length", etc. and you can choose + /// from many different types of units. The only requirement is that the units must match in type. For example, + /// they must both be lengths, or they must both be angles. + /// units : The units to use for the value of the parameter. + /// Units specified must match the units specified (if any) in the ValueInput object. + /// To create a parameter with no units you can specify either an empty string. + /// comment : The comment to display in the parameters dialog. Specify an empty string ("") for no comment + /// Returns the newly created UserParameter or null if the creation failed. + core::Ptr add(const std::string& name, const core::Ptr& value, const std::string& units, const std::string& comment); + + typedef UserParameter iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_USERPARAMETERS_API static const char* classType(); + ADSK_FUSION_USERPARAMETERS_API const char* objectType() const override; + ADSK_FUSION_USERPARAMETERS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_USERPARAMETERS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual UserParameter* item_raw(size_t index) const = 0; + virtual UserParameter* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual Design* design_raw() const = 0; + virtual UserParameter* add_raw(const char * name, core::ValueInput* value, const char * units, const char * comment) = 0; +}; + +// Inline wrappers + +inline core::Ptr UserParameters::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr UserParameters::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t UserParameters::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr UserParameters::design() const +{ + core::Ptr res = design_raw(); + return res; +} + +inline core::Ptr UserParameters::add(const std::string& name, const core::Ptr& value, const std::string& units, const std::string& comment) +{ + core::Ptr res = add_raw(name.c_str(), value.get(), units.c_str(), comment.c_str()); + return res; +} + +template inline void UserParameters::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_USERPARAMETERS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/FusionAll.h b/usr/autodesk/CPP/include/Fusion/FusionAll.h new file mode 100644 index 0000000..48cdb82 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/FusionAll.h @@ -0,0 +1,446 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/usr/autodesk/CPP/include/Fusion/FusionTypeDefs.h b/usr/autodesk/CPP/include/Fusion/FusionTypeDefs.h new file mode 100644 index 0000000..c5df169 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/FusionTypeDefs.h @@ -0,0 +1,508 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once + +namespace adsk { namespace fusion { + +/// Types that define the nature of the relationship between a point and a containing entity. +enum PointContainment +{ + PointInsidePointContainment, + PointOnPointContainment, + PointOutsidePointContainment, + UnknownPointContainment +}; + +/// Defines the various options when converting the geometry of a B-Rep body or face +/// to NURBS. This is used by the convert method of the BRepBody and BRepFace objects. +enum BRepConvertOptions +{ + ProceduralToNURBSConversion, + AnalyticsToNURBSConversion, + PlanesToNURBSConversion, + SplitPeriodicFacesConversion = 4 +}; + +/// The different accuracy settings for calculating area and physical property related values. +/// The higher the accuracy setting, the longer it will take to perform the calculations. +enum CalculationAccuracy +{ + LowCalculationAccuracy, + MediumCalculationAccuracy, + HighCalculationAccuracy, + VeryHighCalculationAccuracy +}; + +/// Specifies the different types of corners that can be created when offsetting a wire body. +enum OffsetCornerTypes +{ + CircularOffsetCornerType, + LinearOffsetCornerType, + ExtendedOffsetCornerType +}; + +/// Defines the different type of boolean operations that are supported. +enum BooleanTypes +{ + DifferenceBooleanType, + IntersectionBooleanType, + UnionBooleanType +}; + +/// Used by the findBRepUsingRay and findBRepUsingPoint methods to specify the desired return type. +enum BRepEntityTypes +{ + BRepBodyEntityType, + BRepFaceEntityType, + BRepEdgeEntityType, + BRepVertexEntityType +}; + +/// Specifies the different types of directions that can be used to define directions of a joint. +enum JointDirections +{ + XAxisJointDirection, + YAxisJointDirection, + ZAxisJointDirection, + CustomJointDirection +}; + +/// The various states that a feature can be in. This is used for the +/// states of modeling features, construction geometry, and sketches. +enum FeatureHealthStates +{ + HealthyFeatureHealthState, + WarningFeatureHealthState, + ErrorFeatureHealthState, + SuppressedFeatureHealthState, + RolledBackFeatureHealthState, + UnknownFeatureHealthState +}; + +/// List of the various keypoints of geometry that can be used when defining joint geometry. +enum JointKeyPointTypes +{ + StartKeyPoint, + MiddleKeyPoint, + EndKeyPoint, + CenterKeyPoint +}; + +/// List of the different types of ways that geometry for a joint can be defined. +enum JointGeometryTypes +{ + JointConstructionPointGeometry, + JointSketchPointGeometry, + JointBRepVertexGeometry, + JointBRepEdgeGeometry, + JointSketchCurveGeometry, + JointProfileGeometry, + JointPlanarBRepFaceGeometry, + JointNonPlanarBRepFaceGeometry, + JointBetweenTwoPlanesGeometry +}; + +/// List of the various types of joints. +enum JointTypes +{ + RigidJointType, + RevoluteJointType, + SliderJointType, + CylindricalJointType, + PinSlotJointType, + PlanarJointType, + BallJointType +}; + +/// List of the valid extent directions. +enum ExtentDirections +{ + PositiveExtentDirection, + NegativeExtentDirection, + SymmetricExtentDirection +}; + +/// List of the different operations a feature can perform. +enum FeatureOperations +{ + JoinFeatureOperation, + CutFeatureOperation, + IntersectFeatureOperation, + NewBodyFeatureOperation, + NewComponentFeatureOperation +}; + +/// Specifies the different types of entities that can be patterned. +enum PatternEntityTypes +{ + FacesPatternType, + FeaturesPatternType, + BodiesPatternType, + OccurrencesPatternType +}; + +/// Used to indicate which type of extent is used for a feature. +enum FeatureExtentTypes +{ + OneSideFeatureExtentType, + TwoSidesFeatureExtentType, + SymmetricFeatureExtentType +}; + +/// List of Thin Extrude Wall Locations +enum ThinExtrudeWallLocation +{ + Side1, + Center, + Side2 +}; + +/// List of the different types of holes. +enum HoleTypes +{ + SimpleHoleType, + CounterboreHoleType, + CountersinkHoleType +}; + +/// List of the valid edge positions for holes. +enum HoleEdgePositions +{ + EdgeStartPointPosition, + EdgeMidPointPosition, + EdgeEndPointPosition +}; + +/// Specifies the type of corner to model when multiple edges come together at a vertex. +enum ChamferCornerTypes +{ + ChamferCornerType, + MiterCornerType, + BlendCornertype +}; + +/// List of the different ways a chamfer can be defined. +enum ChamferTypes +{ + EqualDistanceChamferType, + TwoDistancesChamferType, + DistanceAndAngleChamferType +}; + +/// Controls options used when creating a Path and determining the rules for how curves are +/// considered to be chained or connected. +enum ChainedCurveOptions +{ + noChainedCurves, + connectedChainedCurves, + tangentChainedCurves, + openEdgesChainedCurves, + tangentAndOpenEdgesChainedCurves +}; + +/// List of the types of sweep orientation. +enum SweepOrientationTypes +{ + ParallelOrientationType, + PerpendicularOrientationType +}; + +/// List of the sweep profile scaling options. +enum SweepProfileScalingOptions +{ + SweepProfileScaleOption, + SweepProfileStretchOption, + SweepProfileNoScalingOption +}; + +/// List of the types of sweep extent. +enum SweepExtentTypes +{ + PerpendicularToPathExtentType, + FullExtentsExtentType +}; + +/// List of the compute options for mirroring and patterning features in the parametric modeling environment. +enum PatternComputeOptions +{ + OptimizedPatternCompute, + IdenticalPatternCompute, + AdjustPatternCompute +}; + +/// Defines the different ways to specify the spacing between elements in a pattern. +enum PatternDistanceType +{ + ExtentPatternDistanceType, + SpacingPatternDistanceType +}; + +/// List of the types of thread location. +enum ThreadLocations +{ + HighEndThreadLocation, + LowEndThreadLocation +}; + +/// List of the ways to split a face using the split face feature. +enum SplitFaceSplitTypes +{ + surfaceIntersectionSplitType, + alongVectorSplitType, + closestPointSplitType +}; + +/// List of Silhouette Split feature operations. +enum SilhouetteSplitOperations +{ + SilhouetteSplitFacesOnlyOperation, + SilhouetteSplitShelledBodyOperation, + SilhouetteSplitSolidBodyOperation +}; + +/// List of the coil types. +enum CoilFeatureTypes +{ + RevolutionsAndHeightCoilFeatureType, + RevolutionsAndPitchCoilFeatureType, + HeightAndPitchCoilFeatureType, + SpiralCoilFeatureType +}; + +/// List of the section types of coil primitive feature. +enum CoilFeatureSectionTypes +{ + CircularCoilFeatureSectionType, + SquareCoilFeatureSectionType, + TriangularExternalCoilFeatureSectionType, + TriangularInternalCoilFeatureSectionType +}; + +/// List of the section positions of coil feature. +enum CoilFeatureSectionPositions +{ + InsideCoilFeatureSectionPosition, + OnCenterCoilFeatureSectionPosition, + OutsideCoilFeatureSectionPosition +}; + +/// List of Surface Continuity Types. +enum SurfaceContinuityTypes +{ + ConnectedSurfaceContinuityType, + TangentSurfaceContinuityType, + CurvatureSurfaceContinuityType +}; + +/// List of Surface Extend Types. +enum SurfaceExtendTypes +{ + NaturalSurfaceExtendType, + TangentSurfaceExtendType, + PerpendicularSurfaceExtendType +}; + +/// List of Surface Extend Alignments +enum SurfaceExtendAlignment +{ + FreeEdges, + AlignEdges +}; + +/// List of Ruled Surface Types. +enum RuledSurfaceTypes +{ + TangentRuledSurfaceType, + NormalRuledSurfaceType, + DirectionRuledSurfaceType +}; + +/// List of Ruled Surface corner types. +enum RuledSurfaceCornerTypes +{ + RoundedRuledSurfaceCornerType, + MiteredRuledSurfaceCornerType +}; + +/// List of Untrim Loop Types. +enum UntrimLoopTypes +{ + AllLoopsUntrimType, + ExternalLoopsUntrimType, + InternalLoopsUntrimType, + ManualLoopsUntrimType +}; + +/// Valid unit types for distance +enum DistanceUnits +{ + MillimeterDistanceUnits, + CentimeterDistanceUnits, + MeterDistanceUnits, + InchDistanceUnits, + FootDistanceUnits +}; + +/// The valid options for the Design History (default design type) setting. +enum DefaultDesignTypeOptions +{ + PromptForDesignTypeOption, + DirectDesignTypeOption, + ParametricDesignTypeOption +}; + +/// The valid options for the Default workspaces setting. +enum DefaultWorkspaces +{ + ModelWorkspace, + SculptWorkspace, + PatchWorkspace +}; + +/// Fusion 360 design types +enum DesignTypes +{ + DirectDesignType, + ParametricDesignType +}; + +/// The expression of the parameter. Setting this can fail because of an invalid expression or +/// because a cyclic reference is created between parameters. +enum ExpressionError +{ + CyclicParameterReferenceError = 200 +}; + +/// Specific error types for DeleteMe methods. +enum DeleteMeError +{ + ParameterReferencedByOtherParameterError = 200 +}; + +/// The different refinement settings supported when exporting the design as an STL or 3mf file. +enum MeshRefinementSettings +{ + MeshRefinementHigh, + MeshRefinementMedium, + MeshRefinementLow, + MeshRefinementCustom +}; + +/// The various culling modes supported by custom graphics. +enum CustomGraphicsCullModes +{ + CustomGraphicsCullFront, + CustomGraphicsCullBack, + CustomGraphicsCullNone +}; + +/// Specifies the different styles that can be used to control billboarding. +enum CustomGraphicsBillBoardStyles +{ + ScreenBillBoardStyle = 1, + AxialBillBoardStyle, + RightReadingBillBoardStyle +}; + +/// Specifies which of the four view corners custom graphics will be drawn in relation to. The +/// notUsedViewCorner setting indicates the graphics are not positioned with respect to the view. +enum ViewCorners +{ + upperLeftViewCorner, + upperRightViewCorner, + lowerLeftViewCorner, + lowerRightViewCorner +}; + +/// A list of predefined point images that you can use for a CustomGraphicsPointSet. +enum CustomGraphicsPointTypes +{ + UserDefinedCustomGraphicsPointType, + PointCloudCustomGraphicsPointType +}; + +/// Specifies the line styles that can be applied to custom graphics lines and curves. +enum LineStylePatterns +{ + continuousLineStylePattern, + centerLineStylePattern, + dashedLineStylePattern, + dotLineStylePattern, + hiddenLineStylePattern, + phantomLineStylePattern, + tracksLineStylePattern, + zigzagLineStylePattern +}; + +/// The unit types that can be specified when importing a .stl or .obj file as a mesh. +enum MeshUnits +{ + CentimeterMeshUnit, + MillimeterMeshUnit, + MeterMeshUnit, + InchMeshUnit, + FootMeshUnit +}; + +/// Types that indicate the level of quality of a triangle mesh. +enum TriangleMeshQualityOptions +{ + LowQualityTriangleMesh = 8, + NormalQualityTriangleMesh = 11, + HighQualityTriangleMesh = 13, + VeryHighQualityTriangleMesh = 15 +}; + +/// Used by the Sketch.projectToSurface method when defined how to project a curve onto a surface. +enum SurfaceProjectTypes +{ + ClosestPointSurfaceProjectType, + AlongVectorSurfaceProjectType +}; + +/// Defines the various text style formatting options that can be applied to text. These are +/// bitwise values to they can be combined. +enum TextStyles +{ + TextStyleBold = 1, + TextStyleItalic, + TextStyleUnderline = 4 +}; + +/// Defines the nine key points that exist for a sketch text box and +/// can be used as the origin when rotating the text. The named positions +/// are with respect to the text box. For example when the text box has +/// not been rotated the top-left key point will be the point in the upper-left +/// corner of the text box. If the text box has been rotated 180 degrees, +/// the top-left key point will be the point in the lower-right corner of +/// the text box. +enum TextBoxKeyPoints +{ + TopLeftTextBoxKeyPoint, + TopMiddleTextBoxKeyPoint, + TopRightTextBoxKeyPoint, + MiddleLeftTextBoxKeyPoint, + MiddleTextBoxKeyPoint, + MiddleRightTextBoxKeyPoint, + BottomLeftTextBoxKeyPoint, + BottomMiddleTextBoxKeyPoint, + BottomRightTextBoxKeyPoint +}; + +/// The different dimension orientations. +enum DimensionOrientations +{ + AlignedDimensionOrientation, + HorizontalDimensionOrientation, + VerticalDimensionOrientation +}; +}// namespace fusion +}// namespace adsk diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsAppearanceColorEffect.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsAppearanceColorEffect.h new file mode 100644 index 0000000..05d0a61 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsAppearanceColorEffect.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "CustomGraphicsColorEffect.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSAPPEARANCECOLOREFFECT_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSAPPEARANCECOLOREFFECT_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSAPPEARANCECOLOREFFECT_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSAPPEARANCECOLOREFFECT_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Appearance; +}} + +namespace adsk { namespace fusion { + +/// One of the types of color effects that can be applied to a custom graphics entity. With this +/// type of effect, the graphics entity will display using a Fusion appearance. +class CustomGraphicsAppearanceColorEffect : public CustomGraphicsColorEffect { +public: + + /// Statically creates a new CustomGraphicsAppearanceColorEffect object. This can be used when + /// setting the color property of the various custom graphics objects. With this coloring + /// effect, an existing appearance is used. The appearance must be avaialable in the + /// design where the graphics will be drawn. + /// appearance : The appearance to use. The appearance must be avaialable in the design where the + /// graphics will be drawn. + /// Returns the created CustomGraphicsAppearanceColorEffect or null in case of a failure. + static core::Ptr create(const core::Ptr& appearance); + + /// Gets and sets the appearance to use. The appearance assigned must be available in the + /// design where the graphics will be drawn. + core::Ptr appearance() const; + bool appearance(const core::Ptr& value); + + ADSK_FUSION_CUSTOMGRAPHICSAPPEARANCECOLOREFFECT_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSAPPEARANCECOLOREFFECT_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSAPPEARANCECOLOREFFECT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSAPPEARANCECOLOREFFECT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_CUSTOMGRAPHICSAPPEARANCECOLOREFFECT_API static CustomGraphicsAppearanceColorEffect* create_raw(core::Appearance* appearance); + virtual core::Appearance* appearance_raw() const = 0; + virtual bool appearance_raw(core::Appearance* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomGraphicsAppearanceColorEffect::create(const core::Ptr& appearance) +{ + core::Ptr res = create_raw(appearance.get()); + return res; +} + +inline core::Ptr CustomGraphicsAppearanceColorEffect::appearance() const +{ + core::Ptr res = appearance_raw(); + return res; +} + +inline bool CustomGraphicsAppearanceColorEffect::appearance(const core::Ptr& value) +{ + return appearance_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSAPPEARANCECOLOREFFECT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBRepBody.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBRepBody.h new file mode 100644 index 0000000..8c46bfc --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBRepBody.h @@ -0,0 +1,95 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "CustomGraphicsEntity.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSBREPBODY_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSBREPBODY_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSBREPBODY_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSBREPBODY_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class CustomGraphicsBRepEdges; + class CustomGraphicsBRepFaces; + class CustomGraphicsBRepVertices; +}} + +namespace adsk { namespace fusion { + +/// This represents custom graphics that are based on a BRepBody. +class CustomGraphicsBRepBody : public CustomGraphicsEntity { +public: + + /// Returns the collection of CustomGraphicsBRepFace objects in the CustomGraphicsBRepBody. + core::Ptr faces() const; + + /// Returns the collection of CustomGraphicsBRepEdge objects in the CustomGraphicsBRepBody. + core::Ptr edges() const; + + /// Returns the collection of CustomGraphicsBRepVertex objects in the CustomGraphicsBRepBody. + core::Ptr vertices() const; + + /// Returns a transient BRepBody that is being displayed as custom graphics. + core::Ptr bRepBody() const; + + ADSK_FUSION_CUSTOMGRAPHICSBREPBODY_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSBREPBODY_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSBREPBODY_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSBREPBODY_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CustomGraphicsBRepFaces* faces_raw() const = 0; + virtual CustomGraphicsBRepEdges* edges_raw() const = 0; + virtual CustomGraphicsBRepVertices* vertices_raw() const = 0; + virtual BRepBody* bRepBody_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomGraphicsBRepBody::faces() const +{ + core::Ptr res = faces_raw(); + return res; +} + +inline core::Ptr CustomGraphicsBRepBody::edges() const +{ + core::Ptr res = edges_raw(); + return res; +} + +inline core::Ptr CustomGraphicsBRepBody::vertices() const +{ + core::Ptr res = vertices_raw(); + return res; +} + +inline core::Ptr CustomGraphicsBRepBody::bRepBody() const +{ + core::Ptr res = bRepBody_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSBREPBODY_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBRepEdges.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBRepEdges.h new file mode 100644 index 0000000..e4462ab --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBRepEdges.h @@ -0,0 +1,49 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSBREPEDGES_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSBREPEDGES_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSBREPEDGES_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSBREPEDGES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// A collection of CustomGraphicsBRepEdge objects associated with a specific CustomGraphics body object. +class CustomGraphicsBRepEdges : public core::Base { +public: + + ADSK_FUSION_CUSTOMGRAPHICSBREPEDGES_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSBREPEDGES_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSBREPEDGES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSBREPEDGES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSBREPEDGES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBRepFaces.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBRepFaces.h new file mode 100644 index 0000000..14d496b --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBRepFaces.h @@ -0,0 +1,49 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSBREPFACES_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSBREPFACES_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSBREPFACES_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSBREPFACES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// A collection of CustomGraphicsBRepFace objects associated with a specific CustomGraphicsBRepBody object. +class CustomGraphicsBRepFaces : public core::Base { +public: + + ADSK_FUSION_CUSTOMGRAPHICSBREPFACES_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSBREPFACES_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSBREPFACES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSBREPFACES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSBREPFACES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBRepVertices.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBRepVertices.h new file mode 100644 index 0000000..62b3b8c --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBRepVertices.h @@ -0,0 +1,49 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSBREPVERTICES_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSBREPVERTICES_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSBREPVERTICES_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSBREPVERTICES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// A collection of CustomGraphicsBRepVertex objects associated with a specific CustomGraphics body object. +class CustomGraphicsBRepVertices : public core::Base { +public: + + ADSK_FUSION_CUSTOMGRAPHICSBREPVERTICES_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSBREPVERTICES_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSBREPVERTICES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSBREPVERTICES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSBREPVERTICES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBasicMaterialColorEffect.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBasicMaterialColorEffect.h new file mode 100644 index 0000000..e0ce099 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBasicMaterialColorEffect.h @@ -0,0 +1,194 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "CustomGraphicsColorEffect.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSBASICMATERIALCOLOREFFECT_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSBASICMATERIALCOLOREFFECT_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSBASICMATERIALCOLOREFFECT_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSBASICMATERIALCOLOREFFECT_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Color; +}} + +namespace adsk { namespace fusion { + +/// One of the types of color effects that can be applied to a custom graphics entity. With this type +/// of effect, basic phong shading and lighting techniques are used so give the entity a 3-dimensional +/// appearance. +class CustomGraphicsBasicMaterialColorEffect : public CustomGraphicsColorEffect { +public: + + /// Statically creates a new basic CustomGraphicsBasicMaterialColorEffect object. This can be used to + /// color custom graphics entities. With this type of effect you define the basic phong shading + /// properties so that the entity can be rendered with basic shading and lighting effects applied + /// so that it appears 3-dimensional. + /// If only the emmissive coloris provided, the API will automatically create values for the + /// other colors to render the object as a single color. + /// diffuseColor : The diffuse color is the color of reflected light as it scatters off of a rough surface and is + /// the primary color of the entity. This color is always required. + /// ambientColor : The ambient color is the color of the light anywhere there's not a specific light source. If + /// not specified the same color as the diffuse color is used. + /// specularColor : The specular color is the color of reflected light (highlights) as it is reflected off of a shiny surface. This is + /// commonly white or a lighter shade of the diffuse color. If not specified, white is used. + /// emissiveColor : The emissive color is the color of light that entity emits, such as in a light bulb. If not specified, + /// black for no emissive light is used. + /// glossiness : This specifies how glossy the entity is. The glossiness determines the size of highlights, and thus + /// the apparent shininess of the material. A value of 0.0 will result in very large hightlights like you + /// would see with a rough surface. A maximum valaue of 128.0 will result in very small highlight as + /// from a smooth surface. + /// opacity : Specifies the opacity of the entity where a value of 1.0 is completely opaque and 0.0 is completely transparent. + /// Returns the created CustomGraphicsBasicMaterialColorEffect or null in case of a failure. + static core::Ptr create(const core::Ptr& diffuseColor, const core::Ptr& ambientColor = core::Ptr(), const core::Ptr& specularColor = core::Ptr(), const core::Ptr& emissiveColor = core::Ptr(), double glossiness = 5, double opacity = 1); + + /// Gets and sets the emissiveColor associated with this CustomGraphicsBasicMaterialColorEffect object. + /// The emissive color is the primary color of the entity + core::Ptr emissiveColor() const; + bool emissiveColor(const core::Ptr& value); + + /// Gets and sets the ambientColor associated with this CustomGraphicsBasicMaterialColorEffect object. + /// The ambient color is the color of the light anywhere there's not a specific light source. + core::Ptr ambientColor() const; + bool ambientColor(const core::Ptr& value); + + /// Gets and sets the diffuseColor associated with this CustomGraphicsBasicMaterialColorEffect object. + /// The diffuse color is the color of reflected light as it scatters off of a rough surface. + core::Ptr diffuseColor() const; + bool diffuseColor(const core::Ptr& value); + + /// Gets and sets the specularColor associated with this CustomGraphicsBasicMaterialColorEffect object. + /// The specular color is the color of reflected light (highlights) as it is reflected off of a shiny surface. This is + /// commonly white or a lighter shade of the emissive color. + core::Ptr specularColor() const; + bool specularColor(const core::Ptr& value); + + /// Gets and sets the glossiness associated with this CustomGraphicsBasicMaterialColorEffect object. + /// The glossiness determines the size of highlights, and thus the apparent shininess of the material. + /// A value of 0.0 will result in very large hightlights like you would see with a rough surface. + /// A maximum valaue of 128.0 will result in very small highlight as from a smooth surface. + double glossiness() const; + bool glossiness(double value); + + /// Gets and sets the opacity associated with this CustomGraphicsBasicMaterialColorEffect object. + /// A value of 1.0 is completely opaque and 0.0 is completely transparent. + double opacity() const; + bool opacity(double value); + + ADSK_FUSION_CUSTOMGRAPHICSBASICMATERIALCOLOREFFECT_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSBASICMATERIALCOLOREFFECT_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSBASICMATERIALCOLOREFFECT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSBASICMATERIALCOLOREFFECT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_CUSTOMGRAPHICSBASICMATERIALCOLOREFFECT_API static CustomGraphicsBasicMaterialColorEffect* create_raw(core::Color* diffuseColor, core::Color* ambientColor, core::Color* specularColor, core::Color* emissiveColor, double glossiness, double opacity); + virtual core::Color* emissiveColor_raw() const = 0; + virtual bool emissiveColor_raw(core::Color* value) = 0; + virtual core::Color* ambientColor_raw() const = 0; + virtual bool ambientColor_raw(core::Color* value) = 0; + virtual core::Color* diffuseColor_raw() const = 0; + virtual bool diffuseColor_raw(core::Color* value) = 0; + virtual core::Color* specularColor_raw() const = 0; + virtual bool specularColor_raw(core::Color* value) = 0; + virtual double glossiness_raw() const = 0; + virtual bool glossiness_raw(double value) = 0; + virtual double opacity_raw() const = 0; + virtual bool opacity_raw(double value) = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomGraphicsBasicMaterialColorEffect::create(const core::Ptr& diffuseColor, const core::Ptr& ambientColor, const core::Ptr& specularColor, const core::Ptr& emissiveColor, double glossiness, double opacity) +{ + core::Ptr res = create_raw(diffuseColor.get(), ambientColor.get(), specularColor.get(), emissiveColor.get(), glossiness, opacity); + return res; +} + +inline core::Ptr CustomGraphicsBasicMaterialColorEffect::emissiveColor() const +{ + core::Ptr res = emissiveColor_raw(); + return res; +} + +inline bool CustomGraphicsBasicMaterialColorEffect::emissiveColor(const core::Ptr& value) +{ + return emissiveColor_raw(value.get()); +} + +inline core::Ptr CustomGraphicsBasicMaterialColorEffect::ambientColor() const +{ + core::Ptr res = ambientColor_raw(); + return res; +} + +inline bool CustomGraphicsBasicMaterialColorEffect::ambientColor(const core::Ptr& value) +{ + return ambientColor_raw(value.get()); +} + +inline core::Ptr CustomGraphicsBasicMaterialColorEffect::diffuseColor() const +{ + core::Ptr res = diffuseColor_raw(); + return res; +} + +inline bool CustomGraphicsBasicMaterialColorEffect::diffuseColor(const core::Ptr& value) +{ + return diffuseColor_raw(value.get()); +} + +inline core::Ptr CustomGraphicsBasicMaterialColorEffect::specularColor() const +{ + core::Ptr res = specularColor_raw(); + return res; +} + +inline bool CustomGraphicsBasicMaterialColorEffect::specularColor(const core::Ptr& value) +{ + return specularColor_raw(value.get()); +} + +inline double CustomGraphicsBasicMaterialColorEffect::glossiness() const +{ + double res = glossiness_raw(); + return res; +} + +inline bool CustomGraphicsBasicMaterialColorEffect::glossiness(double value) +{ + return glossiness_raw(value); +} + +inline double CustomGraphicsBasicMaterialColorEffect::opacity() const +{ + double res = opacity_raw(); + return res; +} + +inline bool CustomGraphicsBasicMaterialColorEffect::opacity(double value) +{ + return opacity_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSBASICMATERIALCOLOREFFECT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBillBoard.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBillBoard.h new file mode 100644 index 0000000..67a96aa --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsBillBoard.h @@ -0,0 +1,135 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSBILLBOARD_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSBILLBOARD_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSBILLBOARD_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSBILLBOARD_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Point3D; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// Used to specify if the orientation of custom graphics are defined relative to the screen instead of model space. +/// This is commonly used for legends and symbols that you want to always face the user, even as the +/// camera is rotated. +class CustomGraphicsBillBoard : public core::Base { +public: + + /// Creates a new CustomGraphicsBillBoard object that can be used when calling the billBoarding property + /// of the CustomGraphicsEntity object to specify the billboarding behavior of some custom graphics. Once + /// created you can assign it to a custom graphics entity using its billBoarding property. + /// anchorPoint : Specifies the coordinate that the graphics will anchor to. The anchor point is the point where the + /// custom graphics are anchored in world space. As the user manipulates the camera and rotates around + /// the model, making it appear that world space is rotating, the graphics remain facing the camera and + /// the anchor point defines the common location between world space and the graphics. + /// For graphics where the If the isViewDependent property of the graphics entity is true, then the + /// anchor point is defined in pixels relative to the upper-left corner of the view and the z component + /// of the input point is ignored. + /// Returns the newly created CustomGraphicsBillBoard object or null in the case of failure. This can be assigned + /// to a custom graphics entity using its billBoarding property. + static core::Ptr create(const core::Ptr& anchorPoint); + + /// Specifies the coordinate in model or view space that the graphics will anchor to. For graphics that + /// represent a label, this will typically be the point where the label attaches to the model. A + /// CustomGraphicsAnchorPoint can be created using the static create method on the CustomGraphicsAnchorPoint + /// object. + core::Ptr anchorPoint() const; + bool anchorPoint(const core::Ptr& value); + + /// Specifies the type of billboarding to use. When a new CustomGraphicsBillBoard object is created + /// this defaults to ScreenBillBoardStyle so the graphics will all be facing the view plane. It can also + /// be set to an arbitrary plane by setting this to AxialBillBoardStyle and can be defined so that it never + /// appear backwards by setting it to RightReadingBillBoardStyle. + CustomGraphicsBillBoardStyles billBoardStyle() const; + bool billBoardStyle(CustomGraphicsBillBoardStyles value); + + /// When the billBoardStyle property is set to AxialBillBoardStyle, this is used to control the direction + /// of the graphics. Otherwise it uses the x axis of the view. + core::Ptr axis() const; + bool axis(const core::Ptr& value); + + ADSK_FUSION_CUSTOMGRAPHICSBILLBOARD_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSBILLBOARD_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSBILLBOARD_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSBILLBOARD_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_CUSTOMGRAPHICSBILLBOARD_API static CustomGraphicsBillBoard* create_raw(core::Point3D* anchorPoint); + virtual core::Point3D* anchorPoint_raw() const = 0; + virtual bool anchorPoint_raw(core::Point3D* value) = 0; + virtual CustomGraphicsBillBoardStyles billBoardStyle_raw() const = 0; + virtual bool billBoardStyle_raw(CustomGraphicsBillBoardStyles value) = 0; + virtual core::Vector3D* axis_raw() const = 0; + virtual bool axis_raw(core::Vector3D* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomGraphicsBillBoard::create(const core::Ptr& anchorPoint) +{ + core::Ptr res = create_raw(anchorPoint.get()); + return res; +} + +inline core::Ptr CustomGraphicsBillBoard::anchorPoint() const +{ + core::Ptr res = anchorPoint_raw(); + return res; +} + +inline bool CustomGraphicsBillBoard::anchorPoint(const core::Ptr& value) +{ + return anchorPoint_raw(value.get()); +} + +inline CustomGraphicsBillBoardStyles CustomGraphicsBillBoard::billBoardStyle() const +{ + CustomGraphicsBillBoardStyles res = billBoardStyle_raw(); + return res; +} + +inline bool CustomGraphicsBillBoard::billBoardStyle(CustomGraphicsBillBoardStyles value) +{ + return billBoardStyle_raw(value); +} + +inline core::Ptr CustomGraphicsBillBoard::axis() const +{ + core::Ptr res = axis_raw(); + return res; +} + +inline bool CustomGraphicsBillBoard::axis(const core::Ptr& value) +{ + return axis_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSBILLBOARD_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsColorEffect.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsColorEffect.h new file mode 100644 index 0000000..d52e5b1 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsColorEffect.h @@ -0,0 +1,65 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSCOLOREFFECT_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSCOLOREFFECT_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSCOLOREFFECT_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSCOLOREFFECT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// The base class for all custom graphics color effects. +class CustomGraphicsColorEffect : public core::Base { +public: + + ADSK_FUSION_CUSTOMGRAPHICSCOLOREFFECT_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSCOLOREFFECT_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSCOLOREFFECT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSCOLOREFFECT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual void placeholderCustomGraphicsColorEffect0() {} + virtual void placeholderCustomGraphicsColorEffect1() {} + virtual void placeholderCustomGraphicsColorEffect2() {} + virtual void placeholderCustomGraphicsColorEffect3() {} + virtual void placeholderCustomGraphicsColorEffect4() {} + virtual void placeholderCustomGraphicsColorEffect5() {} + virtual void placeholderCustomGraphicsColorEffect6() {} + virtual void placeholderCustomGraphicsColorEffect7() {} + virtual void placeholderCustomGraphicsColorEffect8() {} + virtual void placeholderCustomGraphicsColorEffect9() {} + virtual void placeholderCustomGraphicsColorEffect10() {} + virtual void placeholderCustomGraphicsColorEffect11() {} + virtual void placeholderCustomGraphicsColorEffect12() {} + virtual void placeholderCustomGraphicsColorEffect13() {} + virtual void placeholderCustomGraphicsColorEffect14() {} + virtual void placeholderCustomGraphicsColorEffect15() {} +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSCOLOREFFECT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsCoordinates.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsCoordinates.h new file mode 100644 index 0000000..9a5ae29 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsCoordinates.h @@ -0,0 +1,184 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSCOORDINATES_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSCOORDINATES_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSCOORDINATES_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSCOORDINATES_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Color; + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// Represents coordinates that are used to define vertices in custom graphics. +class CustomGraphicsCoordinates : public core::Base { +public: + + /// Static method that creates a CustomGraphicsCoordinates object which can be used as input to + /// various custom graphics methods. + /// coordinates : An array of doubles where the values are the x, y, z components of each coordinate where + /// the unit of measure is centimeters. + /// Returns the created CustomGraphicsCoordinates object or null in the case of failure. + static core::Ptr create(const std::vector& coordinates); + + /// Gets and sets the coordinate data associated with this CustomGraphicsCoordinates object. + /// This data represents the x, y, z components of the coordinates where the unit of measure is centimeters. + std::vector coordinates() const; + bool coordinates(const std::vector& value); + + /// Returns the number of coordinates defined in the CustomGraphicsCoordinates object. + int coordinateCount() const; + + /// Gets the coordinate at the specified index. + /// index : The index of the coordinate to return. The first coordinate has an index of 0. + /// Returns the coordinate as a Point3D object. + core::Ptr getCoordinate(int index); + + /// Sets the coordinate at the specified index. + /// index : The index of the coordinate to set. The first coordinate has an index of 0. + /// coordinate : The coordinate value as a Point3D object. + /// Returns true if setting the coordinate was successful. + bool setCoordinate(int index, const core::Ptr& coordinate); + + /// Gets and sets the colors assoicated with the coordinate data. This is used when a mesh is + /// displayed using per-vertex coloring. + /// The color at each vertex is represented by four values where they are the red, green, blue, + /// and alpha values. This should contain the same number of colors as vertices. + std::vector colors() const; + bool colors(const std::vector& value); + + /// Gets the color assigned to the coordinate at the specified index. + /// index : The index of the color to return. The first color has an index of 0. + /// Returns the color associated with the index. Can also return null in the case + /// where there is no color assigned. + core::Ptr getColor(int index); + + /// Sets the color of the coordinate at the specified index. + /// index : The index of the coordinate to set. The first coordinate has an index of 0. + /// color : The color value as a Color object. + /// Returns true if setting the color was successful. + bool setColor(int index, const core::Ptr& color); + + ADSK_FUSION_CUSTOMGRAPHICSCOORDINATES_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSCOORDINATES_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSCOORDINATES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSCOORDINATES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_CUSTOMGRAPHICSCOORDINATES_API static CustomGraphicsCoordinates* create_raw(const double* coordinates, size_t coordinates_size); + virtual double* coordinates_raw(size_t& return_size) const = 0; + virtual bool coordinates_raw(const double* value, size_t value_size) = 0; + virtual int coordinateCount_raw() const = 0; + virtual core::Point3D* getCoordinate_raw(int index) = 0; + virtual bool setCoordinate_raw(int index, core::Point3D* coordinate) = 0; + virtual short* colors_raw(size_t& return_size) const = 0; + virtual bool colors_raw(const short* value, size_t value_size) = 0; + virtual core::Color* getColor_raw(int index) = 0; + virtual bool setColor_raw(int index, core::Color* color) = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomGraphicsCoordinates::create(const std::vector& coordinates) +{ + core::Ptr res = create_raw(coordinates.empty() ? NULL : &coordinates[0], coordinates.size()); + return res; +} + +inline std::vector CustomGraphicsCoordinates::coordinates() const +{ + std::vector res; + size_t s; + + double* p= coordinates_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomGraphicsCoordinates::coordinates(const std::vector& value) +{ + return coordinates_raw(value.empty() ? NULL : &value[0], value.size()); +} + +inline int CustomGraphicsCoordinates::coordinateCount() const +{ + int res = coordinateCount_raw(); + return res; +} + +inline core::Ptr CustomGraphicsCoordinates::getCoordinate(int index) +{ + core::Ptr res = getCoordinate_raw(index); + return res; +} + +inline bool CustomGraphicsCoordinates::setCoordinate(int index, const core::Ptr& coordinate) +{ + bool res = setCoordinate_raw(index, coordinate.get()); + return res; +} + +inline std::vector CustomGraphicsCoordinates::colors() const +{ + std::vector res; + size_t s; + + short* p= colors_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomGraphicsCoordinates::colors(const std::vector& value) +{ + return colors_raw(value.empty() ? NULL : &value[0], value.size()); +} + +inline core::Ptr CustomGraphicsCoordinates::getColor(int index) +{ + core::Ptr res = getColor_raw(index); + return res; +} + +inline bool CustomGraphicsCoordinates::setColor(int index, const core::Ptr& color) +{ + bool res = setColor_raw(index, color.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSCOORDINATES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsCurve.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsCurve.h new file mode 100644 index 0000000..cd5f825 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsCurve.h @@ -0,0 +1,90 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "CustomGraphicsEntity.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSCURVE_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSCURVE_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSCURVE_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSCURVE_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Curve3D; +}} + +namespace adsk { namespace fusion { + +/// This represents custom graphics that are based on any object derived from Curve3D (except InfiniteLine3D). +/// This is useful when drawing curved geometry where the alternative is to stroke the smooth curve and draw +/// it as a series of lines. Using this you can directly use the curve and Fusion 360 will automatically take care +/// of creating the correct display for the current level of detail. +class CustomGraphicsCurve : public CustomGraphicsEntity { +public: + + /// Gets and sets the curve associated with this graphics entity. Any of the curve types derived from Curve3D + /// is valid except for InfiniteLine3D. + core::Ptr curve() const; + bool curve(const core::Ptr& value); + + /// Defines the thickness of the curve in pixels. + double weight() const; + bool weight(double value); + + ADSK_FUSION_CUSTOMGRAPHICSCURVE_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSCURVE_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSCURVE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSCURVE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Curve3D* curve_raw() const = 0; + virtual bool curve_raw(core::Curve3D* value) = 0; + virtual double weight_raw() const = 0; + virtual bool weight_raw(double value) = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomGraphicsCurve::curve() const +{ + core::Ptr res = curve_raw(); + return res; +} + +inline bool CustomGraphicsCurve::curve(const core::Ptr& value) +{ + return curve_raw(value.get()); +} + +inline double CustomGraphicsCurve::weight() const +{ + double res = weight_raw(); + return res; +} + +inline bool CustomGraphicsCurve::weight(double value) +{ + return weight_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSCURVE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsEntity.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsEntity.h new file mode 100644 index 0000000..7b64ba1 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsEntity.h @@ -0,0 +1,373 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSENTITY_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSENTITY_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSENTITY_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSENTITY_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CustomGraphicsBillBoard; + class CustomGraphicsColorEffect; + class CustomGraphicsViewPlacement; + class CustomGraphicsViewScale; +}} +namespace adsk { namespace core { + class BoundingBox3D; + class Matrix3D; +}} + +namespace adsk { namespace fusion { + +/// The base class for all visible and selectable custom graphics objects. +class CustomGraphicsEntity : public core::Base { +public: + + /// Deletes the entity from the custom graphics group. + /// Returns true if the deletion was successful. + bool deleteMe(); + + /// Gets and sets if the graphics entity is visible in the graphics window. By + /// default, when a new entity is created it is visible. + bool isVisible() const; + bool isVisible(bool value); + + /// Gets and sets if the graphics entity is selectable within the graphics window. By + /// default, when a new entity is created it is selectable. + bool isSelectable() const; + bool isSelectable(bool value); + + /// Sets the opacity of the graphics entity. By default, when a new entity is it is + /// completely opaque and does not override the opacity defined by the material. + /// opacity : The opacity value where 1.0 is completely opaque and 0.0 is completely transparent. + /// isOverride : Indicates if this entities opacity will override the opacity defined by the material. + /// If true, it will override the material opacity and if false the opacity values will + /// accumulate. + /// Returns true if setting the opacity information was successful. + bool setOpacity(double opacity, bool isOverride); + + /// Gets the opacity of the graphics entity. + /// opacity : The opacity value where 1.0 is completely opaque and 0.0 is completely transparent. + /// isOverride : Indicates if this entities opacity will override the opacity defined by the material. + /// If true, it will override the material opacity and if false the opacity values will + /// accumulate. + /// Returns true if getting the opacity information was successful. + bool getOpacity(double& opacity, bool& isOverride); + + /// Gets and sets the transform associated with the graphics entity. When a new graphics + /// entity is created its default transform is an identity matrix which results in the graphics entity + /// being displayed in model space using the original coordinate data used to define the entity. + core::Ptr transform() const; + bool transform(const core::Ptr& value); + + /// Gets and sets the depth priority associated with the graphics entity. The depth priority defines + /// how one graphics entity will be drawn with respect to another entity. This is useful when there + /// are entities that lie in the same space so it's ambiguous which should be drawn on the other. For + /// example, if you draw a curve on a planar mesh and want the curve to be completely visible. You can + /// set the depth priority of the curve to be greater than the mesh so it will be drawn after the mesh + /// and will remain visible. + /// When a new graphics entity is created it's default depth priority is 0. + int depthPriority() const; + bool depthPriority(int value); + + /// Gets and sets the culling model to use when rendering the entity. Culling is used when the entity contains + /// a mesh or B-Rep faces and defines which sides of the mesh or face are rendered. This is primarily used + /// for a watertight mesh or solid B-Rep so that the "inside" of the faces is not rendered since it's never + /// visible to the user. + /// When a new graphics entity is created its default cull mode is CustomGraphicsCullBack which will optimize + /// the rendering of "solid" meshes so the inside is not rendered. + CustomGraphicsCullModes cullMode() const; + bool cullMode(CustomGraphicsCullModes value); + + /// Gets and sets the current color definition for this entity. The color of custom graphics can + /// be defined in many ways; solid color, simple material, and appearance. + core::Ptr color() const; + bool color(const core::Ptr& value); + + /// Returns the parent Component for a top-level group or the CustomGraphicsGroup object for + /// graphics entities and child groups. + core::Ptr parent() const; + + /// An id you can specify for the entity. By default, all new graphics entities do not have an id and + /// this property will return an empty string. But in cases where entities will be selected, assigning + /// an id can make understanding what was selected much easier. + std::string id() const; + bool id(const std::string& value); + + /// Returns a box oriented parallel to the world x-y-x axes that contains the graphics entity. + /// Depending on whether the graphics are drawn in model space or screen space this will return + /// the bounding box in either centimeters (model) or pixels (screen). In the case where it + /// returns the bounding box in pixel space, the Z coordinates of the box will be 0 and can be ignored. + core::Ptr boundingBox() const; + + /// Gets and sets the billboarding behavior of this custom graphics entity. To define billboarding + /// you can set this property using a CustomGraphicsBillBoard objects that you statically create using + /// the create method of the CustomGraphicsBillBoard class. To remove billboarding from this entity + /// you can set this property to null. + /// Billboarding is used to specify that the orientation of custom graphics is defined relative to the + /// screen instead of model space. This is commonly used for legends and symbols that you want to + /// always face the user, even as the camera is rotated. + core::Ptr billBoarding() const; + bool billBoarding(const core::Ptr& value); + + /// Gets and sets the graphics view placement being applied to this graphics entity. A + /// CustomGraphicsViewPlacement object can be created using the static create method of the + /// class. When assigned to a graphics entity the position of the graphics is defined + /// relative to the view in 2D view space (pixels) rather than in 3D model space (centimeters). + core::Ptr viewPlacement() const; + bool viewPlacement(const core::Ptr& value); + + /// Gets and sets the graphics view scale being applied to this graphics entity. A + /// CustomGraphicsViewScale object can be created using the static create method of the + /// class. When assigned to a graphics entity the size of the graphics entity is defined + /// in view space (pixels) instead of model space (centimeters). + core::Ptr viewScale() const; + bool viewScale(const core::Ptr& value); + + ADSK_FUSION_CUSTOMGRAPHICSENTITY_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSENTITY_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSENTITY_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSENTITY_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool deleteMe_raw() = 0; + virtual bool isVisible_raw() const = 0; + virtual bool isVisible_raw(bool value) = 0; + virtual bool isSelectable_raw() const = 0; + virtual bool isSelectable_raw(bool value) = 0; + virtual bool setOpacity_raw(double opacity, bool isOverride) = 0; + virtual bool getOpacity_raw(double& opacity, bool& isOverride) = 0; + virtual core::Matrix3D* transform_raw() const = 0; + virtual bool transform_raw(core::Matrix3D* value) = 0; + virtual int depthPriority_raw() const = 0; + virtual bool depthPriority_raw(int value) = 0; + virtual CustomGraphicsCullModes cullMode_raw() const = 0; + virtual bool cullMode_raw(CustomGraphicsCullModes value) = 0; + virtual CustomGraphicsColorEffect* color_raw() const = 0; + virtual bool color_raw(CustomGraphicsColorEffect* value) = 0; + virtual core::Base* parent_raw() const = 0; + virtual char* id_raw() const = 0; + virtual bool id_raw(const char * value) = 0; + virtual core::BoundingBox3D* boundingBox_raw() const = 0; + virtual CustomGraphicsBillBoard* billBoarding_raw() const = 0; + virtual bool billBoarding_raw(CustomGraphicsBillBoard* value) = 0; + virtual CustomGraphicsViewPlacement* viewPlacement_raw() const = 0; + virtual bool viewPlacement_raw(CustomGraphicsViewPlacement* value) = 0; + virtual CustomGraphicsViewScale* viewScale_raw() const = 0; + virtual bool viewScale_raw(CustomGraphicsViewScale* value) = 0; + virtual void placeholderCustomGraphicsEntity0() {} + virtual void placeholderCustomGraphicsEntity1() {} + virtual void placeholderCustomGraphicsEntity2() {} + virtual void placeholderCustomGraphicsEntity3() {} + virtual void placeholderCustomGraphicsEntity4() {} + virtual void placeholderCustomGraphicsEntity5() {} + virtual void placeholderCustomGraphicsEntity6() {} + virtual void placeholderCustomGraphicsEntity7() {} + virtual void placeholderCustomGraphicsEntity8() {} + virtual void placeholderCustomGraphicsEntity9() {} + virtual void placeholderCustomGraphicsEntity10() {} + virtual void placeholderCustomGraphicsEntity11() {} + virtual void placeholderCustomGraphicsEntity12() {} + virtual void placeholderCustomGraphicsEntity13() {} + virtual void placeholderCustomGraphicsEntity14() {} + virtual void placeholderCustomGraphicsEntity15() {} + virtual void placeholderCustomGraphicsEntity16() {} + virtual void placeholderCustomGraphicsEntity17() {} + virtual void placeholderCustomGraphicsEntity18() {} + virtual void placeholderCustomGraphicsEntity19() {} + virtual void placeholderCustomGraphicsEntity20() {} + virtual void placeholderCustomGraphicsEntity21() {} + virtual void placeholderCustomGraphicsEntity22() {} + virtual void placeholderCustomGraphicsEntity23() {} + virtual void placeholderCustomGraphicsEntity24() {} + virtual void placeholderCustomGraphicsEntity25() {} + virtual void placeholderCustomGraphicsEntity26() {} + virtual void placeholderCustomGraphicsEntity27() {} + virtual void placeholderCustomGraphicsEntity28() {} + virtual void placeholderCustomGraphicsEntity29() {} + virtual void placeholderCustomGraphicsEntity30() {} + virtual void placeholderCustomGraphicsEntity31() {} + virtual void placeholderCustomGraphicsEntity32() {} + virtual void placeholderCustomGraphicsEntity33() {} + virtual void placeholderCustomGraphicsEntity34() {} + virtual void placeholderCustomGraphicsEntity35() {} + virtual void placeholderCustomGraphicsEntity36() {} + virtual void placeholderCustomGraphicsEntity37() {} + virtual void placeholderCustomGraphicsEntity38() {} +}; + +// Inline wrappers + +inline bool CustomGraphicsEntity::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline bool CustomGraphicsEntity::isVisible() const +{ + bool res = isVisible_raw(); + return res; +} + +inline bool CustomGraphicsEntity::isVisible(bool value) +{ + return isVisible_raw(value); +} + +inline bool CustomGraphicsEntity::isSelectable() const +{ + bool res = isSelectable_raw(); + return res; +} + +inline bool CustomGraphicsEntity::isSelectable(bool value) +{ + return isSelectable_raw(value); +} + +inline bool CustomGraphicsEntity::setOpacity(double opacity, bool isOverride) +{ + bool res = setOpacity_raw(opacity, isOverride); + return res; +} + +inline bool CustomGraphicsEntity::getOpacity(double& opacity, bool& isOverride) +{ + bool res = getOpacity_raw(opacity, isOverride); + return res; +} + +inline core::Ptr CustomGraphicsEntity::transform() const +{ + core::Ptr res = transform_raw(); + return res; +} + +inline bool CustomGraphicsEntity::transform(const core::Ptr& value) +{ + return transform_raw(value.get()); +} + +inline int CustomGraphicsEntity::depthPriority() const +{ + int res = depthPriority_raw(); + return res; +} + +inline bool CustomGraphicsEntity::depthPriority(int value) +{ + return depthPriority_raw(value); +} + +inline CustomGraphicsCullModes CustomGraphicsEntity::cullMode() const +{ + CustomGraphicsCullModes res = cullMode_raw(); + return res; +} + +inline bool CustomGraphicsEntity::cullMode(CustomGraphicsCullModes value) +{ + return cullMode_raw(value); +} + +inline core::Ptr CustomGraphicsEntity::color() const +{ + core::Ptr res = color_raw(); + return res; +} + +inline bool CustomGraphicsEntity::color(const core::Ptr& value) +{ + return color_raw(value.get()); +} + +inline core::Ptr CustomGraphicsEntity::parent() const +{ + core::Ptr res = parent_raw(); + return res; +} + +inline std::string CustomGraphicsEntity::id() const +{ + std::string res; + + char* p= id_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomGraphicsEntity::id(const std::string& value) +{ + return id_raw(value.c_str()); +} + +inline core::Ptr CustomGraphicsEntity::boundingBox() const +{ + core::Ptr res = boundingBox_raw(); + return res; +} + +inline core::Ptr CustomGraphicsEntity::billBoarding() const +{ + core::Ptr res = billBoarding_raw(); + return res; +} + +inline bool CustomGraphicsEntity::billBoarding(const core::Ptr& value) +{ + return billBoarding_raw(value.get()); +} + +inline core::Ptr CustomGraphicsEntity::viewPlacement() const +{ + core::Ptr res = viewPlacement_raw(); + return res; +} + +inline bool CustomGraphicsEntity::viewPlacement(const core::Ptr& value) +{ + return viewPlacement_raw(value.get()); +} + +inline core::Ptr CustomGraphicsEntity::viewScale() const +{ + core::Ptr res = viewScale_raw(); + return res; +} + +inline bool CustomGraphicsEntity::viewScale(const core::Ptr& value) +{ + return viewScale_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSENTITY_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsGroup.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsGroup.h new file mode 100644 index 0000000..227a3dc --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsGroup.h @@ -0,0 +1,228 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "CustomGraphicsEntity.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSGROUP_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSGROUP_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSGROUP_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSGROUP_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class CustomGraphicsBRepBody; + class CustomGraphicsCoordinates; + class CustomGraphicsCurve; + class CustomGraphicsEntity; + class CustomGraphicsLines; + class CustomGraphicsMesh; + class CustomGraphicsPointSet; + class CustomGraphicsText; +}} +namespace adsk { namespace core { + class Curve3D; + class Matrix3D; +}} + +namespace adsk { namespace fusion { + +/// Represents of group of custom graphics entities. A group can also own other graphics groups. +class CustomGraphicsGroup : public CustomGraphicsEntity { +public: + + /// Function that returns the specified custom graphics entity within this group. This also includes + /// any child graphics groups. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of graphics entities within the group. + size_t count() const; + + /// Creates a new, empty CustomGraphicsGroup that is owned by this CustomGraphicsGroup. + /// Returns the new CustomGraphicsGroup object or null in the case of a failure. + core::Ptr addGroup(); + + /// Adds a new CustomGraphicsMesh entity to this group. + /// coordinates : The CustomGraphicsCoordinates object that defines the coordinates of the vertices of the mesh. + /// A CustomGrahpicsCoordinates object can be created using the static create method of the CustomGraphicsCoordinates class. + /// coordinateIndexList : An array of integers that represent indices into the coordinates to define the vertices of the triangles. If an empty + /// array is provided, then it's assumed that the first three coordinates defines the first triangle, the next three define + /// the second triangle, and so on. + /// normalVectors : An array of doubles that represent the x, y, z components of the normals at each coordinate. There should be a normal defined + /// for each coordinate. If an empty array is provided for the normal vectors, Fusion 360 will automatically calculate normal vectors + /// that are 90 degrees to the face of the triangle, making it appear flat. + /// normalIndexList : An array of integers that represent indices into the normal vectors to define the which vector corresponds to which vertex. This + /// should be the same size as the vertex index list. If an empty array is input and normal vectors are provided, it is assumed that + /// the normals match up one-to-one to each coordinate. + /// Returns the new CustomGraphicsMesh object or null in the case of a failure. + core::Ptr addMesh(const core::Ptr& coordinates, const std::vector& coordinateIndexList, const std::vector& normalVectors, const std::vector& normalIndexList); + + /// Adds a new CustomGraphicsLines entity to this group. + /// coordinates : The CustomGraphicsCoordinates object that defines the coordinates of the vertices of the lines. + /// A CustomGraphicsCoordinates object can be created using the static create method of the CustomGraphicsCoordinates class. + /// indexList : An array of integers that represent indices into the coordinates to define the order the coordinates are used to draw the lines. + /// If an empty array is provided, the coordinates are used in the order they're provided in the provided CustomGraphicsCoordinates object. + /// isLineStrip : A boolean indicating if a series of individual lines or a connected set of lines (a line strip) is to be drawn. If individual lines + /// are drawn, (this argument is false), each pair of coordinates defines a single line. If a line strip is drawn, (this argument is true), + /// the first pair of coordinates define the first line and the third coordinate defines a line that connects to the second coordinate. + /// The fourth coordinate creates a line connecting to the third coordinate, and so on. + /// lineStripLengths : If isLineStrip is true, this argument is used to define the number of coordinates to use in each line strip. It is an array of integers + /// that defines the number of coordinates for each line strip. For example, if the array [4,10] is input, 4 coordinates are connected for + /// the first line strip and 10 are used to create a second line strip. If an empty array is provided, a single line strip is created. If + /// isLineStrip is False, this argument is ignored. + /// Returns the new CustomGraphicsLines object or null in the case of a failure. + core::Ptr addLines(const core::Ptr& coordinates, const std::vector& indexList, bool isLineStrip, const std::vector& lineStripLengths = std::vector()); + + /// Adds a new CustomGraphicsCurve entity to this group. A CustomGraphicsCurve is a wireframe graphic + /// that is based on any object derived from Curve3D (except InfiniteLine3D). This is useful when + /// drawing curved geometry where the alternative is to stroke the smooth curve and draw it as a series + /// of lines. Using this you can directly use the curve and Fusion 360 will automatically take care of creating + /// the correct display for the current level of detail. + /// curve : The curve that defines the shape of the graphics entity. Any of the curve types derived from Curve3D + /// are valid except for InfiniteLine3D. + /// Returns the newly created CustomGraphicsCurve object or null in the case of failure. + core::Ptr addCurve(const core::Ptr& curve); + + /// Adds a new CustomGraphicsPointSet entity to this group. This will be displayed as one or more points where + /// all of the points will display using the same image. + /// coordinates : The CustomGraphicsCoordinates object that defines the coordinates where the points will be displayed. + /// A CustomGraphicsCoordinates object can be created using the static create method of the CustomGraphicsCoordinates class. + /// indexList : An array of integers that represent indices into the coordinates to define which coordinates to use when drawing points. + /// If an empty array is provided, a point is drawn for every coordinate. + /// pointType : Specifies the type of point to display. Currently there are two choices; UserDefinedCustomGraphicsPointType and + /// PointCloudCustomGraphicsPointType. When set to PointCloudCustomGraphicsPointType, each point displays as a single pixel and is + /// the most efficient point display type for displaying sets that contain very large quantities of points. When + /// set to UserDefinedCustomGraphicsPointType, you specify the image to display as the point. This can be any png image and is + /// centered on the point. + /// pointImage : If the pointType is PointCloudCustomGraphicsPointType this argument is ignored and can be an empty string. This argument + /// must be specified if the pointType is UserDefinedCustomGraphicsPointType. This is the path to the png image file that will be + /// displayed as the point. It can be either a full path to the file or a relative path that is respect to the .py, dll, or dylib + /// file being run. There is no restriction on the size of the image, but generally very small images would be used for points. + /// Returns the newly created CustomGraphicsPointSet object or null in the case of failure. + core::Ptr addPointSet(const core::Ptr& coordinates, const std::vector& indexList, CustomGraphicsPointTypes pointType, const std::string& pointImage); + + /// Adds a new CustomGraphicsText entity to this group. This will be displayed as a single line of text. + /// It is placed so that the upper-left corner is at the point defined and the text will be parallel + /// to the X-Y plane of the world coordinate system and in the X direction. To change it's position relative + /// to the input point you can change the horizontal and vertical justification on the returnsed CustomGrahicsText + /// object. You can also reorient the text by changing the transform of the returned CustomGraphicsText object. + /// formattedText : The text string to be displayed. Overall formatting can be defined using properties on the returned + /// CustomGraphicsText object. Formatting overrides can be defined within the string using formatting codes. + /// font : The name of the font to use when displaying the text. + /// size : The size of the text in centimeters. + /// transform : Transformation matrix that specifies the position and orientation of the text in model space. The origin of the text + /// is the upper-left corner. + /// Returns the newly created CustomGraphicsText object or null in the case of failure. + core::Ptr addText(const std::string& formattedText, const std::string& font, double size, const core::Ptr& transform); + + /// Adds a new CustomGraphicsBRepBody object to this group. This displays a real or transient BRepBody + /// object as custom graphics. No relationship exists back to the original input body so if it is + /// changed, the custom graphics will not change. + /// The body associated with the CustomGraphicsBRep body is a copy of the original input body. Equivalent + /// Faces, Edges, and vertices can be found by using the indexes in the collection. For example if you have + /// a face of the original body and find that it is at index 24 in the BRepFaces collection of that body, + /// the equivalent face in the custom graphics body will also be at index 24. This works as long as the original + /// body is not modified in any way. + /// body : The real or transient BRepBody object to draw using custom graphics. + /// Returns the newly created CustomGraphicsBRepBody object or null in the case of failure. + core::Ptr addBRepBody(const core::Ptr& body); + + ADSK_FUSION_CUSTOMGRAPHICSGROUP_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSGROUP_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSGROUP_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSGROUP_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CustomGraphicsEntity* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual CustomGraphicsGroup* addGroup_raw() = 0; + virtual CustomGraphicsMesh* addMesh_raw(CustomGraphicsCoordinates* coordinates, const int* coordinateIndexList, size_t coordinateIndexList_size, const double* normalVectors, size_t normalVectors_size, const int* normalIndexList, size_t normalIndexList_size) = 0; + virtual CustomGraphicsLines* addLines_raw(CustomGraphicsCoordinates* coordinates, const int* indexList, size_t indexList_size, bool isLineStrip, const int* lineStripLengths, size_t lineStripLengths_size) = 0; + virtual CustomGraphicsCurve* addCurve_raw(core::Curve3D* curve) = 0; + virtual CustomGraphicsPointSet* addPointSet_raw(CustomGraphicsCoordinates* coordinates, const int* indexList, size_t indexList_size, CustomGraphicsPointTypes pointType, const char * pointImage) = 0; + virtual CustomGraphicsText* addText_raw(const char * formattedText, const char * font, double size, core::Matrix3D* transform) = 0; + virtual CustomGraphicsBRepBody* addBRepBody_raw(BRepBody* body) = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomGraphicsGroup::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t CustomGraphicsGroup::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr CustomGraphicsGroup::addGroup() +{ + core::Ptr res = addGroup_raw(); + return res; +} + +inline core::Ptr CustomGraphicsGroup::addMesh(const core::Ptr& coordinates, const std::vector& coordinateIndexList, const std::vector& normalVectors, const std::vector& normalIndexList) +{ + core::Ptr res = addMesh_raw(coordinates.get(), coordinateIndexList.empty() ? NULL : &coordinateIndexList[0], coordinateIndexList.size(), normalVectors.empty() ? NULL : &normalVectors[0], normalVectors.size(), normalIndexList.empty() ? NULL : &normalIndexList[0], normalIndexList.size()); + return res; +} + +inline core::Ptr CustomGraphicsGroup::addLines(const core::Ptr& coordinates, const std::vector& indexList, bool isLineStrip, const std::vector& lineStripLengths) +{ + core::Ptr res = addLines_raw(coordinates.get(), indexList.empty() ? NULL : &indexList[0], indexList.size(), isLineStrip, lineStripLengths.empty() ? NULL : &lineStripLengths[0], lineStripLengths.size()); + return res; +} + +inline core::Ptr CustomGraphicsGroup::addCurve(const core::Ptr& curve) +{ + core::Ptr res = addCurve_raw(curve.get()); + return res; +} + +inline core::Ptr CustomGraphicsGroup::addPointSet(const core::Ptr& coordinates, const std::vector& indexList, CustomGraphicsPointTypes pointType, const std::string& pointImage) +{ + core::Ptr res = addPointSet_raw(coordinates.get(), indexList.empty() ? NULL : &indexList[0], indexList.size(), pointType, pointImage.c_str()); + return res; +} + +inline core::Ptr CustomGraphicsGroup::addText(const std::string& formattedText, const std::string& font, double size, const core::Ptr& transform) +{ + core::Ptr res = addText_raw(formattedText.c_str(), font.c_str(), size, transform.get()); + return res; +} + +inline core::Ptr CustomGraphicsGroup::addBRepBody(const core::Ptr& body) +{ + core::Ptr res = addBRepBody_raw(body.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSGROUP_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsGroups.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsGroups.h new file mode 100644 index 0000000..789ae45 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsGroups.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSGROUPS_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSGROUPS_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSGROUPS_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSGROUPS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CustomGraphicsGroup; +}} + +namespace adsk { namespace fusion { + +/// Provides access to a set of graphics groups that are either associated with a component or owned by another +/// CustomGraphicsGroup object. This object also supports the creation of new custom graphics groups. +class CustomGraphicsGroups : public core::Base { +public: + + /// Function that returns the specified graphics group using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of graphics groups in the collection. + size_t count() const; + + /// Creates a new, empty CustomGraphicsGroup. + /// Returns the new CustomGraphicsGroup object or null in the case of a failure. + core::Ptr add(); + + ADSK_FUSION_CUSTOMGRAPHICSGROUPS_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSGROUPS_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSGROUPS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSGROUPS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CustomGraphicsGroup* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual CustomGraphicsGroup* add_raw() = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomGraphicsGroups::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t CustomGraphicsGroups::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr CustomGraphicsGroups::add() +{ + core::Ptr res = add_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSGROUPS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsLines.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsLines.h new file mode 100644 index 0000000..6eed256 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsLines.h @@ -0,0 +1,217 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "CustomGraphicsEntity.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSLINES_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSLINES_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSLINES_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSLINES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CustomGraphicsCoordinates; +}} + +namespace adsk { namespace fusion { + +/// Represents lines drawn in the graphics window. +class CustomGraphicsLines : public CustomGraphicsEntity { +public: + + /// Gets and sets the CustomGraphicsCoordinates object that defines the coordinates of the vertices of the lines. + /// A CustomGraphicsCoordinates object can be created using the static create method of the CustomGraphicsCoordinates class. + core::Ptr coordinates() const; + bool coordinates(const core::Ptr& value); + + /// Gets and sets an array of integers that represent indices into the coordinates to define the order the coordinates are used to draw the lines. + /// An empty array indicates that no index list is used and coordinates are used in the order they're provided in the provided CustomGraphicsCoordinates object. + std::vector indexList() const; + bool indexList(const std::vector& value); + + /// Defines if the coordinates are used to define a series of individual lines or a connected set of lines (line strip). If individual lines + /// are drawn (this property is false), each pair of coordinates define a single line. If a line strip is drawn (this property is true), + /// the first pair of coordinates define the first line and the third coordinate defines a line that connects to the second coordinate. + /// The fourth coordinate creates a line connecting to the third coordinate, and so on. + bool isLineStrip() const; + bool isLineStrip(bool value); + + /// If isLineStrip is true, this property defines the number of coordinates to use in the line strips. It is an array of integers + /// that defines the number of coordinates for each line strip. An empty array indicates that a single line strip is to be drawn. + std::vector lineStripLengths() const; + bool lineStripLengths(const std::vector& value); + + /// Defines the thickness of the line in pixels. + double weight() const; + bool weight(double value); + + /// Defines the scale as it relates to how the line style is applied. The effect is to + /// shrink or expand the line style as it is applied to the line. This does not affect the line width. + double lineStyleScale() const; + bool lineStyleScale(double value); + + /// Specifies if the line style is computed based on the screen or model space. The default is + /// based on the screen which means the style is drawn the same regardless of how you zoom in + /// or out of the view. That is the length of lines and spaces are based on pixels. If it + /// is drawn relative to model space then the lines and spaces are defined in centimeters and + /// will zooming in and out will change the apparent spacing. + bool isScreenSpaceLineStyle() const; + bool isScreenSpaceLineStyle(bool value); + + /// The line style to apply to the line. The default is to draw a continuous line. + LineStylePatterns lineStylePattern() const; + bool lineStylePattern(LineStylePatterns value); + + ADSK_FUSION_CUSTOMGRAPHICSLINES_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSLINES_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSLINES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSLINES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CustomGraphicsCoordinates* coordinates_raw() const = 0; + virtual bool coordinates_raw(CustomGraphicsCoordinates* value) = 0; + virtual int* indexList_raw(size_t& return_size) const = 0; + virtual bool indexList_raw(const int* value, size_t value_size) = 0; + virtual bool isLineStrip_raw() const = 0; + virtual bool isLineStrip_raw(bool value) = 0; + virtual int* lineStripLengths_raw(size_t& return_size) const = 0; + virtual bool lineStripLengths_raw(const int* value, size_t value_size) = 0; + virtual double weight_raw() const = 0; + virtual bool weight_raw(double value) = 0; + virtual double lineStyleScale_raw() const = 0; + virtual bool lineStyleScale_raw(double value) = 0; + virtual bool isScreenSpaceLineStyle_raw() const = 0; + virtual bool isScreenSpaceLineStyle_raw(bool value) = 0; + virtual LineStylePatterns lineStylePattern_raw() const = 0; + virtual bool lineStylePattern_raw(LineStylePatterns value) = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomGraphicsLines::coordinates() const +{ + core::Ptr res = coordinates_raw(); + return res; +} + +inline bool CustomGraphicsLines::coordinates(const core::Ptr& value) +{ + return coordinates_raw(value.get()); +} + +inline std::vector CustomGraphicsLines::indexList() const +{ + std::vector res; + size_t s; + + int* p= indexList_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomGraphicsLines::indexList(const std::vector& value) +{ + return indexList_raw(value.empty() ? NULL : &value[0], value.size()); +} + +inline bool CustomGraphicsLines::isLineStrip() const +{ + bool res = isLineStrip_raw(); + return res; +} + +inline bool CustomGraphicsLines::isLineStrip(bool value) +{ + return isLineStrip_raw(value); +} + +inline std::vector CustomGraphicsLines::lineStripLengths() const +{ + std::vector res; + size_t s; + + int* p= lineStripLengths_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomGraphicsLines::lineStripLengths(const std::vector& value) +{ + return lineStripLengths_raw(value.empty() ? NULL : &value[0], value.size()); +} + +inline double CustomGraphicsLines::weight() const +{ + double res = weight_raw(); + return res; +} + +inline bool CustomGraphicsLines::weight(double value) +{ + return weight_raw(value); +} + +inline double CustomGraphicsLines::lineStyleScale() const +{ + double res = lineStyleScale_raw(); + return res; +} + +inline bool CustomGraphicsLines::lineStyleScale(double value) +{ + return lineStyleScale_raw(value); +} + +inline bool CustomGraphicsLines::isScreenSpaceLineStyle() const +{ + bool res = isScreenSpaceLineStyle_raw(); + return res; +} + +inline bool CustomGraphicsLines::isScreenSpaceLineStyle(bool value) +{ + return isScreenSpaceLineStyle_raw(value); +} + +inline LineStylePatterns CustomGraphicsLines::lineStylePattern() const +{ + LineStylePatterns res = lineStylePattern_raw(); + return res; +} + +inline bool CustomGraphicsLines::lineStylePattern(LineStylePatterns value) +{ + return lineStylePattern_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSLINES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsMesh.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsMesh.h new file mode 100644 index 0000000..fc629af --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsMesh.h @@ -0,0 +1,181 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "CustomGraphicsEntity.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSMESH_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSMESH_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSMESH_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSMESH_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CustomGraphicsCoordinates; +}} + +namespace adsk { namespace fusion { + +/// Represents a custom triangle mesh drawn in the graphics window. +class CustomGraphicsMesh : public CustomGraphicsEntity { +public: + + /// Gets and sets the coordinates associated with this CustomGraphicsMesh. + core::Ptr coordinates() const; + bool coordinates(const core::Ptr& value); + + /// Gets and sets the normal vectors of the mesh where there is a normal + /// vector at each node. The normals are defined as an array + /// of floats where they are the x, y, z components of each vector. + std::vector normalVectors() const; + bool normalVectors(const std::vector& value); + + /// Gets and sets an array of indices that define which coordinate in the + /// coordinate list is used for each vertex in the mesh. Each set of three + /// indices defines a triagle. For example: + /// Indices 0, 1, and 2 define the coordinates to use for the first triangle and + /// indices 3, 4, and 5 define the coordinates for the second triangle, and so on. + std::vector vertexIndexList() const; + bool vertexIndexList(const std::vector& value); + + /// Gets and sets an array of indices that define which normal is associated + /// with each vertex in the mesh. This is used to look-up the normal in the + /// normalVectors array. + std::vector normalIndexList() const; + bool normalIndexList(const std::vector& value); + + /// Gets and sets the texture coordinates as an array of floats where + /// they are the u,v components at each node. They are defined as an + /// array of doubles where they are the u, v coordinates of each node. + /// Defining texture coordinates for a mesh is optional. + std::vector textureCoordinates() const; + bool textureCoordinates(const std::vector& value); + + ADSK_FUSION_CUSTOMGRAPHICSMESH_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSMESH_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSMESH_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSMESH_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CustomGraphicsCoordinates* coordinates_raw() const = 0; + virtual bool coordinates_raw(CustomGraphicsCoordinates* value) = 0; + virtual double* normalVectors_raw(size_t& return_size) const = 0; + virtual bool normalVectors_raw(const double* value, size_t value_size) = 0; + virtual int* vertexIndexList_raw(size_t& return_size) const = 0; + virtual bool vertexIndexList_raw(const int* value, size_t value_size) = 0; + virtual int* normalIndexList_raw(size_t& return_size) const = 0; + virtual bool normalIndexList_raw(const int* value, size_t value_size) = 0; + virtual double* textureCoordinates_raw(size_t& return_size) const = 0; + virtual bool textureCoordinates_raw(const double* value, size_t value_size) = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomGraphicsMesh::coordinates() const +{ + core::Ptr res = coordinates_raw(); + return res; +} + +inline bool CustomGraphicsMesh::coordinates(const core::Ptr& value) +{ + return coordinates_raw(value.get()); +} + +inline std::vector CustomGraphicsMesh::normalVectors() const +{ + std::vector res; + size_t s; + + double* p= normalVectors_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomGraphicsMesh::normalVectors(const std::vector& value) +{ + return normalVectors_raw(value.empty() ? NULL : &value[0], value.size()); +} + +inline std::vector CustomGraphicsMesh::vertexIndexList() const +{ + std::vector res; + size_t s; + + int* p= vertexIndexList_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomGraphicsMesh::vertexIndexList(const std::vector& value) +{ + return vertexIndexList_raw(value.empty() ? NULL : &value[0], value.size()); +} + +inline std::vector CustomGraphicsMesh::normalIndexList() const +{ + std::vector res; + size_t s; + + int* p= normalIndexList_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomGraphicsMesh::normalIndexList(const std::vector& value) +{ + return normalIndexList_raw(value.empty() ? NULL : &value[0], value.size()); +} + +inline std::vector CustomGraphicsMesh::textureCoordinates() const +{ + std::vector res; + size_t s; + + double* p= textureCoordinates_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomGraphicsMesh::textureCoordinates(const std::vector& value) +{ + return textureCoordinates_raw(value.empty() ? NULL : &value[0], value.size()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSMESH_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsPointSet.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsPointSet.h new file mode 100644 index 0000000..8ea227a --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsPointSet.h @@ -0,0 +1,148 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "CustomGraphicsEntity.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSPOINTSET_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSPOINTSET_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSPOINTSET_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSPOINTSET_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CustomGraphicsCoordinates; +}} + +namespace adsk { namespace fusion { + +/// Represents a set of one or more custom graphics points all of the same style. +class CustomGraphicsPointSet : public CustomGraphicsEntity { +public: + + /// Gets and sets the coordinates used to define the position of the custom graphics points. + /// If no indexList is specified, every coordinate will be drawn using a custom graphics point, + core::Ptr coordinates() const; + bool coordinates(const core::Ptr& value); + + /// An list of indices that specify which coordinates from the coordinate list to draw points for. + /// If this is an empty array, then all of the coordinates are used. + std::vector indexList() const; + bool indexList(const std::vector& value); + + /// Gets and sets the image that will be used to display the point if the point type + /// is a custom image. The image will always be be billboarded. The file should be + /// a png image and can use transparency. The filename can be a full path or a + /// relative path that is relative to your runtime file. Setting this will automatically + /// set the pointType to UserDefinedCustomGraphicsPointType. This property can also + /// return an empty string in the case where a user defined image point is not being used. + std::string pointImage() const; + bool pointImage(const std::string& value); + + /// Specifies which of the pre-defined point images to use. Attempting to set this property + /// to UserDefinedCustomGraphicsPointType will fail. To change to a user defined point type + /// you must set use the pointImage property to specify the image to use and this will have + /// the side-effect of changing the value of this property to UserDefinedCustomGraphicsPointType. + CustomGraphicsPointTypes pointType() const; + bool pointType(CustomGraphicsPointTypes value); + + ADSK_FUSION_CUSTOMGRAPHICSPOINTSET_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSPOINTSET_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSPOINTSET_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSPOINTSET_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual CustomGraphicsCoordinates* coordinates_raw() const = 0; + virtual bool coordinates_raw(CustomGraphicsCoordinates* value) = 0; + virtual int* indexList_raw(size_t& return_size) const = 0; + virtual bool indexList_raw(const int* value, size_t value_size) = 0; + virtual char* pointImage_raw() const = 0; + virtual bool pointImage_raw(const char * value) = 0; + virtual CustomGraphicsPointTypes pointType_raw() const = 0; + virtual bool pointType_raw(CustomGraphicsPointTypes value) = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomGraphicsPointSet::coordinates() const +{ + core::Ptr res = coordinates_raw(); + return res; +} + +inline bool CustomGraphicsPointSet::coordinates(const core::Ptr& value) +{ + return coordinates_raw(value.get()); +} + +inline std::vector CustomGraphicsPointSet::indexList() const +{ + std::vector res; + size_t s; + + int* p= indexList_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomGraphicsPointSet::indexList(const std::vector& value) +{ + return indexList_raw(value.empty() ? NULL : &value[0], value.size()); +} + +inline std::string CustomGraphicsPointSet::pointImage() const +{ + std::string res; + + char* p= pointImage_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomGraphicsPointSet::pointImage(const std::string& value) +{ + return pointImage_raw(value.c_str()); +} + +inline CustomGraphicsPointTypes CustomGraphicsPointSet::pointType() const +{ + CustomGraphicsPointTypes res = pointType_raw(); + return res; +} + +inline bool CustomGraphicsPointSet::pointType(CustomGraphicsPointTypes value) +{ + return pointType_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSPOINTSET_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsShowThroughColorEffect.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsShowThroughColorEffect.h new file mode 100644 index 0000000..36321c4 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsShowThroughColorEffect.h @@ -0,0 +1,109 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "CustomGraphicsColorEffect.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSSHOWTHROUGHCOLOREFFECT_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSSHOWTHROUGHCOLOREFFECT_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSSHOWTHROUGHCOLOREFFECT_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSSHOWTHROUGHCOLOREFFECT_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Color; +}} + +namespace adsk { namespace fusion { + +/// One of the types of color effects that can be applied to a custom graphics entity. With this +/// type of effect, the graphics entity will display using the specified color and will show through +/// other graphics that are in front of it. +class CustomGraphicsShowThroughColorEffect : public CustomGraphicsColorEffect { +public: + + /// Creates a new CustomGraphicsShowThroughColorEffect object that can be assigned to a custom graphics entity + /// using its showThrough property. + /// color : The color that will be used to render the custom graphics object. + /// opacity : The level of opacity that will be applied when rendering the the custom graphics object. A value of 0 is fully translucent + /// and will have the effect of the object being completely covered by objects in front of it. A value of 1 is fully opaque + /// which will have the effect of the object completely covering all objects. Values in between will make objects in front of + /// the graphics object appear translucent to varying degrees so you can see the custom graphics object through it. + /// Returns the newly created CustomGraphicsShowThroughColorEffect object or null in the case of failure. This can be assigned + /// to a custom graphics entity using its showThrough property. + static core::Ptr create(const core::Ptr& color, double opacity); + + /// Gets and sets the color associated with this CustomGraphicsShowThroughColorEffect object. The color that will be used to render + /// the portion of the entity that is covered by other objects in the scene. + core::Ptr color() const; + bool color(const core::Ptr& value); + + /// Gets and sets the opacity value associated with this CustomGraphicsShowThroughColorEffect object. The opacity is used when rendering + /// the portion of the entity that is covered by other objects in the scene. This can be a value between 0 and 1, where 1 is + /// fully opaque and will completely cover any other entities. + double opacity() const; + bool opacity(double value); + + ADSK_FUSION_CUSTOMGRAPHICSSHOWTHROUGHCOLOREFFECT_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSSHOWTHROUGHCOLOREFFECT_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSSHOWTHROUGHCOLOREFFECT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSSHOWTHROUGHCOLOREFFECT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_CUSTOMGRAPHICSSHOWTHROUGHCOLOREFFECT_API static CustomGraphicsShowThroughColorEffect* create_raw(core::Color* color, double opacity); + virtual core::Color* color_raw() const = 0; + virtual bool color_raw(core::Color* value) = 0; + virtual double opacity_raw() const = 0; + virtual bool opacity_raw(double value) = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomGraphicsShowThroughColorEffect::create(const core::Ptr& color, double opacity) +{ + core::Ptr res = create_raw(color.get(), opacity); + return res; +} + +inline core::Ptr CustomGraphicsShowThroughColorEffect::color() const +{ + core::Ptr res = color_raw(); + return res; +} + +inline bool CustomGraphicsShowThroughColorEffect::color(const core::Ptr& value) +{ + return color_raw(value.get()); +} + +inline double CustomGraphicsShowThroughColorEffect::opacity() const +{ + double res = opacity_raw(); + return res; +} + +inline bool CustomGraphicsShowThroughColorEffect::opacity(double value) +{ + return opacity_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSSHOWTHROUGHCOLOREFFECT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsSolidColorEffect.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsSolidColorEffect.h new file mode 100644 index 0000000..752c1dc --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsSolidColorEffect.h @@ -0,0 +1,89 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "CustomGraphicsColorEffect.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSSOLIDCOLOREFFECT_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSSOLIDCOLOREFFECT_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSSOLIDCOLOREFFECT_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSSOLIDCOLOREFFECT_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Color; +}} + +namespace adsk { namespace fusion { + +/// One of the types of color effects that can be applied to a custom graphics entity. With this +/// type of effect, the graphics entity will display as the single color without any lighting +/// effects. For example, a sphere will display as a solid filled circle without any shading +/// indicating it is actually spherical. +class CustomGraphicsSolidColorEffect : public CustomGraphicsColorEffect { +public: + + /// Statically creates a new CustomGraphicsSolidColorEffect object. This can be used as input + /// when creating various color related custom graphics attributes. A solid color effect, + /// colors the entity with a single color without any lighting effects. With this coloring + /// effect, a sphere will display as a solid filled circle. + /// color : The color to use for the solid color display. The opacity component of the color is ignored + /// because the opacity of custom graphics is controlled seperately using an opacity attribute. + /// Returns the created CustomGraphicsSolidColorEffect or null in case of a failure. + static core::Ptr create(const core::Ptr& color); + + /// The color to use for the solid color display. The opacity component of the color is ignored + /// because the opacity of custom graphics is controlled seperately using an opacity attribute. + core::Ptr color() const; + bool color(const core::Ptr& value); + + ADSK_FUSION_CUSTOMGRAPHICSSOLIDCOLOREFFECT_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSSOLIDCOLOREFFECT_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSSOLIDCOLOREFFECT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSSOLIDCOLOREFFECT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_CUSTOMGRAPHICSSOLIDCOLOREFFECT_API static CustomGraphicsSolidColorEffect* create_raw(core::Color* color); + virtual core::Color* color_raw() const = 0; + virtual bool color_raw(core::Color* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomGraphicsSolidColorEffect::create(const core::Ptr& color) +{ + core::Ptr res = create_raw(color.get()); + return res; +} + +inline core::Ptr CustomGraphicsSolidColorEffect::color() const +{ + core::Ptr res = color_raw(); + return res; +} + +inline bool CustomGraphicsSolidColorEffect::color(const core::Ptr& value) +{ + return color_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSSOLIDCOLOREFFECT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsText.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsText.h new file mode 100644 index 0000000..d719db6 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsText.h @@ -0,0 +1,213 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "CustomGraphicsEntity.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSTEXT_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSTEXT_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSTEXT_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSTEXT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Represents text drawn in the graphics window. The default position of the text is at (0,0,0) and +/// orientation is the text lying on the x-y plane. To reposition and reorient the text you can use +/// the transformation property. +class CustomGraphicsText : public CustomGraphicsEntity { +public: + + /// Gets and sets the formatted text definition. This is the full string, including the + /// formatting information, that's used to define the displayed text. + std::string formattedText() const; + bool formattedText(const std::string& value); + + /// Gets and sets the font used to display the text. This is the default font and applies to + /// all of text unless there is a font override defined within the text. + std::string font() const; + bool font(const std::string& value); + + /// Specifies that the text displays using an italic style. This is the default italic style and applies to + /// all of text unless there is a style override defined within the text. + bool isItalic() const; + bool isItalic(bool value); + + /// Specifies that the text displays using a bold style. This is the default bold style and applies to + /// all of text unless there is a style override defined within the text. + bool isBold() const; + bool isBold(bool value); + + /// Specifies that the text displays using an underline style. This is the default underline style and applies to + /// all of text unless there is a style override defined within the text. + bool isUnderline() const; + bool isUnderline(bool value); + + /// Specifies that the text displays using a strike through style. This is the default strike through style and applies to + /// all of text unless there is a style override defined within the text. + bool isStrikeThrough() const; + bool isStrikeThrough(bool value); + + /// Gets and sets the size of the text in centimeters. This is the default size and applies to + /// all of text unless there is a size override defined within the text. + double size() const; + bool size(double value); + + /// The actual width of the text in centimeters. This is useful when you want to position several + /// GraphicsText objects together. + double width() const; + + /// The actual height of the text in centimeters. This is useful when you want to position several + /// GraphicsText objects together. + double height() const; + + ADSK_FUSION_CUSTOMGRAPHICSTEXT_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSTEXT_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSTEXT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSTEXT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* formattedText_raw() const = 0; + virtual bool formattedText_raw(const char * value) = 0; + virtual char* font_raw() const = 0; + virtual bool font_raw(const char * value) = 0; + virtual bool isItalic_raw() const = 0; + virtual bool isItalic_raw(bool value) = 0; + virtual bool isBold_raw() const = 0; + virtual bool isBold_raw(bool value) = 0; + virtual bool isUnderline_raw() const = 0; + virtual bool isUnderline_raw(bool value) = 0; + virtual bool isStrikeThrough_raw() const = 0; + virtual bool isStrikeThrough_raw(bool value) = 0; + virtual double size_raw() const = 0; + virtual bool size_raw(double value) = 0; + virtual double width_raw() const = 0; + virtual double height_raw() const = 0; +}; + +// Inline wrappers + +inline std::string CustomGraphicsText::formattedText() const +{ + std::string res; + + char* p= formattedText_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomGraphicsText::formattedText(const std::string& value) +{ + return formattedText_raw(value.c_str()); +} + +inline std::string CustomGraphicsText::font() const +{ + std::string res; + + char* p= font_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool CustomGraphicsText::font(const std::string& value) +{ + return font_raw(value.c_str()); +} + +inline bool CustomGraphicsText::isItalic() const +{ + bool res = isItalic_raw(); + return res; +} + +inline bool CustomGraphicsText::isItalic(bool value) +{ + return isItalic_raw(value); +} + +inline bool CustomGraphicsText::isBold() const +{ + bool res = isBold_raw(); + return res; +} + +inline bool CustomGraphicsText::isBold(bool value) +{ + return isBold_raw(value); +} + +inline bool CustomGraphicsText::isUnderline() const +{ + bool res = isUnderline_raw(); + return res; +} + +inline bool CustomGraphicsText::isUnderline(bool value) +{ + return isUnderline_raw(value); +} + +inline bool CustomGraphicsText::isStrikeThrough() const +{ + bool res = isStrikeThrough_raw(); + return res; +} + +inline bool CustomGraphicsText::isStrikeThrough(bool value) +{ + return isStrikeThrough_raw(value); +} + +inline double CustomGraphicsText::size() const +{ + double res = size_raw(); + return res; +} + +inline bool CustomGraphicsText::size(double value) +{ + return size_raw(value); +} + +inline double CustomGraphicsText::width() const +{ + double res = width_raw(); + return res; +} + +inline double CustomGraphicsText::height() const +{ + double res = height_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSTEXT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsVertexColorEffect.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsVertexColorEffect.h new file mode 100644 index 0000000..cb67182 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsVertexColorEffect.h @@ -0,0 +1,61 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "CustomGraphicsColorEffect.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSVERTEXCOLOREFFECT_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSVERTEXCOLOREFFECT_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSVERTEXCOLOREFFECT_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSVERTEXCOLOREFFECT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// One of the types of color effects that can be applied to a custom graphics entity. With this +/// type of effect, the graphics entity will display using the colors associated with the vertices +/// of the mesh in the CustomGraphicsCoordinates object. +class CustomGraphicsVertexColorEffect : public CustomGraphicsColorEffect { +public: + + /// Statically creates a new CustomGraphicsVertexColorEffect object. + /// Returns the created CustomGraphicsVertexColorEffect or null in case of a failure. + static core::Ptr create(); + + ADSK_FUSION_CUSTOMGRAPHICSVERTEXCOLOREFFECT_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSVERTEXCOLOREFFECT_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSVERTEXCOLOREFFECT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSVERTEXCOLOREFFECT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_CUSTOMGRAPHICSVERTEXCOLOREFFECT_API static CustomGraphicsVertexColorEffect* create_raw(); +}; + +// Inline wrappers + +inline core::Ptr CustomGraphicsVertexColorEffect::create() +{ + core::Ptr res = create_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSVERTEXCOLOREFFECT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsViewPlacement.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsViewPlacement.h new file mode 100644 index 0000000..d5d0348 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsViewPlacement.h @@ -0,0 +1,139 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSVIEWPLACEMENT_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSVIEWPLACEMENT_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSVIEWPLACEMENT_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSVIEWPLACEMENT_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Point2D; + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// Positions custom graphics relative to one of the four corners of the view. Graphics positioned +/// this way will always appear on top of the model graphics. This is typically used to display +/// legends are small interactive tools. +class CustomGraphicsViewPlacement : public core::Base { +public: + + /// Creates a new CustomGraphicsViewPlacement object that can be used when setting the viewPlacement property + /// of a custom graphics entity to specify the billboarding behavior. + /// anchorPoint : The position within the defined graphics that will serve as the anchor. This is the location + /// on the graphics that will be positioned at the specified view point. + /// viewCorner : Defines which of the four corners of the view the graphics are drawn relative to. + /// viewPoint : A 2D point in the view that defines the position of the graphics. This is relative to the corner + /// and is in pixels. The x and y directions vary for each of the corners. These directions are only + /// used to position the 2D point and do not affect the standard coordinate system the graphics were + /// drawn in. + /// upperLeftViewCorner - The x direction is to the right and y is down. + /// upperRightViewCorner - The x direction is to the left and y is down. + /// lowerLeftViewCorner - The x direction is to the right and y is up. + /// lowerRightViewCorner - The x direction is to the left and y is up. + /// Returns the newly created CustomGraphicsViewPlacement object or null in the case of failure. This can then + /// be assigned to any custom graphics entity using its viewPlacement property. + static core::Ptr create(const core::Ptr& anchorPoint, ViewCorners viewCorner, const core::Ptr& viewPoint); + + /// Gets and sets the position within the defined graphics that serves as the anchor. This is the location + /// on the graphics that is positioned at the specified view point. + core::Ptr anchorPoint() const; + bool anchorPoint(const core::Ptr& value); + + /// A 2D point in the view that defines the position of the graphics. This is relative to the corner + /// and is in pixels. The x and y directions vary for each of the corners. These directions are only + /// used to position the 2D point and do not affect the standard coordinate system the graphics were + /// drawn in. + /// upperLeftViewCorner - The x direction is to the right and y is down. + /// upperRightViewCorner - The x direction is to the left and y is down. + /// lowerLeftViewCorner - The x direction is to the right and y is up. + /// lowerRightViewCorner - The x direction is to the left and y is up. + core::Ptr viewPoint() const; + bool viewPoint(const core::Ptr& value); + + /// Gets and sets which corner the graphics are positioned relative to. + ViewCorners viewCorner() const; + bool viewCorner(ViewCorners value); + + ADSK_FUSION_CUSTOMGRAPHICSVIEWPLACEMENT_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSVIEWPLACEMENT_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSVIEWPLACEMENT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSVIEWPLACEMENT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_CUSTOMGRAPHICSVIEWPLACEMENT_API static CustomGraphicsViewPlacement* create_raw(core::Point3D* anchorPoint, ViewCorners viewCorner, core::Point2D* viewPoint); + virtual core::Point3D* anchorPoint_raw() const = 0; + virtual bool anchorPoint_raw(core::Point3D* value) = 0; + virtual core::Point2D* viewPoint_raw() const = 0; + virtual bool viewPoint_raw(core::Point2D* value) = 0; + virtual ViewCorners viewCorner_raw() const = 0; + virtual bool viewCorner_raw(ViewCorners value) = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomGraphicsViewPlacement::create(const core::Ptr& anchorPoint, ViewCorners viewCorner, const core::Ptr& viewPoint) +{ + core::Ptr res = create_raw(anchorPoint.get(), viewCorner, viewPoint.get()); + return res; +} + +inline core::Ptr CustomGraphicsViewPlacement::anchorPoint() const +{ + core::Ptr res = anchorPoint_raw(); + return res; +} + +inline bool CustomGraphicsViewPlacement::anchorPoint(const core::Ptr& value) +{ + return anchorPoint_raw(value.get()); +} + +inline core::Ptr CustomGraphicsViewPlacement::viewPoint() const +{ + core::Ptr res = viewPoint_raw(); + return res; +} + +inline bool CustomGraphicsViewPlacement::viewPoint(const core::Ptr& value) +{ + return viewPoint_raw(value.get()); +} + +inline ViewCorners CustomGraphicsViewPlacement::viewCorner() const +{ + ViewCorners res = viewCorner_raw(); + return res; +} + +inline bool CustomGraphicsViewPlacement::viewCorner(ViewCorners value) +{ + return viewCorner_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSVIEWPLACEMENT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsViewScale.h b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsViewScale.h new file mode 100644 index 0000000..686ad59 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Graphics/CustomGraphicsViewScale.h @@ -0,0 +1,111 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CUSTOMGRAPHICSVIEWSCALE_CPP__ +# define ADSK_FUSION_CUSTOMGRAPHICSVIEWSCALE_API XI_EXPORT +# else +# define ADSK_FUSION_CUSTOMGRAPHICSVIEWSCALE_API +# endif +#else +# define ADSK_FUSION_CUSTOMGRAPHICSVIEWSCALE_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// Specifies that custom graphics are to be scaled relative to the view (pixels) and not model space. +/// If this is applied to some custom graphics then they will stat the same size on the screen regardless +/// of the user zooming in or out. This is commonly used for glyphs and other interactive widgets so they don't +/// don't get too large or too small. +class CustomGraphicsViewScale : public core::Base { +public: + + /// Creates a new CustomGraphicsViewScale object that can be used when setting the viewScale property + /// of a custom graphics entity to specify the scaling behavior. + /// pixelScale : Defines the scale of the custom graphics relative to the view. If a custom graphics line is defined + /// to be 100 units long it would usually display as 100 cm long. When it is view scaled with a pixel scale of + /// 1 it will display as 100 pixels long. + /// anchorPoint : Defines the point in the graphics that defines the origin of the scaling. The graphics will be scaled + /// up or down relative to that point. + /// Returns the newly created CustomGraphicsViewScale object or null in the case of failure. This can then + /// be assigned to any custom graphics entity using its viewScale property. + static core::Ptr create(double pixelScale, const core::Ptr& anchorPoint); + + /// Gets and sets the scale of the custom graphics relative to the view. If a custom graphics line is defined + /// to be 100 units long it would usually display as 100 cm long. When it is view scaled with a pixel scale of + /// 1 it will display as 100 pixels long. + double pixelScale() const; + bool pixelScale(double value); + + /// Gets and sets the point in the graphics that defines the origin of the scaling. The graphics will be scaled + /// up or down relative to that point. + core::Ptr anchorPoint() const; + bool anchorPoint(const core::Ptr& value); + + ADSK_FUSION_CUSTOMGRAPHICSVIEWSCALE_API static const char* classType(); + ADSK_FUSION_CUSTOMGRAPHICSVIEWSCALE_API const char* objectType() const override; + ADSK_FUSION_CUSTOMGRAPHICSVIEWSCALE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CUSTOMGRAPHICSVIEWSCALE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + ADSK_FUSION_CUSTOMGRAPHICSVIEWSCALE_API static CustomGraphicsViewScale* create_raw(double pixelScale, core::Point3D* anchorPoint); + virtual double pixelScale_raw() const = 0; + virtual bool pixelScale_raw(double value) = 0; + virtual core::Point3D* anchorPoint_raw() const = 0; + virtual bool anchorPoint_raw(core::Point3D* value) = 0; +}; + +// Inline wrappers + +inline core::Ptr CustomGraphicsViewScale::create(double pixelScale, const core::Ptr& anchorPoint) +{ + core::Ptr res = create_raw(pixelScale, anchorPoint.get()); + return res; +} + +inline double CustomGraphicsViewScale::pixelScale() const +{ + double res = pixelScale_raw(); + return res; +} + +inline bool CustomGraphicsViewScale::pixelScale(double value) +{ + return pixelScale_raw(value); +} + +inline core::Ptr CustomGraphicsViewScale::anchorPoint() const +{ + core::Ptr res = anchorPoint_raw(); + return res; +} + +inline bool CustomGraphicsViewScale::anchorPoint(const core::Ptr& value) +{ + return anchorPoint_raw(value.get()); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CUSTOMGRAPHICSVIEWSCALE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/MeshBody/MeshBodies.h b/usr/autodesk/CPP/include/Fusion/MeshBody/MeshBodies.h new file mode 100644 index 0000000..867d411 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/MeshBody/MeshBodies.h @@ -0,0 +1,135 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_MESHBODIES_CPP__ +# define ADSK_FUSION_MESHBODIES_API XI_EXPORT +# else +# define ADSK_FUSION_MESHBODIES_API +# endif +#else +# define ADSK_FUSION_MESHBODIES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class MeshBody; + class MeshBodyList; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the MeshBodies in the parent Component and +/// supports the creation of new mesh bodies. +class MeshBodies : public core::Base { +public: + + /// Creates a new mesh body by importing an .stl, .obj or .3mf file. + /// Because of a current limitation, if you want to create a mesh body in a parametric model, + /// you must first call the edit method of the base or form feature, use this method to create + /// the mesh body, and then call the finishEdit method of the base or form feature. The base + /// or form feature must be in an "edit" state to be able to add any additional items to it. + /// fullFilename : The full filename (path and file) of a .stl, .obj or .3mf file. + /// units : The units to use when importing the file. + /// baseOrFormFeature : The BaseFeature or FormFeature object that this mesh body will be associated with. This is an optional + /// requirement and is required when the model design history is being captured (parametric model) but is + /// ignored otherwise (direct edit model). + /// Returns a list of the newly created mesh bodies or null if the creation failed. Multiple + /// bodies can be created in the case where a .obj file that contains multiple bodies was imported. + /// STL files always contain a single body. + core::Ptr add(const std::string& fullFilename, MeshUnits units, const core::Ptr& baseOrFormFeature = NULL); + + /// Provides access to a mesh body within the collection. + /// index : The index of the mesh body to return, where an index of 0 is the first mesh body in the collection. + /// Returns the specified mesh body or null in the case of a invalid index. + core::Ptr item(size_t index) const; + + /// Returns the number of mesh bodies in the collection. + size_t count() const; + + /// Creates a new mesh body using the mesh description provided. + /// coordinates : Input array of doubles that defines the X, Y, Z coordinates of each node in the mesh. Each set of three numbers define + /// the coordinates of a node. + /// coordinateIndexList : An array of integers that represent indices into the coordinates to define the vertices of the triangles. If an empty + /// array is provided, then it's assumed that the first three coordinates defines the first triangle, the next three define + /// the second triangle, and so on. + /// normalVectors : An array of doubles that represent the x, y, z components of the normals at each coordinate. There should be a normal defined + /// for each coordinate. If an empty array is provided for the normal vectors, Fusion 360 will automatically calculate normal vectors + /// that are 90 degrees to the face of the triangle, making it appear flat. + /// normalIndexList : An array of integers that represent indices into the normal vectors to define the which vector corresponds to which vertex. This + /// should be the same size as the vertex index list. If an empty array is input and normal vectors are provided, it is assumed that + /// the normals match up one-to-one to each coordinate. + /// Returns the newly created MeshBody object or null in the case of a failure. + core::Ptr addByTriangleMeshData(const std::vector& coordinates, const std::vector& coordinateIndexList, const std::vector& normalVectors, const std::vector& normalIndexList); + + typedef MeshBody iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_MESHBODIES_API static const char* classType(); + ADSK_FUSION_MESHBODIES_API const char* objectType() const override; + ADSK_FUSION_MESHBODIES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_MESHBODIES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual MeshBodyList* add_raw(const char * fullFilename, MeshUnits units, core::Base* baseOrFormFeature) = 0; + virtual MeshBody* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual MeshBody* addByTriangleMeshData_raw(const double* coordinates, size_t coordinates_size, const int* coordinateIndexList, size_t coordinateIndexList_size, const double* normalVectors, size_t normalVectors_size, const int* normalIndexList, size_t normalIndexList_size) = 0; +}; + +// Inline wrappers + +inline core::Ptr MeshBodies::add(const std::string& fullFilename, MeshUnits units, const core::Ptr& baseOrFormFeature) +{ + core::Ptr res = add_raw(fullFilename.c_str(), units, baseOrFormFeature.get()); + return res; +} + +inline core::Ptr MeshBodies::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t MeshBodies::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr MeshBodies::addByTriangleMeshData(const std::vector& coordinates, const std::vector& coordinateIndexList, const std::vector& normalVectors, const std::vector& normalIndexList) +{ + core::Ptr res = addByTriangleMeshData_raw(coordinates.empty() ? NULL : &coordinates[0], coordinates.size(), coordinateIndexList.empty() ? NULL : &coordinateIndexList[0], coordinateIndexList.size(), normalVectors.empty() ? NULL : &normalVectors[0], normalVectors.size(), normalIndexList.empty() ? NULL : &normalIndexList[0], normalIndexList.size()); + return res; +} + +template inline void MeshBodies::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_MESHBODIES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/MeshBody/MeshBody.h b/usr/autodesk/CPP/include/Fusion/MeshBody/MeshBody.h new file mode 100644 index 0000000..37a8a47 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/MeshBody/MeshBody.h @@ -0,0 +1,346 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/CoreTypeDefs.h" +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_MESHBODY_CPP__ +# define ADSK_FUSION_MESHBODY_API XI_EXPORT +# else +# define ADSK_FUSION_MESHBODY_API +# endif +#else +# define ADSK_FUSION_MESHBODY_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Component; + class Occurrence; + class PolygonMesh; + class TriangleMesh; +}} +namespace adsk { namespace core { + class Appearance; + class Attributes; + class Material; +}} + +namespace adsk { namespace fusion { + +/// Provides access to a mesh body. +class MeshBody : public core::Base { +public: + + /// Gets and sets the name of the mesh body as displayed in the browser. + std::string name() const; + bool name(const std::string& value); + + /// Gets and sets if the mesh body is selectable in the graphics window. + bool isSelectable() const; + bool isSelectable(bool value); + + /// Is the light bulb (as displayed in the browser) on. + /// A mesh body will only be visible if the light bulb is switched on. However, + /// the light bulb can be on and the mesh body is still invisible if the light bulb + /// for all bodies or the owning component is off. + bool isLightBulbOn() const; + bool isLightBulbOn(bool value); + + /// Gets if the mesh body point is visible. + bool isVisible() const; + + /// Deletes the mesh body. + /// Returns true in the case where the selection was successful. + bool deleteMe(); + + /// Returns the original mesh data that was imported. This can include triangles, quads, and polygons. + core::Ptr mesh() const; + + /// Returns the associated mesh that is used for the display. This will always be triangles and includes any textures. + core::Ptr displayMesh() const; + + /// Returns the parent Component. + core::Ptr parentComponent() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this object + /// in an assembly. This is only valid in the case where this is acting + /// as a proxy in an assembly. Returns null in the case where the object + /// is not in the context of an assembly but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// Fails if this object is not the NativeObject. + /// occurrence : The occurrence that represents the context you want to create this proxy in. + /// Returns the proxy for the occurrence in the context of the specified occurrence. Returns null if it failed. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// This property returns the base or form feature that this mesh body is associated with. It + /// returns null in the case where the modeling design history is not being captured (direct edit model). + core::Ptr baseOrFormFeature() const; + + /// Returns the collection of attributes associated with this mesh body. + core::Ptr attributes() const; + + /// Gets and sets the physical material assigned to this mesh body. + core::Ptr material() const; + bool material(const core::Ptr& value); + + /// Read-write property that gets and sets the current appearance of the body. Setting this property will result in applying + /// an override appearance to the body and the AppearanceSourceType property will return OverrideAppearanceSource. Setting + /// this property to null will remove any override. + core::Ptr appearance() const; + bool appearance(const core::Ptr& value); + + /// Read-write property that gets the source of the appearance for the body. If this returns OverrideAppearanceSource, an override exists + /// on this body. The override can be removed by setting the Appearance property to null. + core::AppearanceSourceTypes appearanceSourceType() const; + + /// Gets and sets the opacity override assigned to this body. A value of 1.0 specifies + /// that is it completely opaque and a value of 0.0 specifies that is it completely transparent. + /// This value is not necessarily related to what the user sees because the opacity is inherited. + /// For example, if you this body is in a component and that component's opacity is set to something + /// other than 1.0, the body will also be shown as slightly transparent even though the opacity + /// property for the body will return 1.0. Because the component that contains the body can be + /// referenced as an occurrence in other components and they can have different opacity settings, + /// it's possible that different instances of the same body can display using different opacity levels. + /// To get the opacity that it is being displayed with use the MeshBody.visibleOpacity property. + /// This is the API equivalent of the "Opacity Control" command available for the body in the browser. + double opacity() const; + bool opacity(double value); + + /// The user can set an override opacity for components and bodies these opacity overrides combine if + /// children and parent components have overrides. This property returns the actual opacity that is + /// being used to render the body. To set the opacity use the opacity property of the MeshBody object. + double visibleOpacity() const; + + /// Returns a token for the MeshBody object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same mesh body. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + ADSK_FUSION_MESHBODY_API static const char* classType(); + ADSK_FUSION_MESHBODY_API const char* objectType() const override; + ADSK_FUSION_MESHBODY_API void* queryInterface(const char* id) const override; + ADSK_FUSION_MESHBODY_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual bool isSelectable_raw() const = 0; + virtual bool isSelectable_raw(bool value) = 0; + virtual bool isLightBulbOn_raw() const = 0; + virtual bool isLightBulbOn_raw(bool value) = 0; + virtual bool isVisible_raw() const = 0; + virtual bool deleteMe_raw() = 0; + virtual PolygonMesh* mesh_raw() const = 0; + virtual TriangleMesh* displayMesh_raw() const = 0; + virtual Component* parentComponent_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual MeshBody* nativeObject_raw() const = 0; + virtual MeshBody* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual core::Base* baseOrFormFeature_raw() const = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual core::Material* material_raw() const = 0; + virtual bool material_raw(core::Material* value) = 0; + virtual core::Appearance* appearance_raw() const = 0; + virtual bool appearance_raw(core::Appearance* value) = 0; + virtual core::AppearanceSourceTypes appearanceSourceType_raw() const = 0; + virtual double opacity_raw() const = 0; + virtual bool opacity_raw(double value) = 0; + virtual double visibleOpacity_raw() const = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline std::string MeshBody::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool MeshBody::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline bool MeshBody::isSelectable() const +{ + bool res = isSelectable_raw(); + return res; +} + +inline bool MeshBody::isSelectable(bool value) +{ + return isSelectable_raw(value); +} + +inline bool MeshBody::isLightBulbOn() const +{ + bool res = isLightBulbOn_raw(); + return res; +} + +inline bool MeshBody::isLightBulbOn(bool value) +{ + return isLightBulbOn_raw(value); +} + +inline bool MeshBody::isVisible() const +{ + bool res = isVisible_raw(); + return res; +} + +inline bool MeshBody::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline core::Ptr MeshBody::mesh() const +{ + core::Ptr res = mesh_raw(); + return res; +} + +inline core::Ptr MeshBody::displayMesh() const +{ + core::Ptr res = displayMesh_raw(); + return res; +} + +inline core::Ptr MeshBody::parentComponent() const +{ + core::Ptr res = parentComponent_raw(); + return res; +} + +inline core::Ptr MeshBody::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr MeshBody::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr MeshBody::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr MeshBody::baseOrFormFeature() const +{ + core::Ptr res = baseOrFormFeature_raw(); + return res; +} + +inline core::Ptr MeshBody::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline core::Ptr MeshBody::material() const +{ + core::Ptr res = material_raw(); + return res; +} + +inline bool MeshBody::material(const core::Ptr& value) +{ + return material_raw(value.get()); +} + +inline core::Ptr MeshBody::appearance() const +{ + core::Ptr res = appearance_raw(); + return res; +} + +inline bool MeshBody::appearance(const core::Ptr& value) +{ + return appearance_raw(value.get()); +} + +inline core::AppearanceSourceTypes MeshBody::appearanceSourceType() const +{ + core::AppearanceSourceTypes res = appearanceSourceType_raw(); + return res; +} + +inline double MeshBody::opacity() const +{ + double res = opacity_raw(); + return res; +} + +inline bool MeshBody::opacity(double value) +{ + return opacity_raw(value); +} + +inline double MeshBody::visibleOpacity() const +{ + double res = visibleOpacity_raw(); + return res; +} + +inline std::string MeshBody::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_MESHBODY_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/MeshBody/MeshBodyList.h b/usr/autodesk/CPP/include/Fusion/MeshBody/MeshBodyList.h new file mode 100644 index 0000000..653772e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/MeshBody/MeshBodyList.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_MESHBODYLIST_CPP__ +# define ADSK_FUSION_MESHBODYLIST_API XI_EXPORT +# else +# define ADSK_FUSION_MESHBODYLIST_API +# endif +#else +# define ADSK_FUSION_MESHBODYLIST_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class MeshBody; +}} + +namespace adsk { namespace fusion { + +/// Provides access to a list of MeshBody objects. +class MeshBodyList : public core::Base { +public: + + /// Provides access to a mesh body within the collection. + /// index : The index of the mesh body to return, where an index of 0 is the first mesh body in the collection. + /// Returns the specified mesh body or null in the case of a invalid index. + core::Ptr item(size_t index) const; + + /// Returns the number of mesh bodies in the collection. + size_t count() const; + + typedef MeshBody iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_MESHBODYLIST_API static const char* classType(); + ADSK_FUSION_MESHBODYLIST_API const char* objectType() const override; + ADSK_FUSION_MESHBODYLIST_API void* queryInterface(const char* id) const override; + ADSK_FUSION_MESHBODYLIST_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual MeshBody* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr MeshBodyList::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t MeshBodyList::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void MeshBodyList::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_MESHBODYLIST_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/MeshData/MeshManager.h b/usr/autodesk/CPP/include/Fusion/MeshData/MeshManager.h new file mode 100644 index 0000000..6a3d856 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/MeshData/MeshManager.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_MESHMANAGER_CPP__ +# define ADSK_FUSION_MESHMANAGER_API XI_EXPORT +# else +# define ADSK_FUSION_MESHMANAGER_API +# endif +#else +# define ADSK_FUSION_MESHMANAGER_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class TriangleMeshCalculator; + class TriangleMeshList; +}} + +namespace adsk { namespace fusion { + +/// Provides access to meshes that approximate a B-Rep and T-Spline. +class MeshManager : public core::Base { +public: + + /// Creates a new MeshCalculator which is used to calculate + /// new triangular meshes based on various parameters that control the calculation. + /// Returns the new MeshCalculator object or null if the creation failed. + core::Ptr createMeshCalculator(); + + /// Returns a collection that provides access to all of the + /// existing display meshes. + core::Ptr displayMeshes() const; + + /// Returns the parent BRepBody, BRepFace, BRepLump, BRepShell, SculptBody, or SculptFace object. + core::Ptr parent() const; + + ADSK_FUSION_MESHMANAGER_API static const char* classType(); + ADSK_FUSION_MESHMANAGER_API const char* objectType() const override; + ADSK_FUSION_MESHMANAGER_API void* queryInterface(const char* id) const override; + ADSK_FUSION_MESHMANAGER_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual TriangleMeshCalculator* createMeshCalculator_raw() = 0; + virtual TriangleMeshList* displayMeshes_raw() const = 0; + virtual core::Base* parent_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr MeshManager::createMeshCalculator() +{ + core::Ptr res = createMeshCalculator_raw(); + return res; +} + +inline core::Ptr MeshManager::displayMeshes() const +{ + core::Ptr res = displayMeshes_raw(); + return res; +} + +inline core::Ptr MeshManager::parent() const +{ + core::Ptr res = parent_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_MESHMANAGER_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/MeshData/PolygonMesh.h b/usr/autodesk/CPP/include/Fusion/MeshData/PolygonMesh.h new file mode 100644 index 0000000..852741d --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/MeshData/PolygonMesh.h @@ -0,0 +1,286 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_POLYGONMESH_CPP__ +# define ADSK_FUSION_POLYGONMESH_API XI_EXPORT +# else +# define ADSK_FUSION_POLYGONMESH_API +# endif +#else +# define ADSK_FUSION_POLYGONMESH_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Point3D; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// The PolygonMesh represents a mesh that can contain any +/// combination of polygons, quads, and triangles. +class PolygonMesh : public core::Base { +public: + + /// Returns the number of nodes in the mesh. + int nodeCount() const; + + /// Returns the node coordinates as an array of doubles where + /// they are the x, y, z components of each coordinate. + std::vector nodeCoordinatesAsDouble() const; + + /// Returns the node coordinates as an array of floats where + /// they are the x, y, z components of each coordinate. + std::vector nodeCoordinatesAsFloat() const; + + /// Returns the node coordinates as an array of Point3D objects. + std::vector> nodeCoordinates() const; + + /// Returns the number of triangles in the mesh. + int triangleCount() const; + + /// Returns the number of quads in the mesh. + int quadCount() const; + + /// Returns the number of polygons (more than 4 sides) in the mesh. + int polygonCount() const; + + /// Returns the normal vectors as an array of doubles where + /// they are the x, y, z components of each vector. There is one normal vector for each index. + std::vector normalVectorsAsDouble() const; + + /// Returns the normal vectors as an array of floats. There is one normal vector for each index. + std::vector normalVectorsAsFloat() const; + + /// Returns the normal vectors as an array of Vector 3D objects. There is one normal vector for each index. + std::vector> normalVectors() const; + + /// Returns the index values that index into the NodeCoordinates and NormalVectors arrays to + /// define the three coordinates of each triangle and the corresponding normal. + std::vector triangleNodeIndices() const; + + /// Returns the index values that index into the NodeCoordinates and NormalVectors arrays to + /// define the four coordinates of each quad and the corresponding normal. + std::vector quadNodeIndices() const; + + /// Returns the index values that index into the NodeCoordinates and NormalVectors arrays to + /// define the coordinates of each polygon and the corresponding normal. + std::vector polygonNodeIndices() const; + + /// Returns the number of nodes that define each polygon. For example, + /// if NodeCountPerPolygon[0] returns 6 it indicates the first polygon + /// is defined using 6 nodes. The first six indices returned by the + /// PolygonNodeIndices properties provide the look-up into the NodeCoordinates + /// array. + std::vector nodeCountPerPolygon() const; + + ADSK_FUSION_POLYGONMESH_API static const char* classType(); + ADSK_FUSION_POLYGONMESH_API const char* objectType() const override; + ADSK_FUSION_POLYGONMESH_API void* queryInterface(const char* id) const override; + ADSK_FUSION_POLYGONMESH_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual int nodeCount_raw() const = 0; + virtual double* nodeCoordinatesAsDouble_raw(size_t& return_size) const = 0; + virtual float* nodeCoordinatesAsFloat_raw(size_t& return_size) const = 0; + virtual core::Point3D** nodeCoordinates_raw(size_t& return_size) const = 0; + virtual int triangleCount_raw() const = 0; + virtual int quadCount_raw() const = 0; + virtual int polygonCount_raw() const = 0; + virtual double* normalVectorsAsDouble_raw(size_t& return_size) const = 0; + virtual float* normalVectorsAsFloat_raw(size_t& return_size) const = 0; + virtual core::Vector3D** normalVectors_raw(size_t& return_size) const = 0; + virtual int* triangleNodeIndices_raw(size_t& return_size) const = 0; + virtual int* quadNodeIndices_raw(size_t& return_size) const = 0; + virtual int* polygonNodeIndices_raw(size_t& return_size) const = 0; + virtual int* nodeCountPerPolygon_raw(size_t& return_size) const = 0; +}; + +// Inline wrappers + +inline int PolygonMesh::nodeCount() const +{ + int res = nodeCount_raw(); + return res; +} + +inline std::vector PolygonMesh::nodeCoordinatesAsDouble() const +{ + std::vector res; + size_t s; + + double* p= nodeCoordinatesAsDouble_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector PolygonMesh::nodeCoordinatesAsFloat() const +{ + std::vector res; + size_t s; + + float* p= nodeCoordinatesAsFloat_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> PolygonMesh::nodeCoordinates() const +{ + std::vector> res; + size_t s; + + core::Point3D** p= nodeCoordinates_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline int PolygonMesh::triangleCount() const +{ + int res = triangleCount_raw(); + return res; +} + +inline int PolygonMesh::quadCount() const +{ + int res = quadCount_raw(); + return res; +} + +inline int PolygonMesh::polygonCount() const +{ + int res = polygonCount_raw(); + return res; +} + +inline std::vector PolygonMesh::normalVectorsAsDouble() const +{ + std::vector res; + size_t s; + + double* p= normalVectorsAsDouble_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector PolygonMesh::normalVectorsAsFloat() const +{ + std::vector res; + size_t s; + + float* p= normalVectorsAsFloat_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> PolygonMesh::normalVectors() const +{ + std::vector> res; + size_t s; + + core::Vector3D** p= normalVectors_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector PolygonMesh::triangleNodeIndices() const +{ + std::vector res; + size_t s; + + int* p= triangleNodeIndices_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector PolygonMesh::quadNodeIndices() const +{ + std::vector res; + size_t s; + + int* p= quadNodeIndices_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector PolygonMesh::polygonNodeIndices() const +{ + std::vector res; + size_t s; + + int* p= polygonNodeIndices_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector PolygonMesh::nodeCountPerPolygon() const +{ + std::vector res; + size_t s; + + int* p= nodeCountPerPolygon_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_POLYGONMESH_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/MeshData/TextureImage.h b/usr/autodesk/CPP/include/Fusion/MeshData/TextureImage.h new file mode 100644 index 0000000..a0f7dc8 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/MeshData/TextureImage.h @@ -0,0 +1,63 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TEXTUREIMAGE_CPP__ +# define ADSK_FUSION_TEXTUREIMAGE_API XI_EXPORT +# else +# define ADSK_FUSION_TEXTUREIMAGE_API +# endif +#else +# define ADSK_FUSION_TEXTUREIMAGE_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Matrix2D; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the image data associated with a texture map. +class TextureImage : public core::Base { +public: + + /// The transform of the texture image in parametric space. + core::Ptr transform() const; + + ADSK_FUSION_TEXTUREIMAGE_API static const char* classType(); + ADSK_FUSION_TEXTUREIMAGE_API const char* objectType() const override; + ADSK_FUSION_TEXTUREIMAGE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TEXTUREIMAGE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Matrix2D* transform_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr TextureImage::transform() const +{ + core::Ptr res = transform_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TEXTUREIMAGE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/MeshData/TriangleMesh.h b/usr/autodesk/CPP/include/Fusion/MeshData/TriangleMesh.h new file mode 100644 index 0000000..8548e23 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/MeshData/TriangleMesh.h @@ -0,0 +1,291 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TRIANGLEMESH_CPP__ +# define ADSK_FUSION_TRIANGLEMESH_API XI_EXPORT +# else +# define ADSK_FUSION_TRIANGLEMESH_API +# endif +#else +# define ADSK_FUSION_TRIANGLEMESH_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class Point2D; + class Point3D; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// The TriangleMesh object represents all of the data defining +/// a triangular mesh. +class TriangleMesh : public core::Base { +public: + + /// Returns the total number of nodes in the mesh. + int nodeCount() const; + + /// Returns the node coordinates as an array of doubles where + /// they are the x, y, z components of each coordinate. + std::vector nodeCoordinatesAsDouble() const; + + /// Returns the node coordinates as an array of floats where + /// they are the x, y, z components of each coordinate. + std::vector nodeCoordinatesAsFloat() const; + + /// Returns the node coordinates as an array of Point3D objects. + std::vector> nodeCoordinates() const; + + /// Returns the number of triangles in the mesh. + int triangleCount() const; + + /// Returns the normal vectors of the mesh where there is a normal + /// vector at each node. The normals are returned as an array + /// of doubles where they are the x, y, z components of each vector. + std::vector normalVectorsAsDouble() const; + + /// Returns the normal vectors of the mesh where there is a normal + /// vector at each node. The normals are returned as an array + /// of floats where they are the x, y, z components of each vector. + std::vector normalVectorsAsFloat() const; + + /// Returns the normal vectors of the mesh where there is a normal + /// vector at each node. The normals are returned as an array + /// of Vector3D objects. + std::vector> normalVectors() const; + + /// Returns an array of indices that define which nodes are used + /// for each triangle. This is used to look-up the coordinates in the + /// NodeCoordinates array to get the three coordinates of each triangle. + std::vector nodeIndices() const; + + /// Returns the texture coordinates used when mapping a texture to + /// this face. The coordinates are returned as an array of + /// doubles where they are the u and v components of each + /// coordinate as defined in parametric space. There is a texture + /// coordinate for each vertex in the face mesh. + std::vector textureCoordinatesAsDouble() const; + + /// Returns the texture coordinates used when mapping a texture to + /// this face. The coordinates are returned as an array of + /// floats where they are the u and v components of each + /// coordinate as defined in parametric space. There is a texture + /// coordinate for each vertex in the face mesh. + std::vector textureCoordinatesAsFloat() const; + + /// Returns the texture coordinates used when mapping a texture to + /// this face. The coordinates are returned as an array of + /// Point2D objects where the x and y properties of the point are + /// u and v coordinates as defined in parametric space. There is + /// a texture coordinate for each vertex in the face mesh. + std::vector> textureCoordinates() const; + + /// Returns the surface tolerance that was used to generate this mesh. + /// This is most useful when using display meshes that have already + /// been calculated. + double surfaceTolerance() const; + + ADSK_FUSION_TRIANGLEMESH_API static const char* classType(); + ADSK_FUSION_TRIANGLEMESH_API const char* objectType() const override; + ADSK_FUSION_TRIANGLEMESH_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TRIANGLEMESH_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual int nodeCount_raw() const = 0; + virtual double* nodeCoordinatesAsDouble_raw(size_t& return_size) const = 0; + virtual float* nodeCoordinatesAsFloat_raw(size_t& return_size) const = 0; + virtual core::Point3D** nodeCoordinates_raw(size_t& return_size) const = 0; + virtual int triangleCount_raw() const = 0; + virtual double* normalVectorsAsDouble_raw(size_t& return_size) const = 0; + virtual float* normalVectorsAsFloat_raw(size_t& return_size) const = 0; + virtual core::Vector3D** normalVectors_raw(size_t& return_size) const = 0; + virtual int* nodeIndices_raw(size_t& return_size) const = 0; + virtual double* textureCoordinatesAsDouble_raw(size_t& return_size) const = 0; + virtual float* textureCoordinatesAsFloat_raw(size_t& return_size) const = 0; + virtual core::Point2D** textureCoordinates_raw(size_t& return_size) const = 0; + virtual double surfaceTolerance_raw() const = 0; +}; + +// Inline wrappers + +inline int TriangleMesh::nodeCount() const +{ + int res = nodeCount_raw(); + return res; +} + +inline std::vector TriangleMesh::nodeCoordinatesAsDouble() const +{ + std::vector res; + size_t s; + + double* p= nodeCoordinatesAsDouble_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector TriangleMesh::nodeCoordinatesAsFloat() const +{ + std::vector res; + size_t s; + + float* p= nodeCoordinatesAsFloat_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> TriangleMesh::nodeCoordinates() const +{ + std::vector> res; + size_t s; + + core::Point3D** p= nodeCoordinates_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline int TriangleMesh::triangleCount() const +{ + int res = triangleCount_raw(); + return res; +} + +inline std::vector TriangleMesh::normalVectorsAsDouble() const +{ + std::vector res; + size_t s; + + double* p= normalVectorsAsDouble_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector TriangleMesh::normalVectorsAsFloat() const +{ + std::vector res; + size_t s; + + float* p= normalVectorsAsFloat_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> TriangleMesh::normalVectors() const +{ + std::vector> res; + size_t s; + + core::Vector3D** p= normalVectors_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector TriangleMesh::nodeIndices() const +{ + std::vector res; + size_t s; + + int* p= nodeIndices_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector TriangleMesh::textureCoordinatesAsDouble() const +{ + std::vector res; + size_t s; + + double* p= textureCoordinatesAsDouble_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector TriangleMesh::textureCoordinatesAsFloat() const +{ + std::vector res; + size_t s; + + float* p= textureCoordinatesAsFloat_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> TriangleMesh::textureCoordinates() const +{ + std::vector> res; + size_t s; + + core::Point2D** p= textureCoordinates_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline double TriangleMesh::surfaceTolerance() const +{ + double res = surfaceTolerance_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TRIANGLEMESH_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/MeshData/TriangleMeshCalculator.h b/usr/autodesk/CPP/include/Fusion/MeshData/TriangleMeshCalculator.h new file mode 100644 index 0000000..e93ccdb --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/MeshData/TriangleMeshCalculator.h @@ -0,0 +1,173 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TRIANGLEMESHCALCULATOR_CPP__ +# define ADSK_FUSION_TRIANGLEMESHCALCULATOR_API XI_EXPORT +# else +# define ADSK_FUSION_TRIANGLEMESHCALCULATOR_API +# endif +#else +# define ADSK_FUSION_TRIANGLEMESHCALCULATOR_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class MeshManager; + class TriangleMesh; +}} + +namespace adsk { namespace fusion { + +/// Used to calculate new meshes for a B-Rep or T-Spline using defined criteria. +class TriangleMeshCalculator : public core::Base { +public: + + /// This is a simplified way to set the various settings that control the resulting mesh. When used it automatically + /// adjusts all of the property values appropriately. It does this for the given geometry by computing its bounding + /// box diameter. Then the surface tolerance is calculated as shown below where the meshLOD is the "Level of Detail" and + /// is described in more detail below. The diameter is the bounding box diameter. + /// double nodeApproximateSize = std::pow(2.0, meshLOD); + /// double fracTol = 1.0 / nodeApproximateSize; + /// surfaceTolerance = fracTol * diameter; + /// triangleMeshQuality : The mesh quality is specified by using an item from the enum list where the following items result + /// in a corresponding mesh LOD that's used in the equation above. + /// LowQualityTriangleMesh: 8 + /// NormalQualityTriangleMesh: 11 + /// HighQualityTriangleMesh: 13 + /// VeryHighQualityTriangleMesh: 15 + /// Returns true if setting the quality was successful. + bool setQuality(TriangleMeshQualityOptions triangleMeshQuality); + + /// Specifies the maximum distance that the mesh can deviate from the smooth surface. + /// The value is in centimeters. Smaller values can result in a much greater number + /// of facets being returned and will require more processing time to calculate. + double surfaceTolerance() const; + bool surfaceTolerance(double value); + + /// Specifies the maximum side of any triangle in the mesh. A value of 0 (the default) + /// indicates that no maximum length is specified. The value is specified in centimeters. + double maxSideLength() const; + bool maxSideLength(double value); + + /// Specifies the maximum length to height ratio that a triangle can have. + /// This helps to avoid long skinny triangles. A value of 0 (the default) + /// indicates that no maximum aspect ratio is specified. + double maxAspectRatio() const; + bool maxAspectRatio(double value); + + /// Specifies the maximum deviation between adjacent vertex normals. + /// This value is the maximum angle allowed between normals and is + /// specified in radians. A value of 0 (the default) indicates that no normal deviation is specified. + double maxNormalDeviation() const; + bool maxNormalDeviation(double value); + + /// Calculates a new triangle mesh based on the current settings. + /// Returns the new TriangleMesh object or null in the case where the calculation failed. + core::Ptr calculate(); + + /// Returns the parent MeshManager object. + core::Ptr parentMeshManager() const; + + ADSK_FUSION_TRIANGLEMESHCALCULATOR_API static const char* classType(); + ADSK_FUSION_TRIANGLEMESHCALCULATOR_API const char* objectType() const override; + ADSK_FUSION_TRIANGLEMESHCALCULATOR_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TRIANGLEMESHCALCULATOR_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool setQuality_raw(TriangleMeshQualityOptions triangleMeshQuality) = 0; + virtual double surfaceTolerance_raw() const = 0; + virtual bool surfaceTolerance_raw(double value) = 0; + virtual double maxSideLength_raw() const = 0; + virtual bool maxSideLength_raw(double value) = 0; + virtual double maxAspectRatio_raw() const = 0; + virtual bool maxAspectRatio_raw(double value) = 0; + virtual double maxNormalDeviation_raw() const = 0; + virtual bool maxNormalDeviation_raw(double value) = 0; + virtual TriangleMesh* calculate_raw() = 0; + virtual MeshManager* parentMeshManager_raw() const = 0; +}; + +// Inline wrappers + +inline bool TriangleMeshCalculator::setQuality(TriangleMeshQualityOptions triangleMeshQuality) +{ + bool res = setQuality_raw(triangleMeshQuality); + return res; +} + +inline double TriangleMeshCalculator::surfaceTolerance() const +{ + double res = surfaceTolerance_raw(); + return res; +} + +inline bool TriangleMeshCalculator::surfaceTolerance(double value) +{ + return surfaceTolerance_raw(value); +} + +inline double TriangleMeshCalculator::maxSideLength() const +{ + double res = maxSideLength_raw(); + return res; +} + +inline bool TriangleMeshCalculator::maxSideLength(double value) +{ + return maxSideLength_raw(value); +} + +inline double TriangleMeshCalculator::maxAspectRatio() const +{ + double res = maxAspectRatio_raw(); + return res; +} + +inline bool TriangleMeshCalculator::maxAspectRatio(double value) +{ + return maxAspectRatio_raw(value); +} + +inline double TriangleMeshCalculator::maxNormalDeviation() const +{ + double res = maxNormalDeviation_raw(); + return res; +} + +inline bool TriangleMeshCalculator::maxNormalDeviation(double value) +{ + return maxNormalDeviation_raw(value); +} + +inline core::Ptr TriangleMeshCalculator::calculate() +{ + core::Ptr res = calculate_raw(); + return res; +} + +inline core::Ptr TriangleMeshCalculator::parentMeshManager() const +{ + core::Ptr res = parentMeshManager_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TRIANGLEMESHCALCULATOR_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/MeshData/TriangleMeshList.h b/usr/autodesk/CPP/include/Fusion/MeshData/TriangleMeshList.h new file mode 100644 index 0000000..95a484e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/MeshData/TriangleMeshList.h @@ -0,0 +1,86 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TRIANGLEMESHLIST_CPP__ +# define ADSK_FUSION_TRIANGLEMESHLIST_API XI_EXPORT +# else +# define ADSK_FUSION_TRIANGLEMESHLIST_API +# endif +#else +# define ADSK_FUSION_TRIANGLEMESHLIST_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class TriangleMesh; +}} + +namespace adsk { namespace fusion { + +/// Provides access to a set of triangle meshes. +class TriangleMeshList : public core::Base { +public: + + /// Returns the specified triangle meshes. + /// index : The index of the mesh to return where the first item has an index of 0. + /// Returns the specified mesh or null in the case of invalid index. + core::Ptr item(size_t index) const; + + /// Returns the mesh with the tightest surface tolerance. This can return null + /// in the case the list is empty, ie. Count is 0. + core::Ptr bestMesh() const; + + /// Returns the number of meshes in the collection. + size_t count() const; + + ADSK_FUSION_TRIANGLEMESHLIST_API static const char* classType(); + ADSK_FUSION_TRIANGLEMESHLIST_API const char* objectType() const override; + ADSK_FUSION_TRIANGLEMESHLIST_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TRIANGLEMESHLIST_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual TriangleMesh* item_raw(size_t index) const = 0; + virtual TriangleMesh* bestMesh_raw() const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr TriangleMeshList::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr TriangleMeshList::bestMesh() const +{ + core::Ptr res = bestMesh_raw(); + return res; +} + +inline size_t TriangleMeshList::count() const +{ + size_t res = count_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TRIANGLEMESHLIST_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/AlongPathTextDefinition.h b/usr/autodesk/CPP/include/Fusion/Sketch/AlongPathTextDefinition.h new file mode 100644 index 0000000..1d99bb8 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/AlongPathTextDefinition.h @@ -0,0 +1,119 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/CoreTypeDefs.h" +#include "SketchTextDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_ALONGPATHTEXTDEFINITION_CPP__ +# define ADSK_FUSION_ALONGPATHTEXTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_ALONGPATHTEXTDEFINITION_API +# endif +#else +# define ADSK_FUSION_ALONGPATHTEXTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Defines the information for text that follows along a path. +class AlongPathTextDefinition : public SketchTextDefinition { +public: + + /// Get and sets the entity that defines the path for the text. This can be a SketchCurve or BRepEdge object. + core::Ptr path() const; + bool path(const core::Ptr& value); + + /// Gets and sets if the text should be positioned above or below the path entity. + bool isAbovePath() const; + bool isAbovePath(bool value); + + /// Gets and sets the horizontal alignment of the text with respect to the path curve. + core::HorizontalAlignments horizontalAlignment() const; + bool horizontalAlignment(core::HorizontalAlignments value); + + /// Gets and sets the spacing between the characters. This is an additional spacing to apply + /// that is defined as a percentage of the default spacing. A spacing of 0 indicates no + /// additional spacing. A spacing of 50 indicates to use the default plus 50% of the default. + double characterSpacing() const; + bool characterSpacing(double value); + + ADSK_FUSION_ALONGPATHTEXTDEFINITION_API static const char* classType(); + ADSK_FUSION_ALONGPATHTEXTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_ALONGPATHTEXTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_ALONGPATHTEXTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* path_raw() const = 0; + virtual bool path_raw(core::Base* value) = 0; + virtual bool isAbovePath_raw() const = 0; + virtual bool isAbovePath_raw(bool value) = 0; + virtual core::HorizontalAlignments horizontalAlignment_raw() const = 0; + virtual bool horizontalAlignment_raw(core::HorizontalAlignments value) = 0; + virtual double characterSpacing_raw() const = 0; + virtual bool characterSpacing_raw(double value) = 0; +}; + +// Inline wrappers + +inline core::Ptr AlongPathTextDefinition::path() const +{ + core::Ptr res = path_raw(); + return res; +} + +inline bool AlongPathTextDefinition::path(const core::Ptr& value) +{ + return path_raw(value.get()); +} + +inline bool AlongPathTextDefinition::isAbovePath() const +{ + bool res = isAbovePath_raw(); + return res; +} + +inline bool AlongPathTextDefinition::isAbovePath(bool value) +{ + return isAbovePath_raw(value); +} + +inline core::HorizontalAlignments AlongPathTextDefinition::horizontalAlignment() const +{ + core::HorizontalAlignments res = horizontalAlignment_raw(); + return res; +} + +inline bool AlongPathTextDefinition::horizontalAlignment(core::HorizontalAlignments value) +{ + return horizontalAlignment_raw(value); +} + +inline double AlongPathTextDefinition::characterSpacing() const +{ + double res = characterSpacing_raw(); + return res; +} + +inline bool AlongPathTextDefinition::characterSpacing(double value) +{ + return characterSpacing_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_ALONGPATHTEXTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/CircularPatternConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/CircularPatternConstraint.h new file mode 100644 index 0000000..7af4a79 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/CircularPatternConstraint.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CIRCULARPATTERNCONSTRAINT_CPP__ +# define ADSK_FUSION_CIRCULARPATTERNCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_CIRCULARPATTERNCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_CIRCULARPATTERNCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// A circular pattern constraint in a sketch. +class CircularPatternConstraint : public GeometricConstraint { +public: + + ADSK_FUSION_CIRCULARPATTERNCONSTRAINT_API static const char* classType(); + ADSK_FUSION_CIRCULARPATTERNCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_CIRCULARPATTERNCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CIRCULARPATTERNCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CIRCULARPATTERNCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/CoincidentConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/CoincidentConstraint.h new file mode 100644 index 0000000..882759f --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/CoincidentConstraint.h @@ -0,0 +1,101 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_COINCIDENTCONSTRAINT_CPP__ +# define ADSK_FUSION_COINCIDENTCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_COINCIDENTCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_COINCIDENTCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchEntity; + class SketchPoint; +}} + +namespace adsk { namespace fusion { + +/// A coincident constraint in a sketch. +class CoincidentConstraint : public GeometricConstraint { +public: + + /// Returns the sketch point that is constrained. + core::Ptr point() const; + + /// The sketch curve or point the point is constrained to. + core::Ptr entity() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_COINCIDENTCONSTRAINT_API static const char* classType(); + ADSK_FUSION_COINCIDENTCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_COINCIDENTCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_COINCIDENTCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchPoint* point_raw() const = 0; + virtual SketchEntity* entity_raw() const = 0; + virtual CoincidentConstraint* nativeObject_raw() const = 0; + virtual CoincidentConstraint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr CoincidentConstraint::point() const +{ + core::Ptr res = point_raw(); + return res; +} + +inline core::Ptr CoincidentConstraint::entity() const +{ + core::Ptr res = entity_raw(); + return res; +} + +inline core::Ptr CoincidentConstraint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr CoincidentConstraint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_COINCIDENTCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/CollinearConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/CollinearConstraint.h new file mode 100644 index 0000000..6cb2eb9 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/CollinearConstraint.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_COLLINEARCONSTRAINT_CPP__ +# define ADSK_FUSION_COLLINEARCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_COLLINEARCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_COLLINEARCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchLine; +}} + +namespace adsk { namespace fusion { + +/// A collinear constraint in a sketch. +class CollinearConstraint : public GeometricConstraint { +public: + + /// Returns the first line. + core::Ptr lineOne() const; + + /// Returns the second line. + core::Ptr lineTwo() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_COLLINEARCONSTRAINT_API static const char* classType(); + ADSK_FUSION_COLLINEARCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_COLLINEARCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_COLLINEARCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchLine* lineOne_raw() const = 0; + virtual SketchLine* lineTwo_raw() const = 0; + virtual CollinearConstraint* nativeObject_raw() const = 0; + virtual CollinearConstraint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr CollinearConstraint::lineOne() const +{ + core::Ptr res = lineOne_raw(); + return res; +} + +inline core::Ptr CollinearConstraint::lineTwo() const +{ + core::Ptr res = lineTwo_raw(); + return res; +} + +inline core::Ptr CollinearConstraint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr CollinearConstraint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_COLLINEARCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/ConcentricConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/ConcentricConstraint.h new file mode 100644 index 0000000..fc9c59d --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/ConcentricConstraint.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_CONCENTRICCONSTRAINT_CPP__ +# define ADSK_FUSION_CONCENTRICCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_CONCENTRICCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_CONCENTRICCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchCurve; +}} + +namespace adsk { namespace fusion { + +/// A concentric constraint in a sketch. +class ConcentricConstraint : public GeometricConstraint { +public: + + /// Returns the first curve. + core::Ptr entityOne() const; + + /// Returns the second curve. + core::Ptr entityTwo() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_CONCENTRICCONSTRAINT_API static const char* classType(); + ADSK_FUSION_CONCENTRICCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_CONCENTRICCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_CONCENTRICCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchCurve* entityOne_raw() const = 0; + virtual SketchCurve* entityTwo_raw() const = 0; + virtual ConcentricConstraint* nativeObject_raw() const = 0; + virtual ConcentricConstraint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr ConcentricConstraint::entityOne() const +{ + core::Ptr res = entityOne_raw(); + return res; +} + +inline core::Ptr ConcentricConstraint::entityTwo() const +{ + core::Ptr res = entityTwo_raw(); + return res; +} + +inline core::Ptr ConcentricConstraint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr ConcentricConstraint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_CONCENTRICCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/EqualConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/EqualConstraint.h new file mode 100644 index 0000000..4a6cec9 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/EqualConstraint.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_EQUALCONSTRAINT_CPP__ +# define ADSK_FUSION_EQUALCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_EQUALCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_EQUALCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchCurve; +}} + +namespace adsk { namespace fusion { + +/// An equal constraint in a sketch. +class EqualConstraint : public GeometricConstraint { +public: + + /// Returns the first curve. + core::Ptr curveOne() const; + + /// Returns the second curve. + core::Ptr curveTwo() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_EQUALCONSTRAINT_API static const char* classType(); + ADSK_FUSION_EQUALCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_EQUALCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_EQUALCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchCurve* curveOne_raw() const = 0; + virtual SketchCurve* curveTwo_raw() const = 0; + virtual EqualConstraint* nativeObject_raw() const = 0; + virtual EqualConstraint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr EqualConstraint::curveOne() const +{ + core::Ptr res = curveOne_raw(); + return res; +} + +inline core::Ptr EqualConstraint::curveTwo() const +{ + core::Ptr res = curveTwo_raw(); + return res; +} + +inline core::Ptr EqualConstraint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr EqualConstraint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_EQUALCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/FitOnPathTextDefintion.h b/usr/autodesk/CPP/include/Fusion/Sketch/FitOnPathTextDefintion.h new file mode 100644 index 0000000..3e16925 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/FitOnPathTextDefintion.h @@ -0,0 +1,82 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchTextDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_FITONPATHTEXTDEFINTION_CPP__ +# define ADSK_FUSION_FITONPATHTEXTDEFINTION_API XI_EXPORT +# else +# define ADSK_FUSION_FITONPATHTEXTDEFINTION_API +# endif +#else +# define ADSK_FUSION_FITONPATHTEXTDEFINTION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// Defines the information for text that fits along a path. +class FitOnPathTextDefintion : public SketchTextDefinition { +public: + + /// Get and sets the entity that defines the path for the text. This can be a SketchCurve or BRepEdge object. + core::Ptr path() const; + bool path(const core::Ptr& value); + + /// Gets and sets if the text should be positioned above or below the path entity. + bool isAbovePath() const; + bool isAbovePath(bool value); + + ADSK_FUSION_FITONPATHTEXTDEFINTION_API static const char* classType(); + ADSK_FUSION_FITONPATHTEXTDEFINTION_API const char* objectType() const override; + ADSK_FUSION_FITONPATHTEXTDEFINTION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_FITONPATHTEXTDEFINTION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Base* path_raw() const = 0; + virtual bool path_raw(core::Base* value) = 0; + virtual bool isAbovePath_raw() const = 0; + virtual bool isAbovePath_raw(bool value) = 0; +}; + +// Inline wrappers + +inline core::Ptr FitOnPathTextDefintion::path() const +{ + core::Ptr res = path_raw(); + return res; +} + +inline bool FitOnPathTextDefintion::path(const core::Ptr& value) +{ + return path_raw(value.get()); +} + +inline bool FitOnPathTextDefintion::isAbovePath() const +{ + bool res = isAbovePath_raw(); + return res; +} + +inline bool FitOnPathTextDefintion::isAbovePath(bool value) +{ + return isAbovePath_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_FITONPATHTEXTDEFINTION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/GeometricConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/GeometricConstraint.h new file mode 100644 index 0000000..66b84a7 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/GeometricConstraint.h @@ -0,0 +1,163 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_GEOMETRICCONSTRAINT_CPP__ +# define ADSK_FUSION_GEOMETRICCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_GEOMETRICCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_GEOMETRICCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class Sketch; +}} +namespace adsk { namespace core { + class Attributes; +}} + +namespace adsk { namespace fusion { + +/// The base class for all geometric constraints. +class GeometricConstraint : public core::Base { +public: + + /// Deletes this constraint. The IsDeletable property can be used to determine if this + /// constraint can be deleted. + /// Returns true if the delete was successful. + bool deleteMe(); + + /// Indicates if this constraint is deletable. + bool isDeletable() const; + + /// Returns the parent sketch object. + core::Ptr parentSketch() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this object + /// in an assembly. This is only valid in the case where this is acting + /// as a proxy in an assembly. Returns null in the case where the object + /// is not in the context of an assembly but is already the native object. + core::Ptr assemblyContext() const; + + /// Returns the collection of attributes associated with this geometric constraint. + core::Ptr attributes() const; + + /// Returns a token for the GeometricConstraint object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same geometric constraint. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + ADSK_FUSION_GEOMETRICCONSTRAINT_API static const char* classType(); + ADSK_FUSION_GEOMETRICCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_GEOMETRICCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_GEOMETRICCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool deleteMe_raw() = 0; + virtual bool isDeletable_raw() const = 0; + virtual Sketch* parentSketch_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual char* entityToken_raw() const = 0; + virtual void placeholderGeometricConstraint0() {} + virtual void placeholderGeometricConstraint1() {} + virtual void placeholderGeometricConstraint2() {} + virtual void placeholderGeometricConstraint3() {} + virtual void placeholderGeometricConstraint4() {} + virtual void placeholderGeometricConstraint5() {} + virtual void placeholderGeometricConstraint6() {} + virtual void placeholderGeometricConstraint7() {} + virtual void placeholderGeometricConstraint8() {} + virtual void placeholderGeometricConstraint9() {} + virtual void placeholderGeometricConstraint10() {} + virtual void placeholderGeometricConstraint11() {} + virtual void placeholderGeometricConstraint12() {} + virtual void placeholderGeometricConstraint13() {} + virtual void placeholderGeometricConstraint14() {} + virtual void placeholderGeometricConstraint15() {} + virtual void placeholderGeometricConstraint16() {} + virtual void placeholderGeometricConstraint17() {} + virtual void placeholderGeometricConstraint18() {} + virtual void placeholderGeometricConstraint19() {} + virtual void placeholderGeometricConstraint20() {} + virtual void placeholderGeometricConstraint21() {} + virtual void placeholderGeometricConstraint22() {} + virtual void placeholderGeometricConstraint23() {} + virtual void placeholderGeometricConstraint24() {} + virtual void placeholderGeometricConstraint25() {} +}; + +// Inline wrappers + +inline bool GeometricConstraint::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline bool GeometricConstraint::isDeletable() const +{ + bool res = isDeletable_raw(); + return res; +} + +inline core::Ptr GeometricConstraint::parentSketch() const +{ + core::Ptr res = parentSketch_raw(); + return res; +} + +inline core::Ptr GeometricConstraint::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr GeometricConstraint::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline std::string GeometricConstraint::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_GEOMETRICCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/GeometricConstraintList.h b/usr/autodesk/CPP/include/Fusion/Sketch/GeometricConstraintList.h new file mode 100644 index 0000000..9028cfc --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/GeometricConstraintList.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_GEOMETRICCONSTRAINTLIST_CPP__ +# define ADSK_FUSION_GEOMETRICCONSTRAINTLIST_API XI_EXPORT +# else +# define ADSK_FUSION_GEOMETRICCONSTRAINTLIST_API +# endif +#else +# define ADSK_FUSION_GEOMETRICCONSTRAINTLIST_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class GeometricConstraint; +}} + +namespace adsk { namespace fusion { + +/// A list of geometric constraints. +class GeometricConstraintList : public core::Base { +public: + + /// Function that returns the specified geometry constraint using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of constraints in the sketch. + size_t count() const; + + typedef GeometricConstraint iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_GEOMETRICCONSTRAINTLIST_API static const char* classType(); + ADSK_FUSION_GEOMETRICCONSTRAINTLIST_API const char* objectType() const override; + ADSK_FUSION_GEOMETRICCONSTRAINTLIST_API void* queryInterface(const char* id) const override; + ADSK_FUSION_GEOMETRICCONSTRAINTLIST_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual GeometricConstraint* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr GeometricConstraintList::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t GeometricConstraintList::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void GeometricConstraintList::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_GEOMETRICCONSTRAINTLIST_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/GeometricConstraints.h b/usr/autodesk/CPP/include/Fusion/Sketch/GeometricConstraints.h new file mode 100644 index 0000000..d3aeb68 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/GeometricConstraints.h @@ -0,0 +1,289 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_GEOMETRICCONSTRAINTS_CPP__ +# define ADSK_FUSION_GEOMETRICCONSTRAINTS_API XI_EXPORT +# else +# define ADSK_FUSION_GEOMETRICCONSTRAINTS_API +# endif +#else +# define ADSK_FUSION_GEOMETRICCONSTRAINTS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class CoincidentConstraint; + class CollinearConstraint; + class ConcentricConstraint; + class EqualConstraint; + class GeometricConstraint; + class HorizontalConstraint; + class HorizontalPointsConstraint; + class MidPointConstraint; + class ParallelConstraint; + class PerpendicularConstraint; + class SketchCurve; + class SketchEntity; + class SketchLine; + class SketchPoint; + class SmoothConstraint; + class SymmetryConstraint; + class TangentConstraint; + class VerticalConstraint; + class VerticalPointsConstraint; +}} + +namespace adsk { namespace fusion { + +/// A collection of all of the geometric constraints in a sketch. This object +/// also supports the methods to create new geometric constraints. +class GeometricConstraints : public core::Base { +public: + + /// Function that returns the specified sketch constraint using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of constraints in the sketch. + size_t count() const; + + /// Creates a new coincident constraint between two entities. The first argument + /// is a sketch point. The second argument is a sketch curve or point. + /// point : The SketchPoint that will be made coincident. + /// entity : The SketchPoint or sketch curve that the point will be made coincident to. + /// Returns the newly created CoincidentConstraint object or null if the creation failed. + core::Ptr addCoincident(const core::Ptr& point, const core::Ptr& entity); + + /// Creates a new collinear constraint between two lines. + /// lineOne : The first line to create the constraint on. + /// lineTwo : The second line to create the constraint on. + /// Returns the newly created CollinearConstraint object or null if the creation failed. + core::Ptr addCollinear(const core::Ptr& lineOne, const core::Ptr& lineTwo); + + /// Creates a new concentric constraint between two circles, arcs, ellipses, or elliptical arcs. + /// entityOne : The first circle, arc, ellipse or elliptical arc. + /// entityTwo : The second circle, arc, ellipse or elliptical arc. + /// Returns the newly created ConcentricConstraint object or null if the creation failed. + core::Ptr addConcentric(const core::Ptr& entityOne, const core::Ptr& entityTwo); + + /// Creates a new midpoint constraint between a point and a curve. + /// point : The point to constrain to the midpoint of a curve. + /// midPointCurve : The curve that defines the midpoint to constraint to. + /// Returns the newly created MidPointConstraint object or null if the creation failed. + core::Ptr addMidPoint(const core::Ptr& point, const core::Ptr& midPointCurve); + + /// Creates a new parallel constraint between two lines. + /// lineOne : The first SketchLine. + /// lineTwo : The second SketchLine. + /// Returns the newly created ParallelConstraint object or null if the creation failed. + core::Ptr addParallel(const core::Ptr& lineOne, const core::Ptr& lineTwo); + + /// Creates a new perpendicular constraint between two lines. + /// lineOne : The first SketchLine. + /// lineTwo : The second SketchLine. + /// Returns the newly created PerpendicularConstraint object or null if the creation failed. + core::Ptr addPerpendicular(const core::Ptr& lineOne, const core::Ptr& lineTwo); + + /// Creates a new horizontal constraint on a line. + /// line : The line to constrain horizontally. + /// Returns the newly created HorizontalConstraint object or null if the creation failed. + core::Ptr addHorizontal(const core::Ptr& line); + + /// Creates a new horizontal constraint between two points. + /// pointOne : The first SketchPoint to constrain horizontally. + /// pointTwo : The second SketchPoint to constrain horizontally. + /// Returns the newly created HorizontalPointsConstraint object or null if the creation failed. + core::Ptr addHorizontalPoints(const core::Ptr& pointOne, const core::Ptr& pointTwo); + + /// Creates a new vertical constraint on a line. + /// line : The line to constrain vertically. + /// Returns the newly created VerticalConstraint object or null if the creation failed. + core::Ptr addVertical(const core::Ptr& line); + + /// Creates a new vertical constraint between two points. + /// pointOne : The first SketchPoint to constrain vertically. + /// pointTwo : The second SketchPoint to constrain vertically. + /// Returns the newly created VerticalPointsConstraint object or null if the creation failed. + core::Ptr addVerticalPoints(const core::Ptr& pointOne, const core::Ptr& pointTwo); + + /// Creates a new tangent constraint between two curves. + /// curveOne : The first curve to be tangent. + /// curveTwo : The second curve to be tangent. + /// Returns the newly created TangentConstraint object or null if the creation failed. + core::Ptr addTangent(const core::Ptr& curveOne, const core::Ptr& curveTwo); + + /// Creates a new smooth constraint between two curves. One of the curves + /// must be a spline. The other curve can be a spline or an arc. + /// curveOne : The first curve to be constrained to be smooth to the second curve. + /// curveTwo : The second curve to be constrained to be smooth to the first curve. + /// Returns the newly created SmoothConstraint object or null if the creation failed. + core::Ptr addSmooth(const core::Ptr& curveOne, const core::Ptr& curveTwo); + + /// Creates a new equal constraint between two lines, or between arcs and circles. + /// curveOne : The first line, arc, or circle. + /// curveTwo : The second line, arc, or circle. + /// Returns the newly created EqualConstraint object or null if the creation failed. + core::Ptr addEqual(const core::Ptr& curveOne, const core::Ptr& curveTwo); + + /// Creates a new symmetry constraint. + /// entityOne : The first sketch entity to be symmetric. + /// entityTwo : The second sketch entity to be symmetric. It must be the same type as the first entity. + /// symmetryLine : The SketchLine that defines the axis of symmetry. + /// Returns the newly created SymmetryConstraint object or null if the creation failed. + core::Ptr addSymmetry(const core::Ptr& entityOne, const core::Ptr& entityTwo, const core::Ptr& symmetryLine); + + typedef GeometricConstraint iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_GEOMETRICCONSTRAINTS_API static const char* classType(); + ADSK_FUSION_GEOMETRICCONSTRAINTS_API const char* objectType() const override; + ADSK_FUSION_GEOMETRICCONSTRAINTS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_GEOMETRICCONSTRAINTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual GeometricConstraint* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual CoincidentConstraint* addCoincident_raw(SketchPoint* point, SketchEntity* entity) = 0; + virtual CollinearConstraint* addCollinear_raw(SketchLine* lineOne, SketchLine* lineTwo) = 0; + virtual ConcentricConstraint* addConcentric_raw(SketchCurve* entityOne, SketchCurve* entityTwo) = 0; + virtual MidPointConstraint* addMidPoint_raw(SketchPoint* point, SketchCurve* midPointCurve) = 0; + virtual ParallelConstraint* addParallel_raw(SketchLine* lineOne, SketchLine* lineTwo) = 0; + virtual PerpendicularConstraint* addPerpendicular_raw(SketchLine* lineOne, SketchLine* lineTwo) = 0; + virtual HorizontalConstraint* addHorizontal_raw(SketchLine* line) = 0; + virtual HorizontalPointsConstraint* addHorizontalPoints_raw(SketchPoint* pointOne, SketchPoint* pointTwo) = 0; + virtual VerticalConstraint* addVertical_raw(SketchLine* line) = 0; + virtual VerticalPointsConstraint* addVerticalPoints_raw(SketchPoint* pointOne, SketchPoint* pointTwo) = 0; + virtual TangentConstraint* addTangent_raw(SketchCurve* curveOne, SketchCurve* curveTwo) = 0; + virtual SmoothConstraint* addSmooth_raw(SketchCurve* curveOne, SketchCurve* curveTwo) = 0; + virtual EqualConstraint* addEqual_raw(SketchCurve* curveOne, SketchCurve* curveTwo) = 0; + virtual SymmetryConstraint* addSymmetry_raw(SketchEntity* entityOne, SketchEntity* entityTwo, SketchLine* symmetryLine) = 0; +}; + +// Inline wrappers + +inline core::Ptr GeometricConstraints::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t GeometricConstraints::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr GeometricConstraints::addCoincident(const core::Ptr& point, const core::Ptr& entity) +{ + core::Ptr res = addCoincident_raw(point.get(), entity.get()); + return res; +} + +inline core::Ptr GeometricConstraints::addCollinear(const core::Ptr& lineOne, const core::Ptr& lineTwo) +{ + core::Ptr res = addCollinear_raw(lineOne.get(), lineTwo.get()); + return res; +} + +inline core::Ptr GeometricConstraints::addConcentric(const core::Ptr& entityOne, const core::Ptr& entityTwo) +{ + core::Ptr res = addConcentric_raw(entityOne.get(), entityTwo.get()); + return res; +} + +inline core::Ptr GeometricConstraints::addMidPoint(const core::Ptr& point, const core::Ptr& midPointCurve) +{ + core::Ptr res = addMidPoint_raw(point.get(), midPointCurve.get()); + return res; +} + +inline core::Ptr GeometricConstraints::addParallel(const core::Ptr& lineOne, const core::Ptr& lineTwo) +{ + core::Ptr res = addParallel_raw(lineOne.get(), lineTwo.get()); + return res; +} + +inline core::Ptr GeometricConstraints::addPerpendicular(const core::Ptr& lineOne, const core::Ptr& lineTwo) +{ + core::Ptr res = addPerpendicular_raw(lineOne.get(), lineTwo.get()); + return res; +} + +inline core::Ptr GeometricConstraints::addHorizontal(const core::Ptr& line) +{ + core::Ptr res = addHorizontal_raw(line.get()); + return res; +} + +inline core::Ptr GeometricConstraints::addHorizontalPoints(const core::Ptr& pointOne, const core::Ptr& pointTwo) +{ + core::Ptr res = addHorizontalPoints_raw(pointOne.get(), pointTwo.get()); + return res; +} + +inline core::Ptr GeometricConstraints::addVertical(const core::Ptr& line) +{ + core::Ptr res = addVertical_raw(line.get()); + return res; +} + +inline core::Ptr GeometricConstraints::addVerticalPoints(const core::Ptr& pointOne, const core::Ptr& pointTwo) +{ + core::Ptr res = addVerticalPoints_raw(pointOne.get(), pointTwo.get()); + return res; +} + +inline core::Ptr GeometricConstraints::addTangent(const core::Ptr& curveOne, const core::Ptr& curveTwo) +{ + core::Ptr res = addTangent_raw(curveOne.get(), curveTwo.get()); + return res; +} + +inline core::Ptr GeometricConstraints::addSmooth(const core::Ptr& curveOne, const core::Ptr& curveTwo) +{ + core::Ptr res = addSmooth_raw(curveOne.get(), curveTwo.get()); + return res; +} + +inline core::Ptr GeometricConstraints::addEqual(const core::Ptr& curveOne, const core::Ptr& curveTwo) +{ + core::Ptr res = addEqual_raw(curveOne.get(), curveTwo.get()); + return res; +} + +inline core::Ptr GeometricConstraints::addSymmetry(const core::Ptr& entityOne, const core::Ptr& entityTwo, const core::Ptr& symmetryLine) +{ + core::Ptr res = addSymmetry_raw(entityOne.get(), entityTwo.get(), symmetryLine.get()); + return res; +} + +template inline void GeometricConstraints::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_GEOMETRICCONSTRAINTS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/HorizontalConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/HorizontalConstraint.h new file mode 100644 index 0000000..b3d5b8a --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/HorizontalConstraint.h @@ -0,0 +1,90 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_HORIZONTALCONSTRAINT_CPP__ +# define ADSK_FUSION_HORIZONTALCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_HORIZONTALCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_HORIZONTALCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchLine; +}} + +namespace adsk { namespace fusion { + +/// A horizontal constraint in a sketch. +class HorizontalConstraint : public GeometricConstraint { +public: + + /// Returns the line being constrained. + core::Ptr line() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_HORIZONTALCONSTRAINT_API static const char* classType(); + ADSK_FUSION_HORIZONTALCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_HORIZONTALCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_HORIZONTALCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchLine* line_raw() const = 0; + virtual HorizontalConstraint* nativeObject_raw() const = 0; + virtual HorizontalConstraint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr HorizontalConstraint::line() const +{ + core::Ptr res = line_raw(); + return res; +} + +inline core::Ptr HorizontalConstraint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr HorizontalConstraint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_HORIZONTALCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/HorizontalPointsConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/HorizontalPointsConstraint.h new file mode 100644 index 0000000..a3e2677 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/HorizontalPointsConstraint.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_HORIZONTALPOINTSCONSTRAINT_CPP__ +# define ADSK_FUSION_HORIZONTALPOINTSCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_HORIZONTALPOINTSCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_HORIZONTALPOINTSCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchPoint; +}} + +namespace adsk { namespace fusion { + +/// A horizontal constraint between two points in a sketch. +class HorizontalPointsConstraint : public GeometricConstraint { +public: + + /// Returns the first point. + core::Ptr pointOne() const; + + /// Returns the second point. + core::Ptr pointTwo() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_HORIZONTALPOINTSCONSTRAINT_API static const char* classType(); + ADSK_FUSION_HORIZONTALPOINTSCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_HORIZONTALPOINTSCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_HORIZONTALPOINTSCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchPoint* pointOne_raw() const = 0; + virtual SketchPoint* pointTwo_raw() const = 0; + virtual HorizontalPointsConstraint* nativeObject_raw() const = 0; + virtual HorizontalPointsConstraint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr HorizontalPointsConstraint::pointOne() const +{ + core::Ptr res = pointOne_raw(); + return res; +} + +inline core::Ptr HorizontalPointsConstraint::pointTwo() const +{ + core::Ptr res = pointTwo_raw(); + return res; +} + +inline core::Ptr HorizontalPointsConstraint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr HorizontalPointsConstraint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_HORIZONTALPOINTSCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/MidPointConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/MidPointConstraint.h new file mode 100644 index 0000000..9ff20f8 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/MidPointConstraint.h @@ -0,0 +1,101 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_MIDPOINTCONSTRAINT_CPP__ +# define ADSK_FUSION_MIDPOINTCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_MIDPOINTCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_MIDPOINTCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchCurve; + class SketchPoint; +}} + +namespace adsk { namespace fusion { + +/// A midpoint constraint in a sketch. +class MidPointConstraint : public GeometricConstraint { +public: + + /// Returns the sketch point being constrained. + core::Ptr point() const; + + /// Returns the curve defining the midpoint. + core::Ptr midPointCurve() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_MIDPOINTCONSTRAINT_API static const char* classType(); + ADSK_FUSION_MIDPOINTCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_MIDPOINTCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_MIDPOINTCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchPoint* point_raw() const = 0; + virtual SketchCurve* midPointCurve_raw() const = 0; + virtual MidPointConstraint* nativeObject_raw() const = 0; + virtual MidPointConstraint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr MidPointConstraint::point() const +{ + core::Ptr res = point_raw(); + return res; +} + +inline core::Ptr MidPointConstraint::midPointCurve() const +{ + core::Ptr res = midPointCurve_raw(); + return res; +} + +inline core::Ptr MidPointConstraint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr MidPointConstraint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_MIDPOINTCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/MultiLineTextDefinition.h b/usr/autodesk/CPP/include/Fusion/Sketch/MultiLineTextDefinition.h new file mode 100644 index 0000000..346dc92 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/MultiLineTextDefinition.h @@ -0,0 +1,133 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/CoreTypeDefs.h" +#include "../FusionTypeDefs.h" +#include "SketchTextDefinition.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_MULTILINETEXTDEFINITION_CPP__ +# define ADSK_FUSION_MULTILINETEXTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_MULTILINETEXTDEFINITION_API +# endif +#else +# define ADSK_FUSION_MULTILINETEXTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchLineList; +}} + +namespace adsk { namespace fusion { + +/// Defines the information for multi-line text. +class MultiLineTextDefinition : public SketchTextDefinition { +public: + + /// Returns the four sketch lines that define the boundary of the sketch text. By adding constraints to these lines + /// you can associatively control the size, position and angle of the sketch text. If the MultiLineTextDefinition + /// object is obtained from a SketchTextInput object, this property will return null because the text and it's + /// associated lines have not been created yet. + core::Ptr rectangleLines() const; + + /// Gets and sets the horizontal alignment of the text with respect to the text rectangle. + core::HorizontalAlignments horizontalAlignment() const; + bool horizontalAlignment(core::HorizontalAlignments value); + + /// Gets and sets the vertical alignment of the text with respect to the text rectangle. + core::VerticalAlignments verticalAlignment() const; + bool verticalAlignment(core::VerticalAlignments value); + + /// Rotates the text box. + /// angle : The angle to rotate the text, specified in radians. + /// keyPoint : The key point the rotation is defined around. This is optional and defaults the center of the text box. + /// + bool rotate(double angle, TextBoxKeyPoints keyPoint = adsk::fusion::MiddleTextBoxKeyPoint); + + /// Gets and sets the spacing between the characters. This is an additional spacing to apply + /// that is defined as a percentage of the default spacing. A spacing of 0 indicates no + /// additional spacing. A spacing of 50 indicates to use the default plus 50% of the default. + double characterSpacing() const; + bool characterSpacing(double value); + + ADSK_FUSION_MULTILINETEXTDEFINITION_API static const char* classType(); + ADSK_FUSION_MULTILINETEXTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_MULTILINETEXTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_MULTILINETEXTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchLineList* rectangleLines_raw() const = 0; + virtual core::HorizontalAlignments horizontalAlignment_raw() const = 0; + virtual bool horizontalAlignment_raw(core::HorizontalAlignments value) = 0; + virtual core::VerticalAlignments verticalAlignment_raw() const = 0; + virtual bool verticalAlignment_raw(core::VerticalAlignments value) = 0; + virtual bool rotate_raw(double angle, TextBoxKeyPoints keyPoint) = 0; + virtual double characterSpacing_raw() const = 0; + virtual bool characterSpacing_raw(double value) = 0; +}; + +// Inline wrappers + +inline core::Ptr MultiLineTextDefinition::rectangleLines() const +{ + core::Ptr res = rectangleLines_raw(); + return res; +} + +inline core::HorizontalAlignments MultiLineTextDefinition::horizontalAlignment() const +{ + core::HorizontalAlignments res = horizontalAlignment_raw(); + return res; +} + +inline bool MultiLineTextDefinition::horizontalAlignment(core::HorizontalAlignments value) +{ + return horizontalAlignment_raw(value); +} + +inline core::VerticalAlignments MultiLineTextDefinition::verticalAlignment() const +{ + core::VerticalAlignments res = verticalAlignment_raw(); + return res; +} + +inline bool MultiLineTextDefinition::verticalAlignment(core::VerticalAlignments value) +{ + return verticalAlignment_raw(value); +} + +inline bool MultiLineTextDefinition::rotate(double angle, TextBoxKeyPoints keyPoint) +{ + bool res = rotate_raw(angle, keyPoint); + return res; +} + +inline double MultiLineTextDefinition::characterSpacing() const +{ + double res = characterSpacing_raw(); + return res; +} + +inline bool MultiLineTextDefinition::characterSpacing(double value) +{ + return characterSpacing_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_MULTILINETEXTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/OffsetConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/OffsetConstraint.h new file mode 100644 index 0000000..269f98b --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/OffsetConstraint.h @@ -0,0 +1,147 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_OFFSETCONSTRAINT_CPP__ +# define ADSK_FUSION_OFFSETCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_OFFSETCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_OFFSETCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchCurve; + class SketchDimension; +}} + +namespace adsk { namespace fusion { + +/// An offset constraint in a sketch. +class OffsetConstraint : public GeometricConstraint { +public: + + /// Returns an array of sketch curves that are the set of parent curves. + /// Nothing should be assumed about the order in how the curves are returned. + std::vector> parentCurves() const; + + /// Returns an array of sketch curves that are the set of child curves resulting from the offset. + /// Nothing should be assumed about the order in how the curves are returned. + std::vector> childCurves() const; + + /// The current distance of the offset in centimeters. To change the offset you need to + /// modify the value of the parameter associated with the dimension, which you can get + /// using the dimension property. + double distance() const; + + /// Returns the dimension controlling the offset distance. This can return null in the + /// case where the dimension has been deleted. To change the offset distance you can use + /// the parameter property of the returned dimension to get the parameter that controls the value and + /// use properties on the parameter to change the value. This can return either a SketchOffsetCurvesDimension + /// or an SketchOffsetDimension. A SketchOffsetCurvesDimension is created automatically when curves are + /// offset but if it is deleted the offset can also be controlled by a SketchOffsetDimension. + core::Ptr dimension() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_OFFSETCONSTRAINT_API static const char* classType(); + ADSK_FUSION_OFFSETCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_OFFSETCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_OFFSETCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchCurve** parentCurves_raw(size_t& return_size) const = 0; + virtual SketchCurve** childCurves_raw(size_t& return_size) const = 0; + virtual double distance_raw() const = 0; + virtual SketchDimension* dimension_raw() const = 0; + virtual OffsetConstraint* nativeObject_raw() const = 0; + virtual OffsetConstraint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline std::vector> OffsetConstraint::parentCurves() const +{ + std::vector> res; + size_t s; + + SketchCurve** p= parentCurves_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> OffsetConstraint::childCurves() const +{ + std::vector> res; + size_t s; + + SketchCurve** p= childCurves_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline double OffsetConstraint::distance() const +{ + double res = distance_raw(); + return res; +} + +inline core::Ptr OffsetConstraint::dimension() const +{ + core::Ptr res = dimension_raw(); + return res; +} + +inline core::Ptr OffsetConstraint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr OffsetConstraint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_OFFSETCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/ParallelConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/ParallelConstraint.h new file mode 100644 index 0000000..8acab53 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/ParallelConstraint.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PARALLELCONSTRAINT_CPP__ +# define ADSK_FUSION_PARALLELCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_PARALLELCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_PARALLELCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchLine; +}} + +namespace adsk { namespace fusion { + +/// A parallel constraint in a sketch. +class ParallelConstraint : public GeometricConstraint { +public: + + /// Returns the first line. + core::Ptr lineOne() const; + + /// Returns the second line. + core::Ptr lineTwo() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_PARALLELCONSTRAINT_API static const char* classType(); + ADSK_FUSION_PARALLELCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_PARALLELCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PARALLELCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchLine* lineOne_raw() const = 0; + virtual SketchLine* lineTwo_raw() const = 0; + virtual ParallelConstraint* nativeObject_raw() const = 0; + virtual ParallelConstraint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr ParallelConstraint::lineOne() const +{ + core::Ptr res = lineOne_raw(); + return res; +} + +inline core::Ptr ParallelConstraint::lineTwo() const +{ + core::Ptr res = lineTwo_raw(); + return res; +} + +inline core::Ptr ParallelConstraint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr ParallelConstraint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PARALLELCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/PerpendicularConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/PerpendicularConstraint.h new file mode 100644 index 0000000..18b2ed1 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/PerpendicularConstraint.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PERPENDICULARCONSTRAINT_CPP__ +# define ADSK_FUSION_PERPENDICULARCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_PERPENDICULARCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_PERPENDICULARCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchLine; +}} + +namespace adsk { namespace fusion { + +/// A perpendicular constraint in a sketch. +class PerpendicularConstraint : public GeometricConstraint { +public: + + /// Returns the first line. + core::Ptr lineOne() const; + + /// Returns the second line. + core::Ptr lineTwo() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_PERPENDICULARCONSTRAINT_API static const char* classType(); + ADSK_FUSION_PERPENDICULARCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_PERPENDICULARCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PERPENDICULARCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchLine* lineOne_raw() const = 0; + virtual SketchLine* lineTwo_raw() const = 0; + virtual PerpendicularConstraint* nativeObject_raw() const = 0; + virtual PerpendicularConstraint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr PerpendicularConstraint::lineOne() const +{ + core::Ptr res = lineOne_raw(); + return res; +} + +inline core::Ptr PerpendicularConstraint::lineTwo() const +{ + core::Ptr res = lineTwo_raw(); + return res; +} + +inline core::Ptr PerpendicularConstraint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr PerpendicularConstraint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PERPENDICULARCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/PolygonConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/PolygonConstraint.h new file mode 100644 index 0000000..b46f46f --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/PolygonConstraint.h @@ -0,0 +1,71 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_POLYGONCONSTRAINT_CPP__ +# define ADSK_FUSION_POLYGONCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_POLYGONCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_POLYGONCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchLine; +}} + +namespace adsk { namespace fusion { + +/// A polygon constraint in a sketch. +class PolygonConstraint : public GeometricConstraint { +public: + + /// Returns the sketch lines that represent the polygon. + std::vector> lines() const; + + ADSK_FUSION_POLYGONCONSTRAINT_API static const char* classType(); + ADSK_FUSION_POLYGONCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_POLYGONCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_POLYGONCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchLine** lines_raw(size_t& return_size) const = 0; +}; + +// Inline wrappers + +inline std::vector> PolygonConstraint::lines() const +{ + std::vector> res; + size_t s; + + SketchLine** p= lines_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_POLYGONCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/Profile.h b/usr/autodesk/CPP/include/Fusion/Sketch/Profile.h new file mode 100644 index 0000000..9a60e8e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/Profile.h @@ -0,0 +1,183 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PROFILE_CPP__ +# define ADSK_FUSION_PROFILE_API XI_EXPORT +# else +# define ADSK_FUSION_PROFILE_API +# endif +#else +# define ADSK_FUSION_PROFILE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class AreaProperties; + class Occurrence; + class ProfileLoops; + class Sketch; +}} +namespace adsk { namespace core { + class BoundingBox3D; + class Plane; +}} + +namespace adsk { namespace fusion { + +/// Represents a profile in a sketch. Profiles are automatically computed by Fusion 360 and +/// represent closed areas within the sketch. +class Profile : public core::Base { +public: + + /// Returns the 3D bounding box of the profile in sketch space. + core::Ptr boundingBox() const; + + /// Returns the plane the profile is defined in. Profiles are always planar and exist within + /// a single plane. + core::Ptr plane() const; + + /// The loops or closed areas within this profile. There is always a single outer loop + /// but there can be zero to many inner loops defining voids in the profile. + core::Ptr profileLoops() const; + + /// Returns the parent sketch of the profile. + core::Ptr parentSketch() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this + /// object in an assembly. This is only valid in the case where this + /// is acting as a proxy in an assembly. Returns null + /// in the case where the object is not in the context of an assembly. + /// but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// Returns null if this isn't the NativeObject. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns the AreaProperties object that has properties for getting the area, perimeter, centroid, etc + /// of this profile. + /// accuracy : Specifies the desired level of computational accuracy of the property calculations. + /// The default value of 'LowCalculationAccuracy' returns results within a +/- 1% error margin. + core::Ptr areaProperties(CalculationAccuracy accuracy = adsk::fusion::LowCalculationAccuracy) const; + + /// Returns a token for the Profile object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same profile. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + ADSK_FUSION_PROFILE_API static const char* classType(); + ADSK_FUSION_PROFILE_API const char* objectType() const override; + ADSK_FUSION_PROFILE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PROFILE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::BoundingBox3D* boundingBox_raw() const = 0; + virtual core::Plane* plane_raw() const = 0; + virtual ProfileLoops* profileLoops_raw() const = 0; + virtual Sketch* parentSketch_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual Profile* nativeObject_raw() const = 0; + virtual Profile* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual AreaProperties* areaProperties_raw(CalculationAccuracy accuracy) const = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr Profile::boundingBox() const +{ + core::Ptr res = boundingBox_raw(); + return res; +} + +inline core::Ptr Profile::plane() const +{ + core::Ptr res = plane_raw(); + return res; +} + +inline core::Ptr Profile::profileLoops() const +{ + core::Ptr res = profileLoops_raw(); + return res; +} + +inline core::Ptr Profile::parentSketch() const +{ + core::Ptr res = parentSketch_raw(); + return res; +} + +inline core::Ptr Profile::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr Profile::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr Profile::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr Profile::areaProperties(CalculationAccuracy accuracy) const +{ + core::Ptr res = areaProperties_raw(accuracy); + return res; +} + +inline std::string Profile::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PROFILE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/ProfileCurve.h b/usr/autodesk/CPP/include/Fusion/Sketch/ProfileCurve.h new file mode 100644 index 0000000..3b7d3e4 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/ProfileCurve.h @@ -0,0 +1,173 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/CoreTypeDefs.h" +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PROFILECURVE_CPP__ +# define ADSK_FUSION_PROFILECURVE_API XI_EXPORT +# else +# define ADSK_FUSION_PROFILECURVE_API +# endif +#else +# define ADSK_FUSION_PROFILECURVE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class Profile; + class ProfileLoop; + class Sketch; + class SketchEntity; +}} +namespace adsk { namespace core { + class BoundingBox3D; + class Curve3D; +}} + +namespace adsk { namespace fusion { + +/// A single curve in a profile. +class ProfileCurve : public core::Base { +public: + + /// Returns the geometric entity of this portion of the profile. + core::Ptr geometry() const; + + /// Return the geometry type that the Geometry property will return. + core::Curve3DTypes geometryType() const; + + /// Returns the associated sketch entity that defines this curve. + core::Ptr sketchEntity() const; + + /// Returns the parent ProfileLoop object. + core::Ptr parentProfileLoop() const; + + /// Returns the parent Profile object. + core::Ptr parentProfile() const; + + /// Returns the parent Profile object. + core::Ptr parentSketch() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this object + /// in an assembly. This is only valid in the case where this is acting + /// as a proxy in an assembly. Returns null in the case where the object + /// is not in the context of an assembly but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// Returns null if this isn't the NativeObject. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns the bounding box of the profile curve in sketch space. + core::Ptr boundingBox() const; + + ADSK_FUSION_PROFILECURVE_API static const char* classType(); + ADSK_FUSION_PROFILECURVE_API const char* objectType() const override; + ADSK_FUSION_PROFILECURVE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PROFILECURVE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Curve3D* geometry_raw() const = 0; + virtual core::Curve3DTypes geometryType_raw() const = 0; + virtual SketchEntity* sketchEntity_raw() const = 0; + virtual ProfileLoop* parentProfileLoop_raw() const = 0; + virtual Profile* parentProfile_raw() const = 0; + virtual Sketch* parentSketch_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual ProfileCurve* nativeObject_raw() const = 0; + virtual ProfileCurve* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual core::BoundingBox3D* boundingBox_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ProfileCurve::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline core::Curve3DTypes ProfileCurve::geometryType() const +{ + core::Curve3DTypes res = geometryType_raw(); + return res; +} + +inline core::Ptr ProfileCurve::sketchEntity() const +{ + core::Ptr res = sketchEntity_raw(); + return res; +} + +inline core::Ptr ProfileCurve::parentProfileLoop() const +{ + core::Ptr res = parentProfileLoop_raw(); + return res; +} + +inline core::Ptr ProfileCurve::parentProfile() const +{ + core::Ptr res = parentProfile_raw(); + return res; +} + +inline core::Ptr ProfileCurve::parentSketch() const +{ + core::Ptr res = parentSketch_raw(); + return res; +} + +inline core::Ptr ProfileCurve::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr ProfileCurve::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr ProfileCurve::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr ProfileCurve::boundingBox() const +{ + core::Ptr res = boundingBox_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PROFILECURVE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/ProfileCurves.h b/usr/autodesk/CPP/include/Fusion/Sketch/ProfileCurves.h new file mode 100644 index 0000000..68ada76 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/ProfileCurves.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PROFILECURVES_CPP__ +# define ADSK_FUSION_PROFILECURVES_API XI_EXPORT +# else +# define ADSK_FUSION_PROFILECURVES_API +# endif +#else +# define ADSK_FUSION_PROFILECURVES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ProfileCurve; +}} + +namespace adsk { namespace fusion { + +/// A collection of profile curves within a profile loop. +class ProfileCurves : public core::Base { +public: + + /// Function that returns the specified profile curve using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of curves in the collection. + size_t count() const; + + typedef ProfileCurve iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_PROFILECURVES_API static const char* classType(); + ADSK_FUSION_PROFILECURVES_API const char* objectType() const override; + ADSK_FUSION_PROFILECURVES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PROFILECURVES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ProfileCurve* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ProfileCurves::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t ProfileCurves::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void ProfileCurves::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PROFILECURVES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/ProfileLoop.h b/usr/autodesk/CPP/include/Fusion/Sketch/ProfileLoop.h new file mode 100644 index 0000000..207484d --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/ProfileLoop.h @@ -0,0 +1,127 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PROFILELOOP_CPP__ +# define ADSK_FUSION_PROFILELOOP_API XI_EXPORT +# else +# define ADSK_FUSION_PROFILELOOP_API +# endif +#else +# define ADSK_FUSION_PROFILELOOP_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class Profile; + class ProfileCurves; +}} + +namespace adsk { namespace fusion { + +/// A loop within a profile. +class ProfileLoop : public core::Base { +public: + + /// Indicates if this is an outer or inner loop. Profiles always have + /// one outer loop and have an zero to many inner loops defining voids. + bool isOuter() const; + + /// Returns a collection of the curves making up this loop. + core::Ptr profileCurves() const; + + /// Returns the parent Profile object. + core::Ptr parentProfile() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this object + /// in an assembly. This is only valid in the case where this is acting + /// as a proxy in an assembly. Returns null in the case where the object + /// is not in the context of an assembly but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// Returns null if this isn't the NativeObject. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_PROFILELOOP_API static const char* classType(); + ADSK_FUSION_PROFILELOOP_API const char* objectType() const override; + ADSK_FUSION_PROFILELOOP_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PROFILELOOP_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool isOuter_raw() const = 0; + virtual ProfileCurves* profileCurves_raw() const = 0; + virtual Profile* parentProfile_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual ProfileLoop* nativeObject_raw() const = 0; + virtual ProfileLoop* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline bool ProfileLoop::isOuter() const +{ + bool res = isOuter_raw(); + return res; +} + +inline core::Ptr ProfileLoop::profileCurves() const +{ + core::Ptr res = profileCurves_raw(); + return res; +} + +inline core::Ptr ProfileLoop::parentProfile() const +{ + core::Ptr res = parentProfile_raw(); + return res; +} + +inline core::Ptr ProfileLoop::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr ProfileLoop::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr ProfileLoop::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PROFILELOOP_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/ProfileLoops.h b/usr/autodesk/CPP/include/Fusion/Sketch/ProfileLoops.h new file mode 100644 index 0000000..22e3bdf --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/ProfileLoops.h @@ -0,0 +1,88 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PROFILELOOPS_CPP__ +# define ADSK_FUSION_PROFILELOOPS_API XI_EXPORT +# else +# define ADSK_FUSION_PROFILELOOPS_API +# endif +#else +# define ADSK_FUSION_PROFILELOOPS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ProfileLoop; +}} + +namespace adsk { namespace fusion { + +/// A collection of loops within a Profile. +class ProfileLoops : public core::Base { +public: + + /// Function that returns the specified profile loop using an index into the collection. + /// index : The index of the item within the collection to return. + /// The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of loops within this profile. + size_t count() const; + + typedef ProfileLoop iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_PROFILELOOPS_API static const char* classType(); + ADSK_FUSION_PROFILELOOPS_API const char* objectType() const override; + ADSK_FUSION_PROFILELOOPS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PROFILELOOPS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual ProfileLoop* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr ProfileLoops::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t ProfileLoops::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void ProfileLoops::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PROFILELOOPS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/Profiles.h b/usr/autodesk/CPP/include/Fusion/Sketch/Profiles.h new file mode 100644 index 0000000..ffd47cb --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/Profiles.h @@ -0,0 +1,91 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_PROFILES_CPP__ +# define ADSK_FUSION_PROFILES_API XI_EXPORT +# else +# define ADSK_FUSION_PROFILES_API +# endif +#else +# define ADSK_FUSION_PROFILES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Profile; +}} + +namespace adsk { namespace fusion { + +/// A collection of all of the closed profiles currently calculated for this sketch. Closed profiles are +/// automatically computed by Fusion 360 and represent closed areas within the sketch. +/// This class also provides some additional utility functions to create open profiles and text based profiles +/// that can be used as input for various features. +class Profiles : public core::Base { +public: + + /// Function that returns the specified closed profile using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the + /// collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of closed profiles in the sketch. Open and text based profiles are not included. + size_t count() const; + + typedef Profile iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_PROFILES_API static const char* classType(); + ADSK_FUSION_PROFILES_API const char* objectType() const override; + ADSK_FUSION_PROFILES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_PROFILES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Profile* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr Profiles::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t Profiles::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void Profiles::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_PROFILES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/RectangularPatternConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/RectangularPatternConstraint.h new file mode 100644 index 0000000..97115f2 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/RectangularPatternConstraint.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_RECTANGULARPATTERNCONSTRAINT_CPP__ +# define ADSK_FUSION_RECTANGULARPATTERNCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_RECTANGULARPATTERNCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_RECTANGULARPATTERNCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// A rectangular pattern constraint in a sketch. +class RectangularPatternConstraint : public GeometricConstraint { +public: + + ADSK_FUSION_RECTANGULARPATTERNCONSTRAINT_API static const char* classType(); + ADSK_FUSION_RECTANGULARPATTERNCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_RECTANGULARPATTERNCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_RECTANGULARPATTERNCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_RECTANGULARPATTERNCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/Sketch.h b/usr/autodesk/CPP/include/Fusion/Sketch/Sketch.h new file mode 100644 index 0000000..7e2720d --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/Sketch.h @@ -0,0 +1,829 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCH_CPP__ +# define ADSK_FUSION_SKETCH_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCH_API +# endif +#else +# define ADSK_FUSION_SKETCH_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class BRepBody; + class BRepFace; + class Component; + class GeometricConstraints; + class Occurrence; + class Profiles; + class SketchCurve; + class SketchCurves; + class SketchDimensions; + class SketchEntity; + class SketchPoint; + class SketchPoints; + class SketchTexts; + class TimelineObject; +}} +namespace adsk { namespace core { + class Attributes; + class BoundingBox3D; + class Matrix3D; + class ObjectCollection; + class Point3D; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// Represents a sketch within a component. +class Sketch : public core::Base { +public: + + /// Gets and sets the name of this sketch as seen in the browser and timeline. + std::string name() const; + bool name(const std::string& value); + + /// Returns the sketch points collection associated with this sketch. + /// This provides access to the existing sketch points and supports + /// the creation of new sketch points. + core::Ptr sketchPoints() const; + + /// Returns the sketch curves collection associated with this sketch. + /// This provides access to the existing sketch curves which is all + /// geometry in the sketch except for sketch points. It is through this + /// collection that new sketch geometry gets created. + core::Ptr sketchCurves() const; + + /// Returns the sketch dimensions collection associated with this sketch. + /// This provides access to the existing sketch dimensions and supports + /// the creation of new sketch dimensions. + core::Ptr sketchDimensions() const; + + /// Returns the sketch constraints collection associated with this sketch. + /// This provides access to the existing sketch constraints and supports + /// the creation of new sketch constraints. + core::Ptr geometricConstraints() const; + + /// Projects the specified entity onto the x-y plane of the sketch + /// and returns the created sketch entity(s). + /// entity : The entity to project. This can be a sketch entity, an edge, a face to get all + /// of its edges, a vertex, a construction axis, a construction point, or a + /// construction plane that is perpendicular to the sketch to create a line. + /// Returns a collection of the sketch entities that were created as a result of the + /// projection. + core::Ptr project(const core::Ptr& entity); + + /// Intersects the specified body with the sketch plane and creates new + /// curves representing the intersection. + /// body : The body to be intersected by the sketch. + /// Returns a collection of the sketch entities that were created a a result of the + /// cut. + core::Ptr projectCutEdges(const core::Ptr& body); + + /// Creates new sketch curves and points that represent the specified entity + /// as sketch geometry. The sketch geometry is not projected but is created + /// in the same location in space as the input geometry. + /// entity : The entity to include into the sketch. This can be a sketch entity from + /// another sketch, edge, face (which results in getting all of its edges, a + /// vertex, construction axis, or construction point. + /// Returns a collection of the sketch entities that were created as a result of the include. + /// When including this curves it will be a single sketch curve, but for faces, multiple + /// sketch curves will be created; one for each edge. + core::Ptr include(const core::Ptr& entity); + + /// Finds the sketch curves that are end connected to the input curve. This can be useful + /// for many cases but is especially useful in gathering the input when creating an offset. + /// curve : The initial sketch curve that will be used to find the connected curves. + /// A collection of the connected curves. They are returned in their connected order with + /// the original input curve being one of the curves. + core::Ptr findConnectedCurves(const core::Ptr& curve); + + /// Creates offset curves for the set of input curves. If the offset distance is not + /// provided, the offset distance is defined by the direction point. + /// curves : A set of end connected curves. The Sketch.FindConnectedCurves method is a convenient way to get + /// this set of curves. + /// directionPoint : Defines which side of the input curves to create the offset on + /// offset : The distance to offset the curves in centimeters. + /// A collection of the new offset sketch curves created + core::Ptr offset(const core::Ptr& curves, const core::Ptr& directionPoint, double offset = 0); + + /// Gets and sets the transform of the sketch with respect to model space. + /// This defines the transform from the parent component space + /// to the sketch space. For example, if you have point coordinates in the space + /// of the parent component and apply this transform it will result in the + /// coordinates of the equivalent position in sketch space. + /// The transform is sensitive to the assembly context. + /// Setting the transform will fail in the case where the sketch is parametric + core::Ptr transform() const; + bool transform(const core::Ptr& value); + + /// A specified point in model space returns the equivalent point in sketch space. + /// This is sensitive to the assembly context. + /// modelCoordinate : A coordinate in model space. + /// Returns the equivalent point in sketch space. + core::Ptr modelToSketchSpace(const core::Ptr& modelCoordinate); + + /// A specified point in sketch space returns the equivalent point in model space. + /// This is sensitive to the assembly context. + /// sketchCoordinate : A coordinate in sketch space. + /// Returns the equivalent point in model space. + core::Ptr sketchToModelSpace(const core::Ptr& sketchCoordinate); + + /// Indicates if this sketch is parametric or not. For parametric sketches, you can also + /// get the construction plane or face it is associative to using the ReferencePlane property. + bool isParametric() const; + + /// Gets if this sketch is currently visible in the graphics window. Use the + /// isLightBulbOn to change if the light bulb beside the sketch node in the + /// browser is on or not. Parent nodes in the browser can have their light + /// bulb off which affects all of their children. This property indicates + /// the final result and whether this body is actually visible or not. + bool isVisible() const; + bool isVisible(bool value); + + /// Indicates if the dimensions of the sketch are displayed when the sketch is not active + /// (in sketch edit mode) + bool areDimensionsShown() const; + bool areDimensionsShown(bool value); + + /// Indicates if the profiles of the sketch are displayed + bool areProfilesShown() const; + bool areProfilesShown(bool value); + + /// Returns the origin point of the sketch in model space. + core::Ptr origin() const; + + /// Returns the X direction of the sketch as defined in model space. + core::Ptr xDirection() const; + + /// Returns the Y direction of the sketch as defined in model space. + core::Ptr yDirection() const; + + /// Gets and sets the construction plane or planar face the sketch is associated + /// to. This is only valid when the IsParametric property is True otherwise this + /// returns null and setting the property will fail. + /// Setting this property is the equivalent of the Redefine command. + core::Ptr referencePlane() const; + bool referencePlane(const core::Ptr& value); + + /// Temporarily turns off the compute of the sketch. This is used to + /// increase the performance as sketch geometry is created. Once the + /// sketch is drawn the this property should be set to false to allow + /// the sketch to recompute. This setting is not saved by the file and is + /// always false when a file is opened. + bool isComputeDeferred() const; + bool isComputeDeferred(bool value); + + /// Moves the specified sketch entities using the specified transform. + /// Transform respects any constraints that would normally prohibit the move. + /// sketchEntities : A collection of sketch entities to transform. + /// transform : The transform that defines the move, rotate or scale. + /// Returns true if the move was successful. + bool move(const core::Ptr& sketchEntities, const core::Ptr& transform); + + /// Copies the specified sketch entities, applying the specified transform. + /// Any geometric or dimension constraints associated with the entities will + /// automatically be copied, if possible. For example, if there is a horizontal + /// dimension and the transform defines a rotation then it will not be included in the + /// result. This same behavior can be seen when performing a copy/paste operation + /// in the user interface. + /// sketchEntities : The collection of sketch entities to copy. They must all exist in this sketch. + /// transform : The transform to apply to the copied entities. + /// targetSketch : Optionally specifies the sketch to copy the entities to. If not provided the entities are copied to this sketch. + /// Returns a collection of the new sketch entities that were created as a result of the copy. + core::Ptr copy(const core::Ptr& sketchEntities, const core::Ptr& transform, const core::Ptr& targetSketch = NULL); + + /// Returns the profiles currently computed for the sketch. + core::Ptr profiles() const; + + /// Deletes the sketch. + /// Returns true if the delete was successful. + bool deleteMe(); + + /// Saves the contents of the sketch to a specified DXF file. + /// fullFilename : The full filename, including the path, of the DXF file. + /// Returns true if the operation was successful. + bool saveAsDXF(const std::string& fullFilename); + + /// Imports the contents of an SVG file into the active sketch. + /// fullFilename : The full filename, including the path, of the SVG file. + /// xPosition : The X offset in centimeters in the sketch for the origin of the SVG data + /// relative to the sketch origin. + /// yPosition : The Y offset in centimeters in the sketch for the origin of the SVG data + /// relative to the sketch origin. + /// scale : The scale value to apply to the imported SVG data. + /// Returns true if the import was successful. + bool importSVG(const std::string& fullFilename, double xPosition, double yPosition, double scale); + + /// Returns the timeline object associated with this sketch. + core::Ptr timelineObject() const; + + /// Returns the parent Component. + core::Ptr parentComponent() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this + /// object in an assembly. This is only valid in the case where this + /// is acting as a proxy in an assembly. Returns null + /// in the case where the object is not in the context of an assembly. + /// but is already the native object. + core::Ptr assemblyContext() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns the 3D bounding box of the sketch + core::Ptr boundingBox() const; + + /// Returns the sketch text collection associated with this sketch. + /// This provides access to existing text and supports the creation + /// of new text. + core::Ptr sketchTexts() const; + + /// Returns the sketch point that was automatically created by projecting the + /// origin construction point into the sketch. + core::Ptr originPoint() const; + + /// Indicates if this sketch is fully constrained. + bool isFullyConstrained() const; + + /// Changes which plane the sketch is based on. + /// planarEntity : A construction plane or planar face that defines the sketch plane + /// Returns true if the operation was successful. + bool redefine(const core::Ptr& planarEntity); + + /// Returns the collection of attributes associated with this face. + core::Ptr attributes() const; + + /// This property returns the base or form feature that this sketch is associated with. It returns + /// null in the case where the sketch is parametrically defined and is not related to a base or form + /// feature. It also returns null in the case where the modeling design history is not being captured (direct edit model). + core::Ptr baseOrFormFeature() const; + + /// Returns the current health state of this sketch. + FeatureHealthStates healthState() const; + + /// Returns the error or warning message in the case where the healthState property returns either + /// WarningFeatureHealthState or ErrorFeatureHealthState. Otherwise this property returns an empty string. + std::string errorOrWarningMessage() const; + + /// Intersects the specified entities (BRepBody, BRepFace, BRepEdge, BRepVertex, SketchCurve, ConstructionPoint, + /// ConstructionAxis, and ConstructionPlane) with the sketch plane and creates sketch geometry that represents + /// the intersection. + /// entities : An array containing the entities to intersect with the sketch plane. + /// An array returning the sketch entities that were created as a result of the + /// intersections. It's possible that this can come back empty in the case where the input + /// entities don't intersect the sketch plane. + std::vector> intersectWithSketchPlane(const std::vector>& entities); + + /// Projects the specified set of curves onto the specified set of faces using the specified method of projection. + /// if the projection type is along a vector, then the directionEntity argument must be supplied. if the projectionType + /// is the closest point method, the directionEntity argument is ignored. + /// faces : An array of BRepFace objects that the curves will be projected onto. + /// curves : An array of various curve objects that will be projected onto the faces. The curves can be sketch curves and points, + /// BRepEdge objects, ConstructionAxis objects, and ConstructionPoint objects. + /// projectType : Specifies which projection type to use which defines the direction of projection. If this is set to AlongVectorSurfaceProjectType + /// the directionEntity argument must be provided. + /// directionEntity : if the projectType argument is AlongVectorSurfaceProjectType, this argument must be specified and defines the + /// direction of projection. It can be a linear BRepEdge, a BRepFace where the normal will be used, a SketchLine, or + /// a ConstructionLine. + /// Returns an array of the sketch entities that were created as a result of projection the specified curves onto + /// the faces. + std::vector> projectToSurface(const std::vector>& faces, const std::vector>& curves, SurfaceProjectTypes projectType, const core::Ptr& directionEntity = core::Ptr()); + + /// Returns the current revision ID of the sketch. This ID changes any time the sketch is modified in any way. By getting + /// and saving the ID when you create any data that is dependent on the sketch, you can then compare the saved + /// ID with the current ID to determine if the sketch has changed to know if you should update your data. + std::string revisionId() const; + + /// Indicates if the constraints of the sketch are displayed when the sketch is active. + bool areConstraintsShown() const; + bool areConstraintsShown(bool value); + + /// Indicates if the sketch points in the sketch are displayed. Points that are not connected to any other + /// geometry will continue to be shown. + bool arePointsShown() const; + bool arePointsShown(bool value); + + /// Gets and set if the light bulb beside the sketch node in the + /// browser is on or not. Parent nodes in the browser can have their light + /// bulb off which affects all of their children so this property does not + /// indicate if the body is actually visible, just that it should be visible + /// if all of it's parent nodes are also visible. Use the isVisible property + /// to determine if it's actually visible. + bool isLightBulbOn() const; + bool isLightBulbOn(bool value); + + /// Returns a token for the Sketch object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same token. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + ADSK_FUSION_SKETCH_API static const char* classType(); + ADSK_FUSION_SKETCH_API const char* objectType() const override; + ADSK_FUSION_SKETCH_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCH_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual SketchPoints* sketchPoints_raw() const = 0; + virtual SketchCurves* sketchCurves_raw() const = 0; + virtual SketchDimensions* sketchDimensions_raw() const = 0; + virtual GeometricConstraints* geometricConstraints_raw() const = 0; + virtual core::ObjectCollection* project_raw(core::Base* entity) = 0; + virtual core::ObjectCollection* projectCutEdges_raw(BRepBody* body) = 0; + virtual core::ObjectCollection* include_raw(core::Base* entity) = 0; + virtual core::ObjectCollection* findConnectedCurves_raw(SketchCurve* curve) = 0; + virtual core::ObjectCollection* offset_raw(core::ObjectCollection* curves, core::Point3D* directionPoint, double offset) = 0; + virtual core::Matrix3D* transform_raw() const = 0; + virtual bool transform_raw(core::Matrix3D* value) = 0; + virtual core::Point3D* modelToSketchSpace_raw(core::Point3D* modelCoordinate) = 0; + virtual core::Point3D* sketchToModelSpace_raw(core::Point3D* sketchCoordinate) = 0; + virtual bool isParametric_raw() const = 0; + virtual bool isVisible_raw() const = 0; + virtual bool isVisible_raw(bool value) = 0; + virtual bool areDimensionsShown_raw() const = 0; + virtual bool areDimensionsShown_raw(bool value) = 0; + virtual bool areProfilesShown_raw() const = 0; + virtual bool areProfilesShown_raw(bool value) = 0; + virtual core::Point3D* origin_raw() const = 0; + virtual core::Vector3D* xDirection_raw() const = 0; + virtual core::Vector3D* yDirection_raw() const = 0; + virtual core::Base* referencePlane_raw() const = 0; + virtual bool referencePlane_raw(core::Base* value) = 0; + virtual bool isComputeDeferred_raw() const = 0; + virtual bool isComputeDeferred_raw(bool value) = 0; + virtual bool move_raw(core::ObjectCollection* sketchEntities, core::Matrix3D* transform) = 0; + virtual core::ObjectCollection* copy_raw(core::ObjectCollection* sketchEntities, core::Matrix3D* transform, Sketch* targetSketch) = 0; + virtual Profiles* profiles_raw() const = 0; + virtual bool deleteMe_raw() = 0; + virtual bool saveAsDXF_raw(const char * fullFilename) = 0; + virtual bool importSVG_raw(const char * fullFilename, double xPosition, double yPosition, double scale) = 0; + virtual TimelineObject* timelineObject_raw() const = 0; + virtual Component* parentComponent_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual Sketch* nativeObject_raw() const = 0; + virtual Sketch* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual core::BoundingBox3D* boundingBox_raw() const = 0; + virtual SketchTexts* sketchTexts_raw() const = 0; + virtual SketchPoint* originPoint_raw() const = 0; + virtual bool isFullyConstrained_raw() const = 0; + virtual bool redefine_raw(core::Base* planarEntity) = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual core::Base* baseOrFormFeature_raw() const = 0; + virtual FeatureHealthStates healthState_raw() const = 0; + virtual char* errorOrWarningMessage_raw() const = 0; + virtual SketchEntity** intersectWithSketchPlane_raw(core::Base** entities, size_t entities_size, size_t& return_size) = 0; + virtual SketchEntity** projectToSurface_raw(BRepFace** faces, size_t faces_size, core::Base** curves, size_t curves_size, SurfaceProjectTypes projectType, core::Base* directionEntity, size_t& return_size) = 0; + virtual char* revisionId_raw() const = 0; + virtual bool areConstraintsShown_raw() const = 0; + virtual bool areConstraintsShown_raw(bool value) = 0; + virtual bool arePointsShown_raw() const = 0; + virtual bool arePointsShown_raw(bool value) = 0; + virtual bool isLightBulbOn_raw() const = 0; + virtual bool isLightBulbOn_raw(bool value) = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline std::string Sketch::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool Sketch::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline core::Ptr Sketch::sketchPoints() const +{ + core::Ptr res = sketchPoints_raw(); + return res; +} + +inline core::Ptr Sketch::sketchCurves() const +{ + core::Ptr res = sketchCurves_raw(); + return res; +} + +inline core::Ptr Sketch::sketchDimensions() const +{ + core::Ptr res = sketchDimensions_raw(); + return res; +} + +inline core::Ptr Sketch::geometricConstraints() const +{ + core::Ptr res = geometricConstraints_raw(); + return res; +} + +inline core::Ptr Sketch::project(const core::Ptr& entity) +{ + core::Ptr res = project_raw(entity.get()); + return res; +} + +inline core::Ptr Sketch::projectCutEdges(const core::Ptr& body) +{ + core::Ptr res = projectCutEdges_raw(body.get()); + return res; +} + +inline core::Ptr Sketch::include(const core::Ptr& entity) +{ + core::Ptr res = include_raw(entity.get()); + return res; +} + +inline core::Ptr Sketch::findConnectedCurves(const core::Ptr& curve) +{ + core::Ptr res = findConnectedCurves_raw(curve.get()); + return res; +} + +inline core::Ptr Sketch::offset(const core::Ptr& curves, const core::Ptr& directionPoint, double offset) +{ + core::Ptr res = offset_raw(curves.get(), directionPoint.get(), offset); + return res; +} + +inline core::Ptr Sketch::transform() const +{ + core::Ptr res = transform_raw(); + return res; +} + +inline bool Sketch::transform(const core::Ptr& value) +{ + return transform_raw(value.get()); +} + +inline core::Ptr Sketch::modelToSketchSpace(const core::Ptr& modelCoordinate) +{ + core::Ptr res = modelToSketchSpace_raw(modelCoordinate.get()); + return res; +} + +inline core::Ptr Sketch::sketchToModelSpace(const core::Ptr& sketchCoordinate) +{ + core::Ptr res = sketchToModelSpace_raw(sketchCoordinate.get()); + return res; +} + +inline bool Sketch::isParametric() const +{ + bool res = isParametric_raw(); + return res; +} + +inline bool Sketch::isVisible() const +{ + bool res = isVisible_raw(); + return res; +} + +inline bool Sketch::isVisible(bool value) +{ + return isVisible_raw(value); +} + +inline bool Sketch::areDimensionsShown() const +{ + bool res = areDimensionsShown_raw(); + return res; +} + +inline bool Sketch::areDimensionsShown(bool value) +{ + return areDimensionsShown_raw(value); +} + +inline bool Sketch::areProfilesShown() const +{ + bool res = areProfilesShown_raw(); + return res; +} + +inline bool Sketch::areProfilesShown(bool value) +{ + return areProfilesShown_raw(value); +} + +inline core::Ptr Sketch::origin() const +{ + core::Ptr res = origin_raw(); + return res; +} + +inline core::Ptr Sketch::xDirection() const +{ + core::Ptr res = xDirection_raw(); + return res; +} + +inline core::Ptr Sketch::yDirection() const +{ + core::Ptr res = yDirection_raw(); + return res; +} + +inline core::Ptr Sketch::referencePlane() const +{ + core::Ptr res = referencePlane_raw(); + return res; +} + +inline bool Sketch::referencePlane(const core::Ptr& value) +{ + return referencePlane_raw(value.get()); +} + +inline bool Sketch::isComputeDeferred() const +{ + bool res = isComputeDeferred_raw(); + return res; +} + +inline bool Sketch::isComputeDeferred(bool value) +{ + return isComputeDeferred_raw(value); +} + +inline bool Sketch::move(const core::Ptr& sketchEntities, const core::Ptr& transform) +{ + bool res = move_raw(sketchEntities.get(), transform.get()); + return res; +} + +inline core::Ptr Sketch::copy(const core::Ptr& sketchEntities, const core::Ptr& transform, const core::Ptr& targetSketch) +{ + core::Ptr res = copy_raw(sketchEntities.get(), transform.get(), targetSketch.get()); + return res; +} + +inline core::Ptr Sketch::profiles() const +{ + core::Ptr res = profiles_raw(); + return res; +} + +inline bool Sketch::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline bool Sketch::saveAsDXF(const std::string& fullFilename) +{ + bool res = saveAsDXF_raw(fullFilename.c_str()); + return res; +} + +inline bool Sketch::importSVG(const std::string& fullFilename, double xPosition, double yPosition, double scale) +{ + bool res = importSVG_raw(fullFilename.c_str(), xPosition, yPosition, scale); + return res; +} + +inline core::Ptr Sketch::timelineObject() const +{ + core::Ptr res = timelineObject_raw(); + return res; +} + +inline core::Ptr Sketch::parentComponent() const +{ + core::Ptr res = parentComponent_raw(); + return res; +} + +inline core::Ptr Sketch::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline core::Ptr Sketch::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr Sketch::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr Sketch::boundingBox() const +{ + core::Ptr res = boundingBox_raw(); + return res; +} + +inline core::Ptr Sketch::sketchTexts() const +{ + core::Ptr res = sketchTexts_raw(); + return res; +} + +inline core::Ptr Sketch::originPoint() const +{ + core::Ptr res = originPoint_raw(); + return res; +} + +inline bool Sketch::isFullyConstrained() const +{ + bool res = isFullyConstrained_raw(); + return res; +} + +inline bool Sketch::redefine(const core::Ptr& planarEntity) +{ + bool res = redefine_raw(planarEntity.get()); + return res; +} + +inline core::Ptr Sketch::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline core::Ptr Sketch::baseOrFormFeature() const +{ + core::Ptr res = baseOrFormFeature_raw(); + return res; +} + +inline FeatureHealthStates Sketch::healthState() const +{ + FeatureHealthStates res = healthState_raw(); + return res; +} + +inline std::string Sketch::errorOrWarningMessage() const +{ + std::string res; + + char* p= errorOrWarningMessage_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> Sketch::intersectWithSketchPlane(const std::vector>& entities) +{ + std::vector> res; + size_t s; + core::Base** entities_ = new core::Base*[entities.size()]; + for(size_t i=0; i> Sketch::projectToSurface(const std::vector>& faces, const std::vector>& curves, SurfaceProjectTypes projectType, const core::Ptr& directionEntity) +{ + std::vector> res; + size_t s; + BRepFace** faces_ = new BRepFace*[faces.size()]; + for(size_t i=0; i lineOne() const; + + /// The second line being constrained. + core::Ptr lineTwo() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SKETCHANGULARDIMENSION_API static const char* classType(); + ADSK_FUSION_SKETCHANGULARDIMENSION_API const char* objectType() const override; + ADSK_FUSION_SKETCHANGULARDIMENSION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHANGULARDIMENSION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchLine* lineOne_raw() const = 0; + virtual SketchLine* lineTwo_raw() const = 0; + virtual SketchAngularDimension* nativeObject_raw() const = 0; + virtual SketchAngularDimension* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchAngularDimension::lineOne() const +{ + core::Ptr res = lineOne_raw(); + return res; +} + +inline core::Ptr SketchAngularDimension::lineTwo() const +{ + core::Ptr res = lineTwo_raw(); + return res; +} + +inline core::Ptr SketchAngularDimension::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchAngularDimension::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHANGULARDIMENSION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchArc.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchArc.h new file mode 100644 index 0000000..ac715a0 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchArc.h @@ -0,0 +1,159 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchCurve.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHARC_CPP__ +# define ADSK_FUSION_SKETCHARC_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHARC_API +# endif +#else +# define ADSK_FUSION_SKETCHARC_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchPoint; +}} +namespace adsk { namespace core { + class Arc3D; +}} + +namespace adsk { namespace fusion { + +/// An arc in a sketch. +class SketchArc : public SketchCurve { +public: + + /// The sketch point at the center of the arc. The arc is dependent on this point and moving the + /// point will cause the arc to adjust. + core::Ptr centerSketchPoint() const; + + /// The sketch point at the start of the arc. The arc is dependent on this point and moving the + /// point will cause the arc to adjust. + core::Ptr startSketchPoint() const; + + /// The sketch point at the end of the arc. The arc is dependent on this point and moving the + /// point will cause the arc to adjust. + core::Ptr endSketchPoint() const; + + /// Gets and sets the radius of the arc. Changing the radius is limited + /// by any constraints that might exist on the circle. Setting the radius + /// can fail in cases where the radius is fully defined through constraints. + double radius() const; + bool radius(double value); + + /// Returns the transient geometry of the arc which provides geometric + /// information about the arc. The returned geometry is always in sketch space. + core::Ptr geometry() const; + + /// Returns an Arc3D object which provides geometric information in world space. + /// The returned geometry takes into account the assembly context and the position of the + /// sketch in it's parent component, which means the geometry will be returned in the root + /// component space. + core::Ptr worldGeometry() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SKETCHARC_API static const char* classType(); + ADSK_FUSION_SKETCHARC_API const char* objectType() const override; + ADSK_FUSION_SKETCHARC_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHARC_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchPoint* centerSketchPoint_raw() const = 0; + virtual SketchPoint* startSketchPoint_raw() const = 0; + virtual SketchPoint* endSketchPoint_raw() const = 0; + virtual double radius_raw() const = 0; + virtual bool radius_raw(double value) = 0; + virtual core::Arc3D* geometry_raw() const = 0; + virtual core::Arc3D* worldGeometry_raw() const = 0; + virtual SketchArc* nativeObject_raw() const = 0; + virtual SketchArc* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchArc::centerSketchPoint() const +{ + core::Ptr res = centerSketchPoint_raw(); + return res; +} + +inline core::Ptr SketchArc::startSketchPoint() const +{ + core::Ptr res = startSketchPoint_raw(); + return res; +} + +inline core::Ptr SketchArc::endSketchPoint() const +{ + core::Ptr res = endSketchPoint_raw(); + return res; +} + +inline double SketchArc::radius() const +{ + double res = radius_raw(); + return res; +} + +inline bool SketchArc::radius(double value) +{ + return radius_raw(value); +} + +inline core::Ptr SketchArc::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline core::Ptr SketchArc::worldGeometry() const +{ + core::Ptr res = worldGeometry_raw(); + return res; +} + +inline core::Ptr SketchArc::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchArc::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHARC_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchArcs.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchArcs.h new file mode 100644 index 0000000..b3df685 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchArcs.h @@ -0,0 +1,140 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHARCS_CPP__ +# define ADSK_FUSION_SKETCHARCS_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHARCS_API +# endif +#else +# define ADSK_FUSION_SKETCHARCS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchArc; + class SketchCurve; +}} +namespace adsk { namespace core { + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// The collection of arcs in a sketch. This provides access to the existing +/// arcs and supports the methods to create new arcs. +class SketchArcs : public core::Base { +public: + + /// Function that returns the specified sketch arc using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of arcs in the sketch. + size_t count() const; + + /// Creates a sketch arc that is always parallel to the x-y plane of the sketch + /// and is centered at the specified point. + /// centerPoint : The center point of the arc. This can be either an existing SketchPoint or a Point3D object. + /// startPoint : The start point of the arc. The distance between this point and the center defines the radius + /// of the arc. This can be either an existing SketchPoint or a Point3D object. + /// sweepAngle : The sweep of the arc. This is defined in radians and a positive value defines a counter-clockwise sweep. + /// Returns the newly created SketchArc object or null if the creation failed. + core::Ptr addByCenterStartSweep(const core::Ptr& centerPoint, const core::Ptr& startPoint, double sweepAngle); + + /// Creates a sketch arc that passes through the three points. + /// startPoint : The start point of the arc. This can be either an existing SketchPoint or a Point3D object. + /// point : A point along the arc. This is a Point3D object. + /// endPoint : The end point of the arc. This can be either an existing SketchPoint or a Point3D object. + /// Returns the newly created SketchArc or null in the case of a failure. + core::Ptr addByThreePoints(const core::Ptr& startPoint, const core::Ptr& point, const core::Ptr& endPoint); + + /// Creates a fillet between two sketch entities + /// The side (quadrant) the fillet is created on is determined by the points specified. + /// The point for each entity can be its startSketchPoint or endSketchPoint + /// firstEntity : The first curve for the fillet definition. The curve must be open. + /// firstEntityPoint : A point on or closer to one end of the first curve that indicates the side to create the fillet on + /// secondEnitity : The second curve for the fillet definition. The curve must be open. + /// secondEntityPoint : A point on or closer to one end of the second curve that indicates the side to create the fillet on + /// radius : radius of the arc in centimeters + /// Returns the newly created SketchArc object (fillet) if the operation was successful or null if it failed. + core::Ptr addFillet(const core::Ptr& firstEntity, const core::Ptr& firstEntityPoint, const core::Ptr& secondEnitity, const core::Ptr& secondEntityPoint, double radius); + + typedef SketchArc iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHARCS_API static const char* classType(); + ADSK_FUSION_SKETCHARCS_API const char* objectType() const override; + ADSK_FUSION_SKETCHARCS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHARCS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchArc* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual SketchArc* addByCenterStartSweep_raw(core::Base* centerPoint, core::Base* startPoint, double sweepAngle) = 0; + virtual SketchArc* addByThreePoints_raw(core::Base* startPoint, core::Point3D* point, core::Base* endPoint) = 0; + virtual SketchArc* addFillet_raw(SketchCurve* firstEntity, core::Point3D* firstEntityPoint, SketchCurve* secondEnitity, core::Point3D* secondEntityPoint, double radius) = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchArcs::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SketchArcs::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr SketchArcs::addByCenterStartSweep(const core::Ptr& centerPoint, const core::Ptr& startPoint, double sweepAngle) +{ + core::Ptr res = addByCenterStartSweep_raw(centerPoint.get(), startPoint.get(), sweepAngle); + return res; +} + +inline core::Ptr SketchArcs::addByThreePoints(const core::Ptr& startPoint, const core::Ptr& point, const core::Ptr& endPoint) +{ + core::Ptr res = addByThreePoints_raw(startPoint.get(), point.get(), endPoint.get()); + return res; +} + +inline core::Ptr SketchArcs::addFillet(const core::Ptr& firstEntity, const core::Ptr& firstEntityPoint, const core::Ptr& secondEnitity, const core::Ptr& secondEntityPoint, double radius) +{ + core::Ptr res = addFillet_raw(firstEntity.get(), firstEntityPoint.get(), secondEnitity.get(), secondEntityPoint.get(), radius); + return res; +} + +template inline void SketchArcs::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHARCS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchCircle.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchCircle.h new file mode 100644 index 0000000..953b175 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchCircle.h @@ -0,0 +1,145 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchCurve.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHCIRCLE_CPP__ +# define ADSK_FUSION_SKETCHCIRCLE_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHCIRCLE_API +# endif +#else +# define ADSK_FUSION_SKETCHCIRCLE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchPoint; +}} +namespace adsk { namespace core { + class Circle3D; +}} + +namespace adsk { namespace fusion { + +/// A circle in a sketch. +class SketchCircle : public SketchCurve { +public: + + /// Returns the sketch point at the center of the circle. + core::Ptr centerSketchPoint() const; + + /// Returns the transient geometry of the circle which provides geometric + /// information about the circle. The returned geometry is always in sketch space. + core::Ptr geometry() const; + + /// Returns a Point3D object which provides the position of the sketch point in world space. + /// The returned coordinate takes into account the assembly context and the position of the + /// sketch in it's parent component, which means the coordinate will be returned in the root + /// component space. + core::Ptr worldGeometry() const; + + /// Returns the area of the circle in square centimeters. + double area() const; + + /// Gets and sets the radius of the circle. Changing the radius is limited + /// by any constraints that might exist on the circle. + double radius() const; + bool radius(double value); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SKETCHCIRCLE_API static const char* classType(); + ADSK_FUSION_SKETCHCIRCLE_API const char* objectType() const override; + ADSK_FUSION_SKETCHCIRCLE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHCIRCLE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchPoint* centerSketchPoint_raw() const = 0; + virtual core::Circle3D* geometry_raw() const = 0; + virtual core::Circle3D* worldGeometry_raw() const = 0; + virtual double area_raw() const = 0; + virtual double radius_raw() const = 0; + virtual bool radius_raw(double value) = 0; + virtual SketchCircle* nativeObject_raw() const = 0; + virtual SketchCircle* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchCircle::centerSketchPoint() const +{ + core::Ptr res = centerSketchPoint_raw(); + return res; +} + +inline core::Ptr SketchCircle::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline core::Ptr SketchCircle::worldGeometry() const +{ + core::Ptr res = worldGeometry_raw(); + return res; +} + +inline double SketchCircle::area() const +{ + double res = area_raw(); + return res; +} + +inline double SketchCircle::radius() const +{ + double res = radius_raw(); + return res; +} + +inline bool SketchCircle::radius(double value) +{ + return radius_raw(value); +} + +inline core::Ptr SketchCircle::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchCircle::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHCIRCLE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchCircles.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchCircles.h new file mode 100644 index 0000000..89741ce --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchCircles.h @@ -0,0 +1,185 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHCIRCLES_CPP__ +# define ADSK_FUSION_SKETCHCIRCLES_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHCIRCLES_API +# endif +#else +# define ADSK_FUSION_SKETCHCIRCLES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchCircle; + class SketchLine; +}} +namespace adsk { namespace core { + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// The collection of circles in a sketch. This provides access to the existing +/// circles and supports the methods to create new circles. +class SketchCircles : public core::Base { +public: + + /// Function that returns the specified sketch circle using an index into the collection. + /// index : The index of the item within the collection to return. + /// The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of circles in the sketch. + size_t count() const; + + /// Creates a sketch circle that is always parallel to the x-y plane of the sketch + /// and is centered at the specified point. + /// centerPoint : The center point of the circle. It can be an existing SketchPoint or a Point3D object. + /// radius : The radius of the circle in centimeters. + /// Returns the newly created SketchCircle object or null if the creation failed. + core::Ptr addByCenterRadius(const core::Ptr& centerPoint, double radius); + + /// Creates a sketch circle where the circle passes through the two points and the + /// distance between the two points is the diameter of the circle. + /// pointOne : A Point3D object that defines a point is sketch space and lies on the x-y plane of the sketch. + /// pointTwo : A Point3D object that defines a point is sketch space and lies on the x-y plane of the sketch. + /// Returns the newly created SketchCircle object or null if the creation failed. + core::Ptr addByTwoPoints(const core::Ptr& pointOne, const core::Ptr& pointTwo); + + /// Creates a sketch circle that passes through the three points. The three points must + /// lie on the x-y plane of the sketch. + /// pointOne : The first point that the circle will pass through. The z component must be zero. + /// pointTwo : The second point that the circle will pass through. The z component must be zero. + /// pointThree : The third point that the circle will pass through. The z component must be zero. + /// Returns the newly created SketchCircle object or null if the creation failed. + core::Ptr addByThreePoints(const core::Ptr& pointOne, const core::Ptr& pointTwo, const core::Ptr& pointThree); + + /// Creates a sketch circle that is tangent to the two input lines. + /// The two lines must lie on the x-y plane of the sketch. + /// tangentOne : The first line that the circle will be tangent to. + /// The line must lie on the x-y plane of the sketch. + /// tangentTwo : The second line that the circle will be tangent to. + /// The line must lie on the x-y plane of the sketch and cannot + /// be parallel to the first line. + /// radius : The radius of the circle in centimeters. + /// hintPoint : A point that specifies which of the possible four solutions to use + /// when creating the circle. If you consider the two input lines to be infinite + /// they create four quadrants which results in four possible solutions for the + /// creation of the circle. The hint point is a point anywhere within the quadrant + /// where you want the circle created. + /// Returns the newly created SketchCircle object or null if the creation failed. + core::Ptr addByTwoTangents(const core::Ptr& tangentOne, const core::Ptr& tangentTwo, double radius, const core::Ptr& hintPoint); + + /// Creates a sketch circle that is tangent to the three input lines. + /// The three lines must lie on the x-y plane of the sketch. + /// tangentOne : The first line that the circle will be tangent to. + /// The line must lie on the x-y plane of the sketch and cannot be parallel + /// to the second or third line. + /// tangentTwo : The second line that the circle will be tangent to. + /// The line must lie on the x-y plane of the sketch and cannot be parallel + /// to the first or third line. + /// tangentThree : The third line that the circle will be tangent to. + /// The line must lie on the x-y plane of the sketch and cannot be parallel + /// to the first or second line. + /// hintPoint : A point that specifies which of the possible multiple solutions to use + /// when creating the circle. If you consider the three input lines to be infinite + /// there are many possible solutions when creating a circle that is tangent to all + /// three lines. The hint point is a point anywhere within the area defined by the + /// three lines where the circle is to be created. + /// Returns the newly created SketchCircle object or null if the creation failed. + core::Ptr addByThreeTangents(const core::Ptr& tangentOne, const core::Ptr& tangentTwo, const core::Ptr& tangentThree, const core::Ptr& hintPoint); + + typedef SketchCircle iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHCIRCLES_API static const char* classType(); + ADSK_FUSION_SKETCHCIRCLES_API const char* objectType() const override; + ADSK_FUSION_SKETCHCIRCLES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHCIRCLES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchCircle* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual SketchCircle* addByCenterRadius_raw(core::Base* centerPoint, double radius) = 0; + virtual SketchCircle* addByTwoPoints_raw(core::Point3D* pointOne, core::Point3D* pointTwo) = 0; + virtual SketchCircle* addByThreePoints_raw(core::Point3D* pointOne, core::Point3D* pointTwo, core::Point3D* pointThree) = 0; + virtual SketchCircle* addByTwoTangents_raw(SketchLine* tangentOne, SketchLine* tangentTwo, double radius, core::Point3D* hintPoint) = 0; + virtual SketchCircle* addByThreeTangents_raw(SketchLine* tangentOne, SketchLine* tangentTwo, SketchLine* tangentThree, core::Point3D* hintPoint) = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchCircles::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SketchCircles::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr SketchCircles::addByCenterRadius(const core::Ptr& centerPoint, double radius) +{ + core::Ptr res = addByCenterRadius_raw(centerPoint.get(), radius); + return res; +} + +inline core::Ptr SketchCircles::addByTwoPoints(const core::Ptr& pointOne, const core::Ptr& pointTwo) +{ + core::Ptr res = addByTwoPoints_raw(pointOne.get(), pointTwo.get()); + return res; +} + +inline core::Ptr SketchCircles::addByThreePoints(const core::Ptr& pointOne, const core::Ptr& pointTwo, const core::Ptr& pointThree) +{ + core::Ptr res = addByThreePoints_raw(pointOne.get(), pointTwo.get(), pointThree.get()); + return res; +} + +inline core::Ptr SketchCircles::addByTwoTangents(const core::Ptr& tangentOne, const core::Ptr& tangentTwo, double radius, const core::Ptr& hintPoint) +{ + core::Ptr res = addByTwoTangents_raw(tangentOne.get(), tangentTwo.get(), radius, hintPoint.get()); + return res; +} + +inline core::Ptr SketchCircles::addByThreeTangents(const core::Ptr& tangentOne, const core::Ptr& tangentTwo, const core::Ptr& tangentThree, const core::Ptr& hintPoint) +{ + core::Ptr res = addByThreeTangents_raw(tangentOne.get(), tangentTwo.get(), tangentThree.get(), hintPoint.get()); + return res; +} + +template inline void SketchCircles::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHCIRCLES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchConcentricCircleDimension.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchConcentricCircleDimension.h new file mode 100644 index 0000000..2e14e52 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchConcentricCircleDimension.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchDimension.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHCONCENTRICCIRCLEDIMENSION_CPP__ +# define ADSK_FUSION_SKETCHCONCENTRICCIRCLEDIMENSION_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHCONCENTRICCIRCLEDIMENSION_API +# endif +#else +# define ADSK_FUSION_SKETCHCONCENTRICCIRCLEDIMENSION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchCurve; +}} + +namespace adsk { namespace fusion { + +/// A concentric circle dimension in a sketch. +class SketchConcentricCircleDimension : public SketchDimension { +public: + + /// Returns the first concentric circle or arc. + core::Ptr circleOne() const; + + /// Returns the second concentric circle or arc. + core::Ptr circleTwo() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SKETCHCONCENTRICCIRCLEDIMENSION_API static const char* classType(); + ADSK_FUSION_SKETCHCONCENTRICCIRCLEDIMENSION_API const char* objectType() const override; + ADSK_FUSION_SKETCHCONCENTRICCIRCLEDIMENSION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHCONCENTRICCIRCLEDIMENSION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchCurve* circleOne_raw() const = 0; + virtual SketchCurve* circleTwo_raw() const = 0; + virtual SketchConcentricCircleDimension* nativeObject_raw() const = 0; + virtual SketchConcentricCircleDimension* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchConcentricCircleDimension::circleOne() const +{ + core::Ptr res = circleOne_raw(); + return res; +} + +inline core::Ptr SketchConcentricCircleDimension::circleTwo() const +{ + core::Ptr res = circleTwo_raw(); + return res; +} + +inline core::Ptr SketchConcentricCircleDimension::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchConcentricCircleDimension::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHCONCENTRICCIRCLEDIMENSION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchConicCurve.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchConicCurve.h new file mode 100644 index 0000000..ad66dfc --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchConicCurve.h @@ -0,0 +1,153 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchCurve.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHCONICCURVE_CPP__ +# define ADSK_FUSION_SKETCHCONICCURVE_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHCONICCURVE_API +# endif +#else +# define ADSK_FUSION_SKETCHCONICCURVE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchPoint; +}} +namespace adsk { namespace core { + class CurveEvaluator3D; + class NurbsCurve3D; +}} + +namespace adsk { namespace fusion { + +/// The SketchConicCurve class represents conic curves in a sketch. +class SketchConicCurve : public SketchCurve { +public: + + /// The sketch point at the start of the curve. + core::Ptr startSketchPoint() const; + + /// The sketch point at the end of the curve. + core::Ptr endSketchPoint() const; + + /// The sketch point at the apex of the conic curve. + core::Ptr apexSketchPoint() const; + + /// Returns the transient geometry of the curve which provides geometric + /// information about the curve. The returned geometry is always in sketch space. + /// Because the fixed spline can be analytically defined, for example it + /// can be the precise intersection of a surface and the sketch plane, + /// returning a NURBS curve that represents the spline may be an + /// approximation of the actual curve. You can use the Evaluator + /// property of the SketchFixedSpline object to perform evaluations + /// on the precise curve. + core::Ptr geometry() const; + + /// Returns a NurbsCurve3D object that is the equivalent of this sketch curve + /// but is in the space of the parent component rather than in sketch space. + core::Ptr worldGeometry() const; + + /// Returns an evaluator object that lets you perform evaluations + /// on the precise geometry of the curve. + core::Ptr evaluator() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SKETCHCONICCURVE_API static const char* classType(); + ADSK_FUSION_SKETCHCONICCURVE_API const char* objectType() const override; + ADSK_FUSION_SKETCHCONICCURVE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHCONICCURVE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchPoint* startSketchPoint_raw() const = 0; + virtual SketchPoint* endSketchPoint_raw() const = 0; + virtual SketchPoint* apexSketchPoint_raw() const = 0; + virtual core::NurbsCurve3D* geometry_raw() const = 0; + virtual core::NurbsCurve3D* worldGeometry_raw() const = 0; + virtual core::CurveEvaluator3D* evaluator_raw() const = 0; + virtual SketchConicCurve* nativeObject_raw() const = 0; + virtual SketchConicCurve* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchConicCurve::startSketchPoint() const +{ + core::Ptr res = startSketchPoint_raw(); + return res; +} + +inline core::Ptr SketchConicCurve::endSketchPoint() const +{ + core::Ptr res = endSketchPoint_raw(); + return res; +} + +inline core::Ptr SketchConicCurve::apexSketchPoint() const +{ + core::Ptr res = apexSketchPoint_raw(); + return res; +} + +inline core::Ptr SketchConicCurve::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline core::Ptr SketchConicCurve::worldGeometry() const +{ + core::Ptr res = worldGeometry_raw(); + return res; +} + +inline core::Ptr SketchConicCurve::evaluator() const +{ + core::Ptr res = evaluator_raw(); + return res; +} + +inline core::Ptr SketchConicCurve::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchConicCurve::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHCONICCURVE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchConicCurves.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchConicCurves.h new file mode 100644 index 0000000..393ef1f --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchConicCurves.h @@ -0,0 +1,88 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHCONICCURVES_CPP__ +# define ADSK_FUSION_SKETCHCONICCURVES_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHCONICCURVES_API +# endif +#else +# define ADSK_FUSION_SKETCHCONICCURVES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchConicCurve; +}} + +namespace adsk { namespace fusion { + +/// The collection of conic curves in a sketch. This provides access to the existing +/// conic curves and supports the method to create new conic curves. +class SketchConicCurves : public core::Base { +public: + + /// Function that returns the specified conic curve using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of conic curves in the sketch. + size_t count() const; + + typedef SketchConicCurve iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHCONICCURVES_API static const char* classType(); + ADSK_FUSION_SKETCHCONICCURVES_API const char* objectType() const override; + ADSK_FUSION_SKETCHCONICCURVES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHCONICCURVES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchConicCurve* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchConicCurves::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SketchConicCurves::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void SketchConicCurves::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHCONICCURVES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchCurve.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchCurve.h new file mode 100644 index 0000000..9183847 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchCurve.h @@ -0,0 +1,191 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchEntity.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHCURVE_CPP__ +# define ADSK_FUSION_SKETCHCURVE_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHCURVE_API +# endif +#else +# define ADSK_FUSION_SKETCHCURVE_API XI_IMPORT +#endif + +namespace adsk { namespace core { + class ObjectCollection; + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// A single sketch curve. This is the base class for the specific curve types. +class SketchCurve : public SketchEntity { +public: + + /// Returns the length of the curve in centimeters. + double length() const; + + /// Gets and sets whether this curve is construction geometry. + bool isConstruction() const; + bool isConstruction(bool value); + + /// Split a curve at a position specified along the curve + /// splitPoint : A position (transient Point3D) on the curve that defines the point at which to split the curve + /// createConstraints : Constraints are created by default. Specify false to create no constraints. + /// Returns the resulting 2 curves; the original curve + the newly created curve + /// When split spline the original is deleted and two new curves returned. + /// Empty collection returned if curve is closed. + core::Ptr split(const core::Ptr& splitPoint, bool createConstraints = true); + + /// Trim a curve by specifying a point that determines the segment of the curve to trim away + /// segmentPoint : A point (transient Point3D) on or closest to the segment of the curve to remove. (start, end or middle) + /// The segment of the curve closest to the segmentPoint gets removed + /// createConstraints : Constraints are created by default. Specify false to not create constraints. + /// When trimming the start or end side of a line, unclosed circular or elliptical arc, the original entity is modified and returned + /// When trimming the middle of a line, unclosed circular or elliptical arc the original entity is deleted and two new entities are returned + /// When trimming the start or end of any type of closed curve, the original is deleted and a new curve is returned + /// Any trimming of a spline (open or closed) deletes the original and new spline/s are returned + /// Trimming a curve having no intersections deletes the original and returns an empty collection + core::Ptr trim(const core::Ptr& segmentPoint, bool createConstraints = true); + + /// Breaks a curve into two or three pieces by finding intersections of this curve with all other curves in the + /// sketch and splitting this curve at the nearest intersections to a specified point on the curve. + /// segmentPoint : A point that specifies the segment of the curve that is to be split from the rest of the curve. The nearest + /// intersection(s) to this point define the break location(s). + /// createConstraints : Optional argument that specifies if constraints should be created between the new curve segments. A value of + /// true indicates constraints will be created. + /// All of the curves resulting from the break are returned in an ObjectCollection. In the case where no intersections + /// are found and as a result the curve is not broken, an empty ObjectCollection is returned. + core::Ptr breakCurve(const core::Ptr& segmentPoint, bool createConstraints = true); + + /// Extend a curve by specifying a point that determines the end of the curve to extend + /// endPoint : A point (transient Point3D) on or closest to the end of the curve to extend. (start or end) + /// The end of the curve closest to the endPoint gets extended + /// createConstraints : Constraints are created by default. Specify false to not create constraints. + /// Returns the modified original curve if the start or end of the curve is extended + /// If the extend joins a curve to another, the two original curves are deleted and a new curve is returned + /// If an arc is extended so as to become a circle, the original arc is deleted and a new circle is returned + core::Ptr extend(const core::Ptr& endPoint, bool createConstraints = true); + + /// Get the curves that intersect this curve along with the intersection points (Point3D) + /// sketchCurves : A collection of curves to attempt to find intersections with. + /// Set the value of this parameter to null to use all curves in the sketch for the calculation. + /// intersectingCurves : A collection of the actual intersecting curves + /// intersectionPoints : A collection of intersection points (Point3D) + /// Item numbers in this collection correspond to the item numbers in the intersectingCurves collection. + /// Returns true if the method was successful. It can be successful regardless of whether intersections were found or not. + bool intersections(const core::Ptr& sketchCurves, core::Ptr& intersectingCurves, core::Ptr& intersectionPoints); + + ADSK_FUSION_SKETCHCURVE_API static const char* classType(); + ADSK_FUSION_SKETCHCURVE_API const char* objectType() const override; + ADSK_FUSION_SKETCHCURVE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHCURVE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual double length_raw() const = 0; + virtual bool isConstruction_raw() const = 0; + virtual bool isConstruction_raw(bool value) = 0; + virtual core::ObjectCollection* split_raw(core::Point3D* splitPoint, bool createConstraints) = 0; + virtual core::ObjectCollection* trim_raw(core::Point3D* segmentPoint, bool createConstraints) = 0; + virtual core::ObjectCollection* breakCurve_raw(core::Point3D* segmentPoint, bool createConstraints) = 0; + virtual core::ObjectCollection* extend_raw(core::Point3D* endPoint, bool createConstraints) = 0; + virtual bool intersections_raw(core::ObjectCollection* sketchCurves, core::ObjectCollection*& intersectingCurves, core::ObjectCollection*& intersectionPoints) = 0; + virtual void placeholderSketchCurve0() {} + virtual void placeholderSketchCurve1() {} + virtual void placeholderSketchCurve2() {} + virtual void placeholderSketchCurve3() {} + virtual void placeholderSketchCurve4() {} + virtual void placeholderSketchCurve5() {} + virtual void placeholderSketchCurve6() {} + virtual void placeholderSketchCurve7() {} + virtual void placeholderSketchCurve8() {} + virtual void placeholderSketchCurve9() {} + virtual void placeholderSketchCurve10() {} + virtual void placeholderSketchCurve11() {} + virtual void placeholderSketchCurve12() {} + virtual void placeholderSketchCurve13() {} + virtual void placeholderSketchCurve14() {} + virtual void placeholderSketchCurve15() {} + virtual void placeholderSketchCurve16() {} + virtual void placeholderSketchCurve17() {} + virtual void placeholderSketchCurve18() {} + virtual void placeholderSketchCurve19() {} + virtual void placeholderSketchCurve20() {} + virtual void placeholderSketchCurve21() {} + virtual void placeholderSketchCurve22() {} + virtual void placeholderSketchCurve23() {} +}; + +// Inline wrappers + +inline double SketchCurve::length() const +{ + double res = length_raw(); + return res; +} + +inline bool SketchCurve::isConstruction() const +{ + bool res = isConstruction_raw(); + return res; +} + +inline bool SketchCurve::isConstruction(bool value) +{ + return isConstruction_raw(value); +} + +inline core::Ptr SketchCurve::split(const core::Ptr& splitPoint, bool createConstraints) +{ + core::Ptr res = split_raw(splitPoint.get(), createConstraints); + return res; +} + +inline core::Ptr SketchCurve::trim(const core::Ptr& segmentPoint, bool createConstraints) +{ + core::Ptr res = trim_raw(segmentPoint.get(), createConstraints); + return res; +} + +inline core::Ptr SketchCurve::breakCurve(const core::Ptr& segmentPoint, bool createConstraints) +{ + core::Ptr res = breakCurve_raw(segmentPoint.get(), createConstraints); + return res; +} + +inline core::Ptr SketchCurve::extend(const core::Ptr& endPoint, bool createConstraints) +{ + core::Ptr res = extend_raw(endPoint.get(), createConstraints); + return res; +} + +inline bool SketchCurve::intersections(const core::Ptr& sketchCurves, core::Ptr& intersectingCurves, core::Ptr& intersectionPoints) +{ + core::ObjectCollection* intersectingCurves_ = nullptr; + core::ObjectCollection* intersectionPoints_ = nullptr; + + bool res = intersections_raw(sketchCurves.get(), intersectingCurves_, intersectionPoints_); + intersectingCurves = intersectingCurves_; + intersectionPoints = intersectionPoints_; + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHCURVE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchCurves.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchCurves.h new file mode 100644 index 0000000..08ef504 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchCurves.h @@ -0,0 +1,193 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHCURVES_CPP__ +# define ADSK_FUSION_SKETCHCURVES_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHCURVES_API +# endif +#else +# define ADSK_FUSION_SKETCHCURVES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchArcs; + class SketchCircles; + class SketchConicCurves; + class SketchCurve; + class SketchEllipses; + class SketchEllipticalArcs; + class SketchFittedSplines; + class SketchFixedSplines; + class SketchLines; +}} + +namespace adsk { namespace fusion { + +/// A collection of sketch curves in a sketch. This also provides access to collections +/// for the specific types of curves where you can get the curves based on type and +/// create new curves. +class SketchCurves : public core::Base { +public: + + /// Function that returns the specified sketch curve using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of sketch curves in the sketch. + size_t count() const; + + /// Returns the sketch arcs collection associated with this sketch. + /// This provides access to the existing sketch arcs and supports + /// the creation of new sketch arcs. + core::Ptr sketchArcs() const; + + /// Returns the sketch circles collection associated with this sketch. + /// This provides access to the existing sketch circles and supports + /// the creation of new sketch circles. + core::Ptr sketchCircles() const; + + /// Returns the sketch ellipses collection associated with this sketch. + /// This provides access to the existing sketch ellipses and supports + /// the creation of new sketch ellipses. + core::Ptr sketchEllipses() const; + + /// Returns the sketch elliptical arcs collection associated with this sketch. + /// This provides access to the existing sketch elliptical arcs and supports + /// the creation of new sketch elliptical arcs. + core::Ptr sketchEllipticalArcs() const; + + /// Returns the sketch lines collection associated with this sketch. + /// This provides access to the existing sketch lines and supports + /// the creation of new sketch lines. + core::Ptr sketchLines() const; + + /// Returns the sketch splines collection associated with this sketch. + /// This provides access to the existing sketch splines and supports + /// the creation of new sketch splines. + core::Ptr sketchFittedSplines() const; + + /// Returns the fixed sketch splines collection associated with this sketch. + /// This provides access to the existing fixed sketch splines and supports + /// the creation of new fixed sketch splines. + core::Ptr sketchFixedSplines() const; + + /// Returns the conic curves collection associated with this sketch. + /// This provides access to the existing conic curves and support the + /// creation of new conic curves. + core::Ptr sketchConicCurves() const; + + typedef SketchCurve iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHCURVES_API static const char* classType(); + ADSK_FUSION_SKETCHCURVES_API const char* objectType() const override; + ADSK_FUSION_SKETCHCURVES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHCURVES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchCurve* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual SketchArcs* sketchArcs_raw() const = 0; + virtual SketchCircles* sketchCircles_raw() const = 0; + virtual SketchEllipses* sketchEllipses_raw() const = 0; + virtual SketchEllipticalArcs* sketchEllipticalArcs_raw() const = 0; + virtual SketchLines* sketchLines_raw() const = 0; + virtual SketchFittedSplines* sketchFittedSplines_raw() const = 0; + virtual SketchFixedSplines* sketchFixedSplines_raw() const = 0; + virtual SketchConicCurves* sketchConicCurves_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchCurves::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SketchCurves::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr SketchCurves::sketchArcs() const +{ + core::Ptr res = sketchArcs_raw(); + return res; +} + +inline core::Ptr SketchCurves::sketchCircles() const +{ + core::Ptr res = sketchCircles_raw(); + return res; +} + +inline core::Ptr SketchCurves::sketchEllipses() const +{ + core::Ptr res = sketchEllipses_raw(); + return res; +} + +inline core::Ptr SketchCurves::sketchEllipticalArcs() const +{ + core::Ptr res = sketchEllipticalArcs_raw(); + return res; +} + +inline core::Ptr SketchCurves::sketchLines() const +{ + core::Ptr res = sketchLines_raw(); + return res; +} + +inline core::Ptr SketchCurves::sketchFittedSplines() const +{ + core::Ptr res = sketchFittedSplines_raw(); + return res; +} + +inline core::Ptr SketchCurves::sketchFixedSplines() const +{ + core::Ptr res = sketchFixedSplines_raw(); + return res; +} + +inline core::Ptr SketchCurves::sketchConicCurves() const +{ + core::Ptr res = sketchConicCurves_raw(); + return res; +} + +template inline void SketchCurves::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHCURVES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchDiameterDimension.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchDiameterDimension.h new file mode 100644 index 0000000..1d198f3 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchDiameterDimension.h @@ -0,0 +1,90 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchDimension.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHDIAMETERDIMENSION_CPP__ +# define ADSK_FUSION_SKETCHDIAMETERDIMENSION_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHDIAMETERDIMENSION_API +# endif +#else +# define ADSK_FUSION_SKETCHDIAMETERDIMENSION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchCurve; +}} + +namespace adsk { namespace fusion { + +/// An diameter dimension in a sketch. +class SketchDiameterDimension : public SketchDimension { +public: + + /// Returns the arc or circle being constrained. + core::Ptr entity() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SKETCHDIAMETERDIMENSION_API static const char* classType(); + ADSK_FUSION_SKETCHDIAMETERDIMENSION_API const char* objectType() const override; + ADSK_FUSION_SKETCHDIAMETERDIMENSION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHDIAMETERDIMENSION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchCurve* entity_raw() const = 0; + virtual SketchDiameterDimension* nativeObject_raw() const = 0; + virtual SketchDiameterDimension* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchDiameterDimension::entity() const +{ + core::Ptr res = entity_raw(); + return res; +} + +inline core::Ptr SketchDiameterDimension::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchDiameterDimension::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHDIAMETERDIMENSION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchDimension.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchDimension.h new file mode 100644 index 0000000..7120575 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchDimension.h @@ -0,0 +1,204 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHDIMENSION_CPP__ +# define ADSK_FUSION_SKETCHDIMENSION_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHDIMENSION_API +# endif +#else +# define ADSK_FUSION_SKETCHDIMENSION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class ModelParameter; + class Occurrence; + class Sketch; +}} +namespace adsk { namespace core { + class Attributes; + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// The base class for the all sketch dimensions. +class SketchDimension : public core::Base { +public: + + /// Deletes this dimension. The IsDeletable property indicates if this dimension can be deleted. + /// Returns true if the delete was successful. + bool deleteMe(); + + /// Indicates if this dimension is deletable. + bool isDeletable() const; + + /// Gets and sets position of the dimension text. + core::Ptr textPosition() const; + bool textPosition(const core::Ptr& value); + + /// Returns the parent sketch object. + core::Ptr parentSketch() const; + + /// Returns the associated parameter or null if there is no associated parameter. + core::Ptr parameter() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this object + /// in an assembly. This is only valid in the case where this is acting + /// as a proxy in an assembly. Returns null in the case where the object + /// is not in the context of an assembly but is already the native object. + core::Ptr assemblyContext() const; + + /// Gets and sets if the dimension is Driving or is Driven. Setting this property to true for a given dimension + /// may fail if the result would over constrain the sketch. Fusion 360 does not allow over-constrained sketches. + bool isDriving() const; + bool isDriving(bool value); + + /// Returns the collection of attributes associated with this sketch dimension. + core::Ptr attributes() const; + + /// Returns a token for the SketchDimension object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same sketch dimension. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + ADSK_FUSION_SKETCHDIMENSION_API static const char* classType(); + ADSK_FUSION_SKETCHDIMENSION_API const char* objectType() const override; + ADSK_FUSION_SKETCHDIMENSION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHDIMENSION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual bool deleteMe_raw() = 0; + virtual bool isDeletable_raw() const = 0; + virtual core::Point3D* textPosition_raw() const = 0; + virtual bool textPosition_raw(core::Point3D* value) = 0; + virtual Sketch* parentSketch_raw() const = 0; + virtual ModelParameter* parameter_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual bool isDriving_raw() const = 0; + virtual bool isDriving_raw(bool value) = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual char* entityToken_raw() const = 0; + virtual void placeholderSketchDimension0() {} + virtual void placeholderSketchDimension1() {} + virtual void placeholderSketchDimension2() {} + virtual void placeholderSketchDimension3() {} + virtual void placeholderSketchDimension4() {} + virtual void placeholderSketchDimension5() {} + virtual void placeholderSketchDimension6() {} + virtual void placeholderSketchDimension7() {} + virtual void placeholderSketchDimension8() {} + virtual void placeholderSketchDimension9() {} + virtual void placeholderSketchDimension10() {} + virtual void placeholderSketchDimension11() {} + virtual void placeholderSketchDimension12() {} + virtual void placeholderSketchDimension13() {} + virtual void placeholderSketchDimension14() {} + virtual void placeholderSketchDimension15() {} + virtual void placeholderSketchDimension16() {} + virtual void placeholderSketchDimension17() {} + virtual void placeholderSketchDimension18() {} + virtual void placeholderSketchDimension19() {} + virtual void placeholderSketchDimension20() {} +}; + +// Inline wrappers + +inline bool SketchDimension::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline bool SketchDimension::isDeletable() const +{ + bool res = isDeletable_raw(); + return res; +} + +inline core::Ptr SketchDimension::textPosition() const +{ + core::Ptr res = textPosition_raw(); + return res; +} + +inline bool SketchDimension::textPosition(const core::Ptr& value) +{ + return textPosition_raw(value.get()); +} + +inline core::Ptr SketchDimension::parentSketch() const +{ + core::Ptr res = parentSketch_raw(); + return res; +} + +inline core::Ptr SketchDimension::parameter() const +{ + core::Ptr res = parameter_raw(); + return res; +} + +inline core::Ptr SketchDimension::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline bool SketchDimension::isDriving() const +{ + bool res = isDriving_raw(); + return res; +} + +inline bool SketchDimension::isDriving(bool value) +{ + return isDriving_raw(value); +} + +inline core::Ptr SketchDimension::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline std::string SketchDimension::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHDIMENSION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchDimensionList.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchDimensionList.h new file mode 100644 index 0000000..6091153 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchDimensionList.h @@ -0,0 +1,88 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHDIMENSIONLIST_CPP__ +# define ADSK_FUSION_SKETCHDIMENSIONLIST_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHDIMENSIONLIST_API +# endif +#else +# define ADSK_FUSION_SKETCHDIMENSIONLIST_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchDimension; +}} + +namespace adsk { namespace fusion { + +/// A list of sketch dimensions. +class SketchDimensionList : public core::Base { +public: + + /// Function that returns the specified sketch dimension using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection + /// has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of sketch dimensions in the sketch. + size_t count() const; + + typedef SketchDimension iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHDIMENSIONLIST_API static const char* classType(); + ADSK_FUSION_SKETCHDIMENSIONLIST_API const char* objectType() const override; + ADSK_FUSION_SKETCHDIMENSIONLIST_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHDIMENSIONLIST_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchDimension* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchDimensionList::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SketchDimensionList::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void SketchDimensionList::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHDIMENSIONLIST_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchDimensions.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchDimensions.h new file mode 100644 index 0000000..6eed655 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchDimensions.h @@ -0,0 +1,244 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHDIMENSIONS_CPP__ +# define ADSK_FUSION_SKETCHDIMENSIONS_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHDIMENSIONS_API +# endif +#else +# define ADSK_FUSION_SKETCHDIMENSIONS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchAngularDimension; + class SketchConcentricCircleDimension; + class SketchCurve; + class SketchDiameterDimension; + class SketchDimension; + class SketchEllipseMajorRadiusDimension; + class SketchEllipseMinorRadiusDimension; + class SketchEntity; + class SketchLine; + class SketchLinearDimension; + class SketchOffsetDimension; + class SketchPoint; + class SketchRadialDimension; +}} +namespace adsk { namespace core { + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// A collection of the dimensions in a sketch. This object also supports the methods to add +/// new sketch dimensions. +class SketchDimensions : public core::Base { +public: + + /// Function that returns the specified sketch dimension using an index into the + /// collection. + /// index : The index of the item within the collection to return. The first item in the + /// collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of sketch dimensions in the sketch. + size_t count() const; + + /// Creates a new linear dimension constraint between the two input entities. + /// pointOne : The first SketchPoint to dimension to. + /// pointTwo : The second SketchPoint to dimension to.. + /// orientation : The orientation of the dimension. + /// textPoint : A Point3D object that defines the position of the dimension text. + /// isDriving : Optional argument that specifies if a driving (the dimension controls the geometry) + /// or a driven (the geometry controls the dimension) dimension is created. If not provided + /// a driving dimension will be created. + /// Returns the newly created dimension or null if the creation failed. + core::Ptr addDistanceDimension(const core::Ptr& pointOne, const core::Ptr& pointTwo, DimensionOrientations orientation, const core::Ptr& textPoint, bool isDriving = true); + + /// Creates a new linear dimension constraint between the two input entities. The first input + /// entity must be a sketch line. The second entity can be a point or a line that is parallel + /// to the first. The dimension controls the distance as measured perpendicular to the first + /// input line. + /// line : The SketchLine to dimension to. + /// entityTwo : The parallel SketchLine or SketchPoint to dimension to. If a SketchLine is used it must be + /// parallel to the first line. + /// textPoint : A Point3D object that defines the position of the dimension text. + /// isDriving : Optional argument that specifies if a driving (the dimension controls the geometry) + /// or a driven (the geometry controls the dimension) dimension is created. If not provided + /// a driving dimension will be created. + /// Returns the newly created dimension or null if the creation failed. + core::Ptr addOffsetDimension(const core::Ptr& line, const core::Ptr& entityTwo, const core::Ptr& textPoint, bool isDriving = true); + + /// Creates a new angular dimension constraint between the two input lines. + /// The position of the text controls which of the four quadrants will be dimensioned. + /// lineOne : The first SketchLine to dimension to. + /// lineTwo : The second SketchLine to dimension to. + /// textPoint : A Point3D object that defines the position of the dimension text. The position of this + /// text defines which quadrant will be dimensioned. + /// isDriving : Optional argument that specifies if a driving (the dimension controls the geometry) + /// or a driven (the geometry controls the dimension) dimension is created. If not provided + /// a driving dimension will be created. + /// Returns the newly created dimension or null if the creation failed. + core::Ptr addAngularDimension(const core::Ptr& lineOne, const core::Ptr& lineTwo, const core::Ptr& textPoint, bool isDriving = true); + + /// Creates a new diameter dimension constraint on the arc or circle. + /// entity : The SketchCircle or SketchArc to dimension. + /// textPoint : A Point3D object that defines the position of the dimension text. + /// isDriving : Optional argument that specifies if a driving (the dimension controls the geometry) + /// or a driven (the geometry controls the dimension) dimension is created. If not provided + /// a driving dimension will be created. + /// Returns the newly created dimension or null if the creation failed. + core::Ptr addDiameterDimension(const core::Ptr& entity, const core::Ptr& textPoint, bool isDriving = true); + + /// Creates a new radial dimension constraint on the arc or circle. + /// entity : The SketchCircle or SketchArc to dimension. + /// textPoint : A Point3D object that defines the position of the dimension text. + /// isDriving : Optional argument that specifies if a driving (the dimension controls the geometry) + /// or a driven (the geometry controls the dimension) dimension is created. If not provided + /// a driving dimension will be created. + /// Returns the newly created dimension or null if the creation failed. + core::Ptr addRadialDimension(const core::Ptr& entity, const core::Ptr& textPoint, bool isDriving = true); + + /// Creates a new dimension constraint on the major radius of an ellipse. + /// ellipse : The SketchEllipse to dimension. + /// textPoint : A Point3D object that defines the position of the dimension text. + /// isDriving : Optional argument that specifies if a driving (the dimension controls the geometry) + /// or a driven (the geometry controls the dimension) dimension is created. If not provided + /// a driving dimension will be created. + /// Returns the newly created dimension or null if the creation failed. + core::Ptr addEllipseMajorRadiusDimension(const core::Ptr& ellipse, const core::Ptr& textPoint, bool isDriving = true); + + /// Creates a new dimension constraint on the minor radius of an ellipse. + /// ellipse : The SketchEllipse to dimension. + /// textPoint : A Point3D object that defines the position of the dimension text. + /// isDriving : Optional argument that specifies if a driving (the dimension controls the geometry) + /// or a driven (the geometry controls the dimension) dimension is created. If not provided + /// a driving dimension will be created. + /// Returns the newly created dimension or null if the creation failed. + core::Ptr addEllipseMinorRadiusDimension(const core::Ptr& ellipse, const core::Ptr& textPoint, bool isDriving = true); + + /// Creates a new dimension constraint between to concentric circles or arcs. + /// circleOne : The first SketchCircle or SketchArc to dimension. + /// circleTwo : The second SketchCircle or SketchArc to dimension. + /// textPoint : A Point3D object that defines the position of the dimension text. + /// isDriving : Optional argument that specifies if a driving (the dimension controls the geometry) + /// or a driven (the geometry controls the dimension) dimension is created. If not provided + /// a driving dimension will be created. + /// Returns the newly created dimension or null if the creation failed. + core::Ptr addConcentricCircleDimension(const core::Ptr& circleOne, const core::Ptr& circleTwo, const core::Ptr& textPoint, bool isDriving = true); + + typedef SketchDimension iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHDIMENSIONS_API static const char* classType(); + ADSK_FUSION_SKETCHDIMENSIONS_API const char* objectType() const override; + ADSK_FUSION_SKETCHDIMENSIONS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHDIMENSIONS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchDimension* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual SketchLinearDimension* addDistanceDimension_raw(SketchPoint* pointOne, SketchPoint* pointTwo, DimensionOrientations orientation, core::Point3D* textPoint, bool isDriving) = 0; + virtual SketchOffsetDimension* addOffsetDimension_raw(SketchLine* line, SketchEntity* entityTwo, core::Point3D* textPoint, bool isDriving) = 0; + virtual SketchAngularDimension* addAngularDimension_raw(SketchLine* lineOne, SketchLine* lineTwo, core::Point3D* textPoint, bool isDriving) = 0; + virtual SketchDiameterDimension* addDiameterDimension_raw(SketchCurve* entity, core::Point3D* textPoint, bool isDriving) = 0; + virtual SketchRadialDimension* addRadialDimension_raw(SketchCurve* entity, core::Point3D* textPoint, bool isDriving) = 0; + virtual SketchEllipseMajorRadiusDimension* addEllipseMajorRadiusDimension_raw(SketchCurve* ellipse, core::Point3D* textPoint, bool isDriving) = 0; + virtual SketchEllipseMinorRadiusDimension* addEllipseMinorRadiusDimension_raw(SketchCurve* ellipse, core::Point3D* textPoint, bool isDriving) = 0; + virtual SketchConcentricCircleDimension* addConcentricCircleDimension_raw(SketchCurve* circleOne, SketchCurve* circleTwo, core::Point3D* textPoint, bool isDriving) = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchDimensions::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SketchDimensions::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr SketchDimensions::addDistanceDimension(const core::Ptr& pointOne, const core::Ptr& pointTwo, DimensionOrientations orientation, const core::Ptr& textPoint, bool isDriving) +{ + core::Ptr res = addDistanceDimension_raw(pointOne.get(), pointTwo.get(), orientation, textPoint.get(), isDriving); + return res; +} + +inline core::Ptr SketchDimensions::addOffsetDimension(const core::Ptr& line, const core::Ptr& entityTwo, const core::Ptr& textPoint, bool isDriving) +{ + core::Ptr res = addOffsetDimension_raw(line.get(), entityTwo.get(), textPoint.get(), isDriving); + return res; +} + +inline core::Ptr SketchDimensions::addAngularDimension(const core::Ptr& lineOne, const core::Ptr& lineTwo, const core::Ptr& textPoint, bool isDriving) +{ + core::Ptr res = addAngularDimension_raw(lineOne.get(), lineTwo.get(), textPoint.get(), isDriving); + return res; +} + +inline core::Ptr SketchDimensions::addDiameterDimension(const core::Ptr& entity, const core::Ptr& textPoint, bool isDriving) +{ + core::Ptr res = addDiameterDimension_raw(entity.get(), textPoint.get(), isDriving); + return res; +} + +inline core::Ptr SketchDimensions::addRadialDimension(const core::Ptr& entity, const core::Ptr& textPoint, bool isDriving) +{ + core::Ptr res = addRadialDimension_raw(entity.get(), textPoint.get(), isDriving); + return res; +} + +inline core::Ptr SketchDimensions::addEllipseMajorRadiusDimension(const core::Ptr& ellipse, const core::Ptr& textPoint, bool isDriving) +{ + core::Ptr res = addEllipseMajorRadiusDimension_raw(ellipse.get(), textPoint.get(), isDriving); + return res; +} + +inline core::Ptr SketchDimensions::addEllipseMinorRadiusDimension(const core::Ptr& ellipse, const core::Ptr& textPoint, bool isDriving) +{ + core::Ptr res = addEllipseMinorRadiusDimension_raw(ellipse.get(), textPoint.get(), isDriving); + return res; +} + +inline core::Ptr SketchDimensions::addConcentricCircleDimension(const core::Ptr& circleOne, const core::Ptr& circleTwo, const core::Ptr& textPoint, bool isDriving) +{ + core::Ptr res = addConcentricCircleDimension_raw(circleOne.get(), circleTwo.get(), textPoint.get(), isDriving); + return res; +} + +template inline void SketchDimensions::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHDIMENSIONS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipse.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipse.h new file mode 100644 index 0000000..b55f370 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipse.h @@ -0,0 +1,200 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchCurve.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHELLIPSE_CPP__ +# define ADSK_FUSION_SKETCHELLIPSE_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHELLIPSE_API +# endif +#else +# define ADSK_FUSION_SKETCHELLIPSE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchLine; + class SketchPoint; +}} +namespace adsk { namespace core { + class Ellipse3D; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// An ellipse in a sketch. +class SketchEllipse : public SketchCurve { +public: + + /// Returns the sketch point that defines the center of the ellipse. You can + /// reposition the ellipse by moving the sketch point, assuming any existing + /// constraints allow the desired change. + core::Ptr centerSketchPoint() const; + + /// Gets and sets the major axis direction of the ellipse. Changing the axis is + /// limited by any constraints that might exist on the ellipse. Setting the axis + /// can fail in cases where the direction is fully defined through constraints. + core::Ptr majorAxis() const; + bool majorAxis(const core::Ptr& value); + + /// Gets and sets the major axis radius of the ellipse. Changing the radius is + /// limited by any constraints that might exist on the ellipse. Setting the radius + /// can fail in cases where the radius is fully defined through constraints. + double majorAxisRadius() const; + bool majorAxisRadius(double value); + + /// Gets and sets the minor axis radius of the ellipse. Changing the radius is + /// limited by any constraints that might exist on the ellipse. Setting the radius + /// can fail in cases where the radius is fully defined through constraints. + double minorAxisRadius() const; + bool minorAxisRadius(double value); + + /// Returns the transient geometry of the ellipse which provides geometric + /// information about the ellipse. The returned geometry is always in sketch space. + core::Ptr geometry() const; + + /// Returns an Ellipse3D object which provides geometric information in world space. + /// The returned geometry takes into account the assembly context and the position of the + /// sketch in it's parent component, which means the geometry will be returned in the root + /// component space. + core::Ptr worldGeometry() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns the sketch line associated with the ellipse that lies along the major axis. + /// This can return null in the case where the line has been deleted. + core::Ptr majorAxisLine() const; + + /// Returns the sketch line associated with the ellipse that lies along the minor axis. + /// This can return null in the case where the line has been deleted. + core::Ptr minorAxisLine() const; + + ADSK_FUSION_SKETCHELLIPSE_API static const char* classType(); + ADSK_FUSION_SKETCHELLIPSE_API const char* objectType() const override; + ADSK_FUSION_SKETCHELLIPSE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHELLIPSE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchPoint* centerSketchPoint_raw() const = 0; + virtual core::Vector3D* majorAxis_raw() const = 0; + virtual bool majorAxis_raw(core::Vector3D* value) = 0; + virtual double majorAxisRadius_raw() const = 0; + virtual bool majorAxisRadius_raw(double value) = 0; + virtual double minorAxisRadius_raw() const = 0; + virtual bool minorAxisRadius_raw(double value) = 0; + virtual core::Ellipse3D* geometry_raw() const = 0; + virtual core::Ellipse3D* worldGeometry_raw() const = 0; + virtual SketchEllipse* nativeObject_raw() const = 0; + virtual SketchEllipse* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual SketchLine* majorAxisLine_raw() const = 0; + virtual SketchLine* minorAxisLine_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchEllipse::centerSketchPoint() const +{ + core::Ptr res = centerSketchPoint_raw(); + return res; +} + +inline core::Ptr SketchEllipse::majorAxis() const +{ + core::Ptr res = majorAxis_raw(); + return res; +} + +inline bool SketchEllipse::majorAxis(const core::Ptr& value) +{ + return majorAxis_raw(value.get()); +} + +inline double SketchEllipse::majorAxisRadius() const +{ + double res = majorAxisRadius_raw(); + return res; +} + +inline bool SketchEllipse::majorAxisRadius(double value) +{ + return majorAxisRadius_raw(value); +} + +inline double SketchEllipse::minorAxisRadius() const +{ + double res = minorAxisRadius_raw(); + return res; +} + +inline bool SketchEllipse::minorAxisRadius(double value) +{ + return minorAxisRadius_raw(value); +} + +inline core::Ptr SketchEllipse::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline core::Ptr SketchEllipse::worldGeometry() const +{ + core::Ptr res = worldGeometry_raw(); + return res; +} + +inline core::Ptr SketchEllipse::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchEllipse::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr SketchEllipse::majorAxisLine() const +{ + core::Ptr res = majorAxisLine_raw(); + return res; +} + +inline core::Ptr SketchEllipse::minorAxisLine() const +{ + core::Ptr res = minorAxisLine_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHELLIPSE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipseMajorRadiusDimension.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipseMajorRadiusDimension.h new file mode 100644 index 0000000..e07aaa7 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipseMajorRadiusDimension.h @@ -0,0 +1,90 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchDimension.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHELLIPSEMAJORRADIUSDIMENSION_CPP__ +# define ADSK_FUSION_SKETCHELLIPSEMAJORRADIUSDIMENSION_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHELLIPSEMAJORRADIUSDIMENSION_API +# endif +#else +# define ADSK_FUSION_SKETCHELLIPSEMAJORRADIUSDIMENSION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchCurve; +}} + +namespace adsk { namespace fusion { + +/// An ellipse major radius dimension in a sketch. +class SketchEllipseMajorRadiusDimension : public SketchDimension { +public: + + /// Returns the ellipse or elliptical arc being constrained. + core::Ptr ellipse() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SKETCHELLIPSEMAJORRADIUSDIMENSION_API static const char* classType(); + ADSK_FUSION_SKETCHELLIPSEMAJORRADIUSDIMENSION_API const char* objectType() const override; + ADSK_FUSION_SKETCHELLIPSEMAJORRADIUSDIMENSION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHELLIPSEMAJORRADIUSDIMENSION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchCurve* ellipse_raw() const = 0; + virtual SketchEllipseMajorRadiusDimension* nativeObject_raw() const = 0; + virtual SketchEllipseMajorRadiusDimension* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchEllipseMajorRadiusDimension::ellipse() const +{ + core::Ptr res = ellipse_raw(); + return res; +} + +inline core::Ptr SketchEllipseMajorRadiusDimension::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchEllipseMajorRadiusDimension::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHELLIPSEMAJORRADIUSDIMENSION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipseMinorRadiusDimension.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipseMinorRadiusDimension.h new file mode 100644 index 0000000..47d3128 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipseMinorRadiusDimension.h @@ -0,0 +1,90 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchDimension.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHELLIPSEMINORRADIUSDIMENSION_CPP__ +# define ADSK_FUSION_SKETCHELLIPSEMINORRADIUSDIMENSION_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHELLIPSEMINORRADIUSDIMENSION_API +# endif +#else +# define ADSK_FUSION_SKETCHELLIPSEMINORRADIUSDIMENSION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchCurve; +}} + +namespace adsk { namespace fusion { + +/// An ellipse minor radius dimension in a sketch. +class SketchEllipseMinorRadiusDimension : public SketchDimension { +public: + + /// Returns the ellipse or elliptical arc being constrained. + core::Ptr ellipse() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SKETCHELLIPSEMINORRADIUSDIMENSION_API static const char* classType(); + ADSK_FUSION_SKETCHELLIPSEMINORRADIUSDIMENSION_API const char* objectType() const override; + ADSK_FUSION_SKETCHELLIPSEMINORRADIUSDIMENSION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHELLIPSEMINORRADIUSDIMENSION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchCurve* ellipse_raw() const = 0; + virtual SketchEllipseMinorRadiusDimension* nativeObject_raw() const = 0; + virtual SketchEllipseMinorRadiusDimension* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchEllipseMinorRadiusDimension::ellipse() const +{ + core::Ptr res = ellipse_raw(); + return res; +} + +inline core::Ptr SketchEllipseMinorRadiusDimension::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchEllipseMinorRadiusDimension::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHELLIPSEMINORRADIUSDIMENSION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipses.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipses.h new file mode 100644 index 0000000..cf1d2b3 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipses.h @@ -0,0 +1,107 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHELLIPSES_CPP__ +# define ADSK_FUSION_SKETCHELLIPSES_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHELLIPSES_API +# endif +#else +# define ADSK_FUSION_SKETCHELLIPSES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchEllipse; +}} +namespace adsk { namespace core { + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// The collection of ellipses in a sketch. This provides access to the existing +/// ellipses and supports the methods to create new ellipses. +class SketchEllipses : public core::Base { +public: + + /// Function that returns the specified sketch ellipse using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of ellipses in the sketch. + size_t count() const; + + /// Creates a sketch ellipse using the center point, a point defining the major axis + /// and a third point anywhere along the ellipse. The created ellipse is parallel to the + /// x-y plane of the sketch. + /// centerPoint : The center point of the ellipse. This can be either an existing SketchPoint or a Point3D object. + /// majorAxisPoint : A point3D object that defines both the major axis direction and major axis radius. + /// point : A point3D object that the ellipse will pass through. + /// Returns the newly created SketchEllipse object if the creation was successful or null if it failed. + core::Ptr add(const core::Ptr& centerPoint, const core::Ptr& majorAxisPoint, const core::Ptr& point); + + typedef SketchEllipse iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHELLIPSES_API static const char* classType(); + ADSK_FUSION_SKETCHELLIPSES_API const char* objectType() const override; + ADSK_FUSION_SKETCHELLIPSES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHELLIPSES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchEllipse* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual SketchEllipse* add_raw(core::Base* centerPoint, core::Point3D* majorAxisPoint, core::Point3D* point) = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchEllipses::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SketchEllipses::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr SketchEllipses::add(const core::Ptr& centerPoint, const core::Ptr& majorAxisPoint, const core::Ptr& point) +{ + core::Ptr res = add_raw(centerPoint.get(), majorAxisPoint.get(), point.get()); + return res; +} + +template inline void SketchEllipses::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHELLIPSES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipticalArc.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipticalArc.h new file mode 100644 index 0000000..ddbf07d --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipticalArc.h @@ -0,0 +1,201 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchCurve.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHELLIPTICALARC_CPP__ +# define ADSK_FUSION_SKETCHELLIPTICALARC_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHELLIPTICALARC_API +# endif +#else +# define ADSK_FUSION_SKETCHELLIPTICALARC_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchPoint; +}} +namespace adsk { namespace core { + class EllipticalArc3D; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// An elliptical arc in a sketch. +class SketchEllipticalArc : public SketchCurve { +public: + + /// Gets the sketch point that defines the center of the elliptical arc. You can + /// reposition the elliptical arc by moving the sketch point, assuming any existing + /// constraints allow the desired change. + core::Ptr centerSketchPoint() const; + + /// Gets the sketch point that defines the start of the elliptical arc. You can + /// reposition the sketch point, assuming any existing constraints allow the + /// desired change. + core::Ptr startSketchPoint() const; + + /// Gets the sketch point that defines the end of the elliptical arc. You can + /// reposition the sketch point, assuming any existing constraints allow the + /// desired change. + core::Ptr endSketchPoint() const; + + /// Gets and sets the major axis direction of the elliptical arc. Changing the axis is + /// limited by any constraints that might exist on the elliptical arc. Setting the axis + /// can fail in cases where the direction is fully defined through constraints. + core::Ptr majorAxis() const; + bool majorAxis(const core::Ptr& value); + + /// Gets and sets the major axis radius of the elliptical arc. Changing the radius is + /// limited by any constraints that might exist on the elliptical arc. Setting the radius + /// can fail in cases where the radius is fully defined through constraints. + double majorAxisRadius() const; + bool majorAxisRadius(double value); + + /// Gets and sets the minor axis radius of the elliptical arc. Changing the radius is + /// limited by any constraints that might exist on the elliptical arc. Setting the radius + /// can fail in cases where the radius is fully defined through constraints. + double minorAxisRadius() const; + bool minorAxisRadius(double value); + + /// Returns the transient geometry of the elliptical arc which provides geometric + /// information about the elliptical arc. The returned geometry is always in sketch space. + core::Ptr geometry() const; + + /// Returns an EllipticalArc3D object which provides geometric information in world space. + /// The returned geometry takes into account the assembly context and the position of the + /// sketch in it's parent component, which means the geometry will be returned in the root + /// component space. + core::Ptr worldGeometry() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SKETCHELLIPTICALARC_API static const char* classType(); + ADSK_FUSION_SKETCHELLIPTICALARC_API const char* objectType() const override; + ADSK_FUSION_SKETCHELLIPTICALARC_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHELLIPTICALARC_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchPoint* centerSketchPoint_raw() const = 0; + virtual SketchPoint* startSketchPoint_raw() const = 0; + virtual SketchPoint* endSketchPoint_raw() const = 0; + virtual core::Vector3D* majorAxis_raw() const = 0; + virtual bool majorAxis_raw(core::Vector3D* value) = 0; + virtual double majorAxisRadius_raw() const = 0; + virtual bool majorAxisRadius_raw(double value) = 0; + virtual double minorAxisRadius_raw() const = 0; + virtual bool minorAxisRadius_raw(double value) = 0; + virtual core::EllipticalArc3D* geometry_raw() const = 0; + virtual core::EllipticalArc3D* worldGeometry_raw() const = 0; + virtual SketchEllipticalArc* nativeObject_raw() const = 0; + virtual SketchEllipticalArc* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchEllipticalArc::centerSketchPoint() const +{ + core::Ptr res = centerSketchPoint_raw(); + return res; +} + +inline core::Ptr SketchEllipticalArc::startSketchPoint() const +{ + core::Ptr res = startSketchPoint_raw(); + return res; +} + +inline core::Ptr SketchEllipticalArc::endSketchPoint() const +{ + core::Ptr res = endSketchPoint_raw(); + return res; +} + +inline core::Ptr SketchEllipticalArc::majorAxis() const +{ + core::Ptr res = majorAxis_raw(); + return res; +} + +inline bool SketchEllipticalArc::majorAxis(const core::Ptr& value) +{ + return majorAxis_raw(value.get()); +} + +inline double SketchEllipticalArc::majorAxisRadius() const +{ + double res = majorAxisRadius_raw(); + return res; +} + +inline bool SketchEllipticalArc::majorAxisRadius(double value) +{ + return majorAxisRadius_raw(value); +} + +inline double SketchEllipticalArc::minorAxisRadius() const +{ + double res = minorAxisRadius_raw(); + return res; +} + +inline bool SketchEllipticalArc::minorAxisRadius(double value) +{ + return minorAxisRadius_raw(value); +} + +inline core::Ptr SketchEllipticalArc::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline core::Ptr SketchEllipticalArc::worldGeometry() const +{ + core::Ptr res = worldGeometry_raw(); + return res; +} + +inline core::Ptr SketchEllipticalArc::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchEllipticalArc::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHELLIPTICALARC_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipticalArcs.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipticalArcs.h new file mode 100644 index 0000000..dfb7988 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchEllipticalArcs.h @@ -0,0 +1,88 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHELLIPTICALARCS_CPP__ +# define ADSK_FUSION_SKETCHELLIPTICALARCS_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHELLIPTICALARCS_API +# endif +#else +# define ADSK_FUSION_SKETCHELLIPTICALARCS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchEllipticalArc; +}} + +namespace adsk { namespace fusion { + +/// The collection of elliptical arcs in a sketch. This provides access to the existing +/// elliptical arcs and supports the methods to create new elliptical arcs. +class SketchEllipticalArcs : public core::Base { +public: + + /// Function that returns the specified sketch elliptical arc using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of elliptical arcs in the sketch. + size_t count() const; + + typedef SketchEllipticalArc iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHELLIPTICALARCS_API static const char* classType(); + ADSK_FUSION_SKETCHELLIPTICALARCS_API const char* objectType() const override; + ADSK_FUSION_SKETCHELLIPTICALARCS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHELLIPTICALARCS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchEllipticalArc* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchEllipticalArcs::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SketchEllipticalArcs::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void SketchEllipticalArcs::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHELLIPTICALARCS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchEntity.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchEntity.h new file mode 100644 index 0000000..b1a7fe5 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchEntity.h @@ -0,0 +1,316 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHENTITY_CPP__ +# define ADSK_FUSION_SKETCHENTITY_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHENTITY_API +# endif +#else +# define ADSK_FUSION_SKETCHENTITY_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class GeometricConstraintList; + class Occurrence; + class Sketch; + class SketchDimensionList; +}} +namespace adsk { namespace core { + class Attributes; + class BoundingBox3D; +}} + +namespace adsk { namespace fusion { + +/// This object represents all geometry in a sketch, including +/// points and lines and the various curves. +class SketchEntity : public core::Base { +public: + + /// Returns the parent sketch. + core::Ptr parentSketch() const; + + /// Returns the sketch dimensions that are attached to this curve. + core::Ptr sketchDimensions() const; + + /// Returns the sketch constraints that are attached to this curve. + core::Ptr geometricConstraints() const; + + /// Indicates if this curve lies entirely on the sketch x-y plane. + bool is2D() const; + + /// Indicates if this geometry is a reference. + /// Changing this property from true to false removes the reference. + /// This property can not be set to true if it is already false. + bool isReference() const; + bool isReference(bool value); + + /// Indicates if this geometry is "fixed". + bool isFixed() const; + bool isFixed(bool value); + + /// When a sketch is created, geometry is sometimes automatically added to the sketch. + /// For example a sketch point that references the origin point is always included and + /// if a face was selected to create the sketch on, geometry from the face is also included. + /// This automatically created geometry behaves in a special way in that it is invisible + /// but is available for selection and it also participates in profile calculations. It's + /// not possible to make them visible but they can be deleted and they can be used for any + /// other standard sketch operation. + bool isVisible() const; + + /// Returns the bounding box of the entity in sketch space. + core::Ptr boundingBox() const; + + /// Deletes the entity from the sketch. + /// Returns true is the delete was successful. + bool deleteMe(); + + /// Returns the referenced entity in the case where IsReference + /// is true. However, this property can also return null when + /// IsReference is true in the case where the reference is not + /// parametric. + core::Ptr referencedEntity() const; + + /// Returns the assembly occurrence (i.e. the occurrence) of this object + /// in an assembly. This is only valid in the case where this is acting + /// as a proxy in an assembly. Returns null in the case where the object + /// is not in the context of an assembly but is already the native object. + core::Ptr assemblyContext() const; + + /// Indicates if this sketch entity can be deleted. There are cases, especially with sketch + /// points where another entity is dependent on an entity so deleting it is not allowed. + /// For example, you can't delete the center point of circle by itself but deleting the circle + /// will delete the point. The same is true for the end points of a line. + bool isDeletable() const; + + /// Indicates if this sketch entity is fully constrained. + bool isFullyConstrained() const; + + /// Returns the collection of attributes associated with this face. + core::Ptr attributes() const; + + /// Returns a token for the SketchEntity object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same sketch entity. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + /// Indicates if this sketch entity was created by a projection, inclusion, or driven by an API script. + /// If this returns true, then the entity is presented to the user as not editable and with a 'break link' + /// command available. + bool isLinked() const; + + ADSK_FUSION_SKETCHENTITY_API static const char* classType(); + ADSK_FUSION_SKETCHENTITY_API const char* objectType() const override; + ADSK_FUSION_SKETCHENTITY_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHENTITY_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Sketch* parentSketch_raw() const = 0; + virtual SketchDimensionList* sketchDimensions_raw() const = 0; + virtual GeometricConstraintList* geometricConstraints_raw() const = 0; + virtual bool is2D_raw() const = 0; + virtual bool isReference_raw() const = 0; + virtual bool isReference_raw(bool value) = 0; + virtual bool isFixed_raw() const = 0; + virtual bool isFixed_raw(bool value) = 0; + virtual bool isVisible_raw() const = 0; + virtual core::BoundingBox3D* boundingBox_raw() const = 0; + virtual bool deleteMe_raw() = 0; + virtual core::Base* referencedEntity_raw() const = 0; + virtual Occurrence* assemblyContext_raw() const = 0; + virtual bool isDeletable_raw() const = 0; + virtual bool isFullyConstrained_raw() const = 0; + virtual core::Attributes* attributes_raw() const = 0; + virtual char* entityToken_raw() const = 0; + virtual bool isLinked_raw() const = 0; + virtual void placeholderSketchEntity0() {} + virtual void placeholderSketchEntity1() {} + virtual void placeholderSketchEntity2() {} + virtual void placeholderSketchEntity3() {} + virtual void placeholderSketchEntity4() {} + virtual void placeholderSketchEntity5() {} + virtual void placeholderSketchEntity6() {} + virtual void placeholderSketchEntity7() {} + virtual void placeholderSketchEntity8() {} + virtual void placeholderSketchEntity9() {} + virtual void placeholderSketchEntity10() {} + virtual void placeholderSketchEntity11() {} + virtual void placeholderSketchEntity12() {} + virtual void placeholderSketchEntity13() {} + virtual void placeholderSketchEntity14() {} + virtual void placeholderSketchEntity15() {} + virtual void placeholderSketchEntity16() {} + virtual void placeholderSketchEntity17() {} + virtual void placeholderSketchEntity18() {} + virtual void placeholderSketchEntity19() {} + virtual void placeholderSketchEntity20() {} + virtual void placeholderSketchEntity21() {} + virtual void placeholderSketchEntity22() {} + virtual void placeholderSketchEntity23() {} + virtual void placeholderSketchEntity24() {} + virtual void placeholderSketchEntity25() {} + virtual void placeholderSketchEntity26() {} + virtual void placeholderSketchEntity27() {} + virtual void placeholderSketchEntity28() {} + virtual void placeholderSketchEntity29() {} + virtual void placeholderSketchEntity30() {} + virtual void placeholderSketchEntity31() {} + virtual void placeholderSketchEntity32() {} + virtual void placeholderSketchEntity33() {} + virtual void placeholderSketchEntity34() {} + virtual void placeholderSketchEntity35() {} + virtual void placeholderSketchEntity36() {} + virtual void placeholderSketchEntity37() {} + virtual void placeholderSketchEntity38() {} + virtual void placeholderSketchEntity39() {} + virtual void placeholderSketchEntity40() {} + virtual void placeholderSketchEntity41() {} + virtual void placeholderSketchEntity42() {} + virtual void placeholderSketchEntity43() {} + virtual void placeholderSketchEntity44() {} + virtual void placeholderSketchEntity45() {} +}; + +// Inline wrappers + +inline core::Ptr SketchEntity::parentSketch() const +{ + core::Ptr res = parentSketch_raw(); + return res; +} + +inline core::Ptr SketchEntity::sketchDimensions() const +{ + core::Ptr res = sketchDimensions_raw(); + return res; +} + +inline core::Ptr SketchEntity::geometricConstraints() const +{ + core::Ptr res = geometricConstraints_raw(); + return res; +} + +inline bool SketchEntity::is2D() const +{ + bool res = is2D_raw(); + return res; +} + +inline bool SketchEntity::isReference() const +{ + bool res = isReference_raw(); + return res; +} + +inline bool SketchEntity::isReference(bool value) +{ + return isReference_raw(value); +} + +inline bool SketchEntity::isFixed() const +{ + bool res = isFixed_raw(); + return res; +} + +inline bool SketchEntity::isFixed(bool value) +{ + return isFixed_raw(value); +} + +inline bool SketchEntity::isVisible() const +{ + bool res = isVisible_raw(); + return res; +} + +inline core::Ptr SketchEntity::boundingBox() const +{ + core::Ptr res = boundingBox_raw(); + return res; +} + +inline bool SketchEntity::deleteMe() +{ + bool res = deleteMe_raw(); + return res; +} + +inline core::Ptr SketchEntity::referencedEntity() const +{ + core::Ptr res = referencedEntity_raw(); + return res; +} + +inline core::Ptr SketchEntity::assemblyContext() const +{ + core::Ptr res = assemblyContext_raw(); + return res; +} + +inline bool SketchEntity::isDeletable() const +{ + bool res = isDeletable_raw(); + return res; +} + +inline bool SketchEntity::isFullyConstrained() const +{ + bool res = isFullyConstrained_raw(); + return res; +} + +inline core::Ptr SketchEntity::attributes() const +{ + core::Ptr res = attributes_raw(); + return res; +} + +inline std::string SketchEntity::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool SketchEntity::isLinked() const +{ + bool res = isLinked_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHENTITY_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchEntityList.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchEntityList.h new file mode 100644 index 0000000..936411d --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchEntityList.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHENTITYLIST_CPP__ +# define ADSK_FUSION_SKETCHENTITYLIST_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHENTITYLIST_API +# endif +#else +# define ADSK_FUSION_SKETCHENTITYLIST_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchEntity; +}} + +namespace adsk { namespace fusion { + +/// A list of sketch entities. +class SketchEntityList : public core::Base { +public: + + /// Function that returns the specified sketch entity using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of sketch entities in the list. + size_t count() const; + + typedef SketchEntity iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHENTITYLIST_API static const char* classType(); + ADSK_FUSION_SKETCHENTITYLIST_API const char* objectType() const override; + ADSK_FUSION_SKETCHENTITYLIST_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHENTITYLIST_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchEntity* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchEntityList::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SketchEntityList::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void SketchEntityList::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHENTITYLIST_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchFittedSpline.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchFittedSpline.h new file mode 100644 index 0000000..cfee661 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchFittedSpline.h @@ -0,0 +1,249 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchCurve.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHFITTEDSPLINE_CPP__ +# define ADSK_FUSION_SKETCHFITTEDSPLINE_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHFITTEDSPLINE_API +# endif +#else +# define ADSK_FUSION_SKETCHFITTEDSPLINE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchArc; + class SketchLine; + class SketchPoint; + class SketchPointList; +}} +namespace adsk { namespace core { + class NurbsCurve3D; +}} + +namespace adsk { namespace fusion { + +/// A fitted spline in a sketch. +class SketchFittedSpline : public SketchCurve { +public: + + /// Returns the sketch point that defines the starting position + /// of the spline. Editing the position of this sketch point + /// will result in editing the spline. + core::Ptr startSketchPoint() const; + + /// Returns the sketch point that defines the ending position + /// of the spline. Editing the position of this sketch point + /// will result in editing the spline. + core::Ptr endSketchPoint() const; + + /// Returns the set of sketch points that the spline fits through. + /// The points include the start and end points and are returned in + /// the same order as the spline fits through them where the first point + /// in the list is the start point and the last point is the end point. + /// Editing the position of these sketch points will result in + /// editing the spline. + core::Ptr fitPoints() const; + + /// Gets and sets if this spline is closed. A closed spline + /// is also periodic. This property can return false even in + /// the case where the spline is physically closed. It's possible + /// that the start and end points of a spline can be the same point + /// but the curve is still not considered closed. This can happen + /// when the start and end points of an open curve are merged. The + /// curve is physically closed but is not periodic and can have a + /// discontinuity at the joint. Setting it to closed will cause it + /// to be periodic and to always remain closed even as fit points + /// are deleted. + bool isClosed() const; + bool isClosed(bool value); + + /// Returns the transient geometry of the curve which provides geometric + /// information about the curve. The returned geometry is always in sketch space. + core::Ptr geometry() const; + + /// Returns an NurbsCurve3D object which provides geometric information in world space. + /// The returned geometry takes into account the assembly context and the position of the + /// sketch in it's parent component, which means the geometry will be returned in the root + /// component space. + core::Ptr worldGeometry() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Activates the tangent handle for the specified fit point and returns the sketch line + /// that acts as the handle to control the tangency. You can use the getTangentHandle + /// property to determine if the tangent handle has already been activated. If this method + /// is called for a handle that already exists, nothing changes and the existing sketch line + /// that acts as the tangent handle is returned. + /// The getTangentHandle method can be used to determine if the handle has already been + /// activated. + /// To deactivate a sketch handle you can delete the sketch line. + /// fitPoint : The fit point on the curve where you want to activate the tangent handle. + /// The fit points can be obtained by using the fitPoints property of the SketchFittedSpline object. + /// Returns the sketch line that acts as the tangent handle at the specified fit point. + core::Ptr activateTangentHandle(const core::Ptr& fitPoint); + + /// Returns the sketch line that acts as the handle to control the tangency at the specified fit + /// point. Returns null in the case where the tangent handle has not been activated at that sketch point. + /// Deleting the returned line will deactivate the tangent handle. Use the activateTangentHandle method + /// to activate the tangent handle. + /// fitPoint : The fit point on the curve where you want to get the tangent handle. + /// The fit points can be obtained by using the fitPoints property of the SketchFittedSpline object. + /// Returns the sketch line that acts as the handle to control the tangency at the specified point or + /// returns null in the case where the tangency handle has not been activated at the specified sketch point. + core::Ptr getTangentHandle(const core::Ptr& fitPoint); + + /// Activates the curvature handle for the specified fit point and returns the sketch arc + /// that acts as the handle to control the curvature. You can use the getCurvatureHandle + /// property to determine if the curvature handle has already been activated. If this method + /// is called for a handle that already exists, nothing changes and the existing sketch arc + /// that acts as the curvature handle is returned. + /// The getCurvatureHandle method can be used to determine if the handle has already been + /// activated. + /// To deactivate a sketch handle you can delete the sketch arc. + /// fitPoint : The fit point on the curve where you want to activate the curvature handle. + /// The fit points can be obtained by using the fitPoints property of the SketchFittedSpline object. + /// Returns the sketch arc that acts as the curvature handle at the specified fit point. + core::Ptr activateCurvatureHandle(const core::Ptr& fitPoint); + + /// Returns the sketch arc that acts as the handle to control the curvature at the specified fit + /// point. Returns null in the case where the curvature handle has not been activated at that sketch point. + /// Deleting the returned arc will deactivate the curvature handle. Use the activateCurvatureHandle method + /// to activate the curvature handle. + /// fitPoint : The fit point on the curve where you want to get the curvature handle. + /// The fit points can be obtained by using the fitPoints property of the SketchFittedSpline object. + /// Returns the sketch arc that acts as the handle to control the curvature at the specified point or + /// returns null in the case where the curvature handle has not been activated at the specified sketch point. + core::Ptr getCurvatureHandle(const core::Ptr& fitPoint); + + ADSK_FUSION_SKETCHFITTEDSPLINE_API static const char* classType(); + ADSK_FUSION_SKETCHFITTEDSPLINE_API const char* objectType() const override; + ADSK_FUSION_SKETCHFITTEDSPLINE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHFITTEDSPLINE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchPoint* startSketchPoint_raw() const = 0; + virtual SketchPoint* endSketchPoint_raw() const = 0; + virtual SketchPointList* fitPoints_raw() const = 0; + virtual bool isClosed_raw() const = 0; + virtual bool isClosed_raw(bool value) = 0; + virtual core::NurbsCurve3D* geometry_raw() const = 0; + virtual core::NurbsCurve3D* worldGeometry_raw() const = 0; + virtual SketchFittedSpline* nativeObject_raw() const = 0; + virtual SketchFittedSpline* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual SketchLine* activateTangentHandle_raw(SketchPoint* fitPoint) = 0; + virtual SketchLine* getTangentHandle_raw(SketchPoint* fitPoint) = 0; + virtual SketchArc* activateCurvatureHandle_raw(SketchPoint* fitPoint) = 0; + virtual SketchArc* getCurvatureHandle_raw(SketchPoint* fitPoint) = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchFittedSpline::startSketchPoint() const +{ + core::Ptr res = startSketchPoint_raw(); + return res; +} + +inline core::Ptr SketchFittedSpline::endSketchPoint() const +{ + core::Ptr res = endSketchPoint_raw(); + return res; +} + +inline core::Ptr SketchFittedSpline::fitPoints() const +{ + core::Ptr res = fitPoints_raw(); + return res; +} + +inline bool SketchFittedSpline::isClosed() const +{ + bool res = isClosed_raw(); + return res; +} + +inline bool SketchFittedSpline::isClosed(bool value) +{ + return isClosed_raw(value); +} + +inline core::Ptr SketchFittedSpline::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline core::Ptr SketchFittedSpline::worldGeometry() const +{ + core::Ptr res = worldGeometry_raw(); + return res; +} + +inline core::Ptr SketchFittedSpline::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchFittedSpline::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr SketchFittedSpline::activateTangentHandle(const core::Ptr& fitPoint) +{ + core::Ptr res = activateTangentHandle_raw(fitPoint.get()); + return res; +} + +inline core::Ptr SketchFittedSpline::getTangentHandle(const core::Ptr& fitPoint) +{ + core::Ptr res = getTangentHandle_raw(fitPoint.get()); + return res; +} + +inline core::Ptr SketchFittedSpline::activateCurvatureHandle(const core::Ptr& fitPoint) +{ + core::Ptr res = activateCurvatureHandle_raw(fitPoint.get()); + return res; +} + +inline core::Ptr SketchFittedSpline::getCurvatureHandle(const core::Ptr& fitPoint) +{ + core::Ptr res = getCurvatureHandle_raw(fitPoint.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHFITTEDSPLINE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchFittedSplines.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchFittedSplines.h new file mode 100644 index 0000000..7ad739b --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchFittedSplines.h @@ -0,0 +1,118 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHFITTEDSPLINES_CPP__ +# define ADSK_FUSION_SKETCHFITTEDSPLINES_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHFITTEDSPLINES_API +# endif +#else +# define ADSK_FUSION_SKETCHFITTEDSPLINES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchFittedSpline; +}} +namespace adsk { namespace core { + class NurbsCurve3D; + class ObjectCollection; +}} + +namespace adsk { namespace fusion { + +/// The collection of fitted splines in a sketch. This provides access to the existing +/// fitted splines and supports the methods to create new fitted splines. +class SketchFittedSplines : public core::Base { +public: + + /// Function that returns the specified sketch fitted spline using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of fitted splines in the sketch. + size_t count() const; + + /// Creates a new fitted spline through the specified points. + /// fitPoints : A collection of points that the curve will fit through. They + /// can be any combination of existing SketchPoint or Point3D objects. + /// Returns the newly created SketchFittedSpline object if the creation was successful or null if it failed. + core::Ptr add(const core::Ptr& fitPoints); + + /// Creates a new fitted spline using the input NurbsCurve3D to define the shape. Fit points are created + /// to create a curve that exactly matches the input curve. + /// nurbsCurve : A NurbsCurve3D object that defines a valid NURBS curve. + /// Returns the newly created SketchFittedSpline object if the creation was successful or null if it failed. + core::Ptr addByNurbsCurve(const core::Ptr& nurbsCurve); + + typedef SketchFittedSpline iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHFITTEDSPLINES_API static const char* classType(); + ADSK_FUSION_SKETCHFITTEDSPLINES_API const char* objectType() const override; + ADSK_FUSION_SKETCHFITTEDSPLINES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHFITTEDSPLINES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchFittedSpline* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual SketchFittedSpline* add_raw(core::ObjectCollection* fitPoints) = 0; + virtual SketchFittedSpline* addByNurbsCurve_raw(core::NurbsCurve3D* nurbsCurve) = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchFittedSplines::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SketchFittedSplines::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr SketchFittedSplines::add(const core::Ptr& fitPoints) +{ + core::Ptr res = add_raw(fitPoints.get()); + return res; +} + +inline core::Ptr SketchFittedSplines::addByNurbsCurve(const core::Ptr& nurbsCurve) +{ + core::Ptr res = addByNurbsCurve_raw(nurbsCurve.get()); + return res; +} + +template inline void SketchFittedSplines::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHFITTEDSPLINES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchFixedSpline.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchFixedSpline.h new file mode 100644 index 0000000..b501eff --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchFixedSpline.h @@ -0,0 +1,160 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchCurve.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHFIXEDSPLINE_CPP__ +# define ADSK_FUSION_SKETCHFIXEDSPLINE_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHFIXEDSPLINE_API +# endif +#else +# define ADSK_FUSION_SKETCHFIXEDSPLINE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchPoint; +}} +namespace adsk { namespace core { + class CurveEvaluator3D; + class NurbsCurve3D; +}} + +namespace adsk { namespace fusion { + +/// The SketchFixedSpline class represents splines in a sketch that are +/// un-editable. These can result from including splines from other sketches +/// or the spline edges. They can also be created by intersections and +/// projecting splines onto a sketch. +class SketchFixedSpline : public SketchCurve { +public: + + /// The sketch point at the start of the spline. + core::Ptr startSketchPoint() const; + + /// The sketch point at the end of the spline. + core::Ptr endSketchPoint() const; + + /// Returns the transient geometry of the curve which provides geometric + /// information about the curve. The returned geometry is always in sketch space. + /// Because the fixed spline can be analytically defined, for example it + /// can be the precise intersection of a surface and the sketch plane, + /// returning a NURBS curve that represents the spline may be an + /// approximation of the actual curve. You can use the Evaluator + /// property of the SketchFixedSpline object to perform evaluations + /// on the precise curve. + core::Ptr geometry() const; + + /// Returns a NurbsCurve3D object that is the equivalent of this sketch curve + /// but is in the space of the parent component rather than in sketch space. + core::Ptr worldGeometry() const; + + /// Returns an evaluator object that lets you perform evaluations + /// on the precise geometry of the curve. + core::Ptr evaluator() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Replaces the underlying NURBS curve that defines the shape of the fixed curve. This + /// can only be used if the isNative property of the SketchFixedSpline returns false. + /// nurbsCurve : A NurbsCurve3D object that defines a valid NURBS curve and will be used to replace + /// the existing geometry definition. + /// Returns true if the replacement was successful. + bool replaceGeometry(const core::Ptr& nurbsCurve); + + ADSK_FUSION_SKETCHFIXEDSPLINE_API static const char* classType(); + ADSK_FUSION_SKETCHFIXEDSPLINE_API const char* objectType() const override; + ADSK_FUSION_SKETCHFIXEDSPLINE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHFIXEDSPLINE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchPoint* startSketchPoint_raw() const = 0; + virtual SketchPoint* endSketchPoint_raw() const = 0; + virtual core::NurbsCurve3D* geometry_raw() const = 0; + virtual core::NurbsCurve3D* worldGeometry_raw() const = 0; + virtual core::CurveEvaluator3D* evaluator_raw() const = 0; + virtual SketchFixedSpline* nativeObject_raw() const = 0; + virtual SketchFixedSpline* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual bool replaceGeometry_raw(core::NurbsCurve3D* nurbsCurve) = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchFixedSpline::startSketchPoint() const +{ + core::Ptr res = startSketchPoint_raw(); + return res; +} + +inline core::Ptr SketchFixedSpline::endSketchPoint() const +{ + core::Ptr res = endSketchPoint_raw(); + return res; +} + +inline core::Ptr SketchFixedSpline::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline core::Ptr SketchFixedSpline::worldGeometry() const +{ + core::Ptr res = worldGeometry_raw(); + return res; +} + +inline core::Ptr SketchFixedSpline::evaluator() const +{ + core::Ptr res = evaluator_raw(); + return res; +} + +inline core::Ptr SketchFixedSpline::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchFixedSpline::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline bool SketchFixedSpline::replaceGeometry(const core::Ptr& nurbsCurve) +{ + bool res = replaceGeometry_raw(nurbsCurve.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHFIXEDSPLINE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchFixedSplines.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchFixedSplines.h new file mode 100644 index 0000000..06da70f --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchFixedSplines.h @@ -0,0 +1,105 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHFIXEDSPLINES_CPP__ +# define ADSK_FUSION_SKETCHFIXEDSPLINES_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHFIXEDSPLINES_API +# endif +#else +# define ADSK_FUSION_SKETCHFIXEDSPLINES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchFixedSpline; +}} +namespace adsk { namespace core { + class NurbsCurve3D; +}} + +namespace adsk { namespace fusion { + +/// The collection of fixed splines in a sketch. Fixed splines are splines that were created +/// as the result of some operation (i.e. intersection) and is not directly editable. +class SketchFixedSplines : public core::Base { +public: + + /// Function that returns the specified sketch fixed spline using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of fitted splines in the sketch. + size_t count() const; + + /// Creates a new fixed spline using the input NurbsCurve3D to define the shape. The resulting curve + /// is not editable by the user but can be updated via the API using the replaceGeometry method on the + /// SketchFixedSpline object. + /// nurbsCurve : A NurbsCurve3D object that defines a valid NURBS curve. + /// Returns the newly created SketchFixedSpline object if the creation was successful or null if it failed. + core::Ptr addByNurbsCurve(const core::Ptr& nurbsCurve); + + typedef SketchFixedSpline iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHFIXEDSPLINES_API static const char* classType(); + ADSK_FUSION_SKETCHFIXEDSPLINES_API const char* objectType() const override; + ADSK_FUSION_SKETCHFIXEDSPLINES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHFIXEDSPLINES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchFixedSpline* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual SketchFixedSpline* addByNurbsCurve_raw(core::NurbsCurve3D* nurbsCurve) = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchFixedSplines::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SketchFixedSplines::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr SketchFixedSplines::addByNurbsCurve(const core::Ptr& nurbsCurve) +{ + core::Ptr res = addByNurbsCurve_raw(nurbsCurve.get()); + return res; +} + +template inline void SketchFixedSplines::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHFIXEDSPLINES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchLine.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchLine.h new file mode 100644 index 0000000..1f398d3 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchLine.h @@ -0,0 +1,146 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchCurve.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHLINE_CPP__ +# define ADSK_FUSION_SKETCHLINE_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHLINE_API +# endif +#else +# define ADSK_FUSION_SKETCHLINE_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchPoint; +}} +namespace adsk { namespace core { + class Line3D; +}} + +namespace adsk { namespace fusion { + +/// A line in a sketch. +class SketchLine : public SketchCurve { +public: + + /// The sketch point at the start of the line. The line is dependent on this point and moving the + /// point will cause the line to adjust. + core::Ptr startSketchPoint() const; + + /// The sketch point at the end of the line. The line is dependent on this point and moving the + /// point will cause the line to adjust. + core::Ptr endSketchPoint() const; + + /// Returns the transient geometry of the line which provides geometry + /// information about the line. The returned geometry is always in sketch space. + core::Ptr geometry() const; + + /// Returns a Line3D object which provides geometric information in world space. + /// The returned geometry takes into account the assembly context and the position of the + /// sketch in it's parent component, which means the geometry will be returned in the root + /// component space. + core::Ptr worldGeometry() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Gets and sets whether this line is defined as a centerline. + bool isCenterLine() const; + bool isCenterLine(bool value); + + ADSK_FUSION_SKETCHLINE_API static const char* classType(); + ADSK_FUSION_SKETCHLINE_API const char* objectType() const override; + ADSK_FUSION_SKETCHLINE_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHLINE_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchPoint* startSketchPoint_raw() const = 0; + virtual SketchPoint* endSketchPoint_raw() const = 0; + virtual core::Line3D* geometry_raw() const = 0; + virtual core::Line3D* worldGeometry_raw() const = 0; + virtual SketchLine* nativeObject_raw() const = 0; + virtual SketchLine* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual bool isCenterLine_raw() const = 0; + virtual bool isCenterLine_raw(bool value) = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchLine::startSketchPoint() const +{ + core::Ptr res = startSketchPoint_raw(); + return res; +} + +inline core::Ptr SketchLine::endSketchPoint() const +{ + core::Ptr res = endSketchPoint_raw(); + return res; +} + +inline core::Ptr SketchLine::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline core::Ptr SketchLine::worldGeometry() const +{ + core::Ptr res = worldGeometry_raw(); + return res; +} + +inline core::Ptr SketchLine::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchLine::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline bool SketchLine::isCenterLine() const +{ + bool res = isCenterLine_raw(); + return res; +} + +inline bool SketchLine::isCenterLine(bool value) +{ + return isCenterLine_raw(value); +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHLINE_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchLineList.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchLineList.h new file mode 100644 index 0000000..414754b --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchLineList.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHLINELIST_CPP__ +# define ADSK_FUSION_SKETCHLINELIST_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHLINELIST_API +# endif +#else +# define ADSK_FUSION_SKETCHLINELIST_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchLine; +}} + +namespace adsk { namespace fusion { + +/// A list of sketch lines. +class SketchLineList : public core::Base { +public: + + /// Function that returns the specified sketch line using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of sketch lines in the list. + size_t count() const; + + typedef SketchLine iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHLINELIST_API static const char* classType(); + ADSK_FUSION_SKETCHLINELIST_API const char* objectType() const override; + ADSK_FUSION_SKETCHLINELIST_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHLINELIST_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchLine* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchLineList::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SketchLineList::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void SketchLineList::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHLINELIST_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchLinearDimension.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchLinearDimension.h new file mode 100644 index 0000000..0bcbb5e --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchLinearDimension.h @@ -0,0 +1,111 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../FusionTypeDefs.h" +#include "SketchDimension.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHLINEARDIMENSION_CPP__ +# define ADSK_FUSION_SKETCHLINEARDIMENSION_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHLINEARDIMENSION_API +# endif +#else +# define ADSK_FUSION_SKETCHLINEARDIMENSION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchEntity; +}} + +namespace adsk { namespace fusion { + +/// A linear dimension in a sketch. +class SketchLinearDimension : public SketchDimension { +public: + + /// The first entity being constrained. + core::Ptr entityOne() const; + + /// The second entity being constrained. + core::Ptr entityTwo() const; + + /// The orientation of this dimension. + DimensionOrientations orientation() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SKETCHLINEARDIMENSION_API static const char* classType(); + ADSK_FUSION_SKETCHLINEARDIMENSION_API const char* objectType() const override; + ADSK_FUSION_SKETCHLINEARDIMENSION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHLINEARDIMENSION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchEntity* entityOne_raw() const = 0; + virtual SketchEntity* entityTwo_raw() const = 0; + virtual DimensionOrientations orientation_raw() const = 0; + virtual SketchLinearDimension* nativeObject_raw() const = 0; + virtual SketchLinearDimension* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchLinearDimension::entityOne() const +{ + core::Ptr res = entityOne_raw(); + return res; +} + +inline core::Ptr SketchLinearDimension::entityTwo() const +{ + core::Ptr res = entityTwo_raw(); + return res; +} + +inline DimensionOrientations SketchLinearDimension::orientation() const +{ + DimensionOrientations res = orientation_raw(); + return res; +} + +inline core::Ptr SketchLinearDimension::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchLinearDimension::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHLINEARDIMENSION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchLines.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchLines.h new file mode 100644 index 0000000..ecabc85 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchLines.h @@ -0,0 +1,204 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHLINES_CPP__ +# define ADSK_FUSION_SKETCHLINES_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHLINES_API +# endif +#else +# define ADSK_FUSION_SKETCHLINES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchLine; + class SketchLineList; +}} +namespace adsk { namespace core { + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// The collection of lines in a sketch. This provides access to the existing +/// lines and supports the methods to create new lines. +class SketchLines : public core::Base { +public: + + /// Function that returns the specified sketch line using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of lines in the sketch. + size_t count() const; + + /// Creates a sketch line between the two input points. The input points + /// can be either existing SketchPoints or Point3D objects. If a SketchPoint + /// is used the new line will be based on that sketch point and update if the + /// sketch point is modified. + /// startPoint : The start point of the line. It can be a SketchPoint or Point3D object. + /// endPoint : The end point of the line. It can be a SketchPoint or Point3D object. + /// Returns the newly created SketchLine object or null if the creation failed. + core::Ptr addByTwoPoints(const core::Ptr& startPoint, const core::Ptr& endPoint); + + /// Creates four sketch lines representing a rectangle where the two points are the opposing corners + /// of the rectangle. The input points can be either existing SketchPoints or Point3D objects. + /// If a SketchPoint is used the new lines will be based on that sketch point and update if the + /// sketch point is modified. + /// pointOne : The first corner of the rectangle. It can be a SketchPoint or Point3D object. + /// pointTwo : The second corner of the rectangle. It can be a SketchPoint or Point3D object. + /// Returns the four new sketch lines or null if the creation failed. + core::Ptr addTwoPointRectangle(const core::Ptr& pointOne, const core::Ptr& pointTwo); + + /// Creates four sketch lines representing a rectangle where the first two points are the base corners + /// of the rectangle and the third point defines the height. + /// pointOne : The first corner of the rectangle. It can be a SketchPoint or Point3D object. + /// pointTwo : The first corner of the rectangle. It can be a SketchPoint or Point3D object. + /// pointThree : The first corner of the rectangle. a Point3D object defining the height of the rectangle. + /// Returns the four new sketch lines or null if the creation failed. + core::Ptr addThreePointRectangle(const core::Ptr& pointOne, const core::Ptr& pointTwo, const core::Ptr& pointThree); + + /// Creates four sketch lines representing a rectangle where the first point represents the center of + /// the rectangle. The second point is the corner of the rectangle and can be either an existing + /// SketchPoint or Point3D object. The four sketch lines are returned. + /// centerPoint : The center point of the rectangle + /// cornerPoint : The corner of the rectangle. It can be a SketchPoint or Point3D object. + /// Returns the four new sketch lines or null if the creation failed. + core::Ptr addCenterPointRectangle(const core::Ptr& centerPoint, const core::Ptr& cornerPoint); + + /// Creates a chamfer between two sketch lines. In the case where the two input lines cross each other creating + /// an "X" shape, this results in four quadrants where the chamfer can be placed. The point arguments are used + /// to define which of the four quadrants the chamfer should be created in. The two points define which side of + /// the two lines should be kept and the other end will be trimmed by the chamfer. The easiest way to use this is + /// to use the end points of the lines on the side you want to keep. + /// In the case where the lines don't intersect or connect at the end points, there is only one valid quadrant + /// for the chamfer so the points are ignored. + /// firstLine : The first line you want to chamfer. + /// firstLinePoint : A point on the first line that is on the side of the intersection with the second line that you want to keep. + /// secondLine : The second line you want to chamfer. + /// secondLinePoint : A point on the second line that is on the side of the intersection with the first line that you want to keep. + /// distanceOne : Defines the distance of the start point of the chamfer line from the intersection point of the two lines along the first line. + /// The distance is defined in centimeters. + /// distanceTwo : Defines the distance of the start point of the chamfer line from the intersection point of the two lines along the second line. + /// The distance is defined in centimeters. + /// Returns the newly created SketchLine object that represents the chamfer or null if the creation failed. + core::Ptr addDistanceChamfer(const core::Ptr& firstLine, const core::Ptr& firstLinePoint, const core::Ptr& secondLine, const core::Ptr& secondLinePoint, double distanceOne, double distanceTwo); + + /// Creates a chamfer between two sketch lines. In the case where the two input lines cross each other creating + /// an "X" shape, this results in four quadrants where the chamfer can be placed. The point arguments are used + /// to define which of the four quadrants the chamfer should be created in. The two points define which side of + /// the two lines should be kept and the other end will be trimmed by the chamfer. The easiest way to use this is + /// to use the end points of the lines on the side you want to keep. + /// In the case where the lines don't intersect or connect at the end points, there is only one valid quadrant + /// for the chamfer so the points are ignored. + /// firstLine : The first line you want to chamfer. + /// firstLinePoint : A point on the first line that is on the side of the intersection with the second line that you want to keep. + /// secondLine : The second line you want to chamfer. + /// secondLinePoint : A point on the second line that is on the side of the intersection with the first line that you want to keep. + /// distance : Defines the distance of the start point of the chamfer from the intersection point of the two lines along the first line. + /// The distance is defined in centimeters. + /// angle : Defines the angle of the chamfer as measured from the first line. + /// The angle is defined in radians. + /// Returns the newly created SketchLine object that represents the chamfer or null if the creation failed. + core::Ptr addAngleChamfer(const core::Ptr& firstLine, const core::Ptr& firstLinePoint, const core::Ptr& secondLine, const core::Ptr& secondLinePoint, double distance, double angle); + + typedef SketchLine iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHLINES_API static const char* classType(); + ADSK_FUSION_SKETCHLINES_API const char* objectType() const override; + ADSK_FUSION_SKETCHLINES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHLINES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchLine* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual SketchLine* addByTwoPoints_raw(core::Base* startPoint, core::Base* endPoint) = 0; + virtual SketchLineList* addTwoPointRectangle_raw(core::Base* pointOne, core::Base* pointTwo) = 0; + virtual SketchLineList* addThreePointRectangle_raw(core::Base* pointOne, core::Base* pointTwo, core::Point3D* pointThree) = 0; + virtual SketchLineList* addCenterPointRectangle_raw(core::Point3D* centerPoint, core::Base* cornerPoint) = 0; + virtual SketchLine* addDistanceChamfer_raw(SketchLine* firstLine, core::Point3D* firstLinePoint, SketchLine* secondLine, core::Point3D* secondLinePoint, double distanceOne, double distanceTwo) = 0; + virtual SketchLine* addAngleChamfer_raw(SketchLine* firstLine, core::Point3D* firstLinePoint, SketchLine* secondLine, core::Point3D* secondLinePoint, double distance, double angle) = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchLines::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SketchLines::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr SketchLines::addByTwoPoints(const core::Ptr& startPoint, const core::Ptr& endPoint) +{ + core::Ptr res = addByTwoPoints_raw(startPoint.get(), endPoint.get()); + return res; +} + +inline core::Ptr SketchLines::addTwoPointRectangle(const core::Ptr& pointOne, const core::Ptr& pointTwo) +{ + core::Ptr res = addTwoPointRectangle_raw(pointOne.get(), pointTwo.get()); + return res; +} + +inline core::Ptr SketchLines::addThreePointRectangle(const core::Ptr& pointOne, const core::Ptr& pointTwo, const core::Ptr& pointThree) +{ + core::Ptr res = addThreePointRectangle_raw(pointOne.get(), pointTwo.get(), pointThree.get()); + return res; +} + +inline core::Ptr SketchLines::addCenterPointRectangle(const core::Ptr& centerPoint, const core::Ptr& cornerPoint) +{ + core::Ptr res = addCenterPointRectangle_raw(centerPoint.get(), cornerPoint.get()); + return res; +} + +inline core::Ptr SketchLines::addDistanceChamfer(const core::Ptr& firstLine, const core::Ptr& firstLinePoint, const core::Ptr& secondLine, const core::Ptr& secondLinePoint, double distanceOne, double distanceTwo) +{ + core::Ptr res = addDistanceChamfer_raw(firstLine.get(), firstLinePoint.get(), secondLine.get(), secondLinePoint.get(), distanceOne, distanceTwo); + return res; +} + +inline core::Ptr SketchLines::addAngleChamfer(const core::Ptr& firstLine, const core::Ptr& firstLinePoint, const core::Ptr& secondLine, const core::Ptr& secondLinePoint, double distance, double angle) +{ + core::Ptr res = addAngleChamfer_raw(firstLine.get(), firstLinePoint.get(), secondLine.get(), secondLinePoint.get(), distance, angle); + return res; +} + +template inline void SketchLines::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHLINES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchOffsetCurvesDimension.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchOffsetCurvesDimension.h new file mode 100644 index 0000000..b148d18 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchOffsetCurvesDimension.h @@ -0,0 +1,91 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchDimension.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHOFFSETCURVESDIMENSION_CPP__ +# define ADSK_FUSION_SKETCHOFFSETCURVESDIMENSION_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHOFFSETCURVESDIMENSION_API +# endif +#else +# define ADSK_FUSION_SKETCHOFFSETCURVESDIMENSION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class OffsetConstraint; +}} + +namespace adsk { namespace fusion { + +/// A SketchOffsetCurvesDimension object is created automatically whenever curves are offset. +class SketchOffsetCurvesDimension : public SketchDimension { +public: + + /// Returns the OffsetConstraint object that defines the curve offset. From the constraint + /// you can get the original curves, the offset curves, and the dimension controlling the offset distance. + core::Ptr offsetConstraint() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SKETCHOFFSETCURVESDIMENSION_API static const char* classType(); + ADSK_FUSION_SKETCHOFFSETCURVESDIMENSION_API const char* objectType() const override; + ADSK_FUSION_SKETCHOFFSETCURVESDIMENSION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHOFFSETCURVESDIMENSION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual OffsetConstraint* offsetConstraint_raw() const = 0; + virtual SketchOffsetCurvesDimension* nativeObject_raw() const = 0; + virtual SketchOffsetCurvesDimension* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchOffsetCurvesDimension::offsetConstraint() const +{ + core::Ptr res = offsetConstraint_raw(); + return res; +} + +inline core::Ptr SketchOffsetCurvesDimension::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchOffsetCurvesDimension::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHOFFSETCURVESDIMENSION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchOffsetDimension.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchOffsetDimension.h new file mode 100644 index 0000000..aa37178 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchOffsetDimension.h @@ -0,0 +1,101 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchDimension.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHOFFSETDIMENSION_CPP__ +# define ADSK_FUSION_SKETCHOFFSETDIMENSION_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHOFFSETDIMENSION_API +# endif +#else +# define ADSK_FUSION_SKETCHOFFSETDIMENSION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchEntity; + class SketchLine; +}} + +namespace adsk { namespace fusion { + +/// An offset dimension in a sketch. +class SketchOffsetDimension : public SketchDimension { +public: + + /// The first line being constrained. + core::Ptr line() const; + + /// The second entity being constrained. (a parallel SketchLine or a SketchPoint) + core::Ptr entityTwo() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SKETCHOFFSETDIMENSION_API static const char* classType(); + ADSK_FUSION_SKETCHOFFSETDIMENSION_API const char* objectType() const override; + ADSK_FUSION_SKETCHOFFSETDIMENSION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHOFFSETDIMENSION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchLine* line_raw() const = 0; + virtual SketchEntity* entityTwo_raw() const = 0; + virtual SketchOffsetDimension* nativeObject_raw() const = 0; + virtual SketchOffsetDimension* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchOffsetDimension::line() const +{ + core::Ptr res = line_raw(); + return res; +} + +inline core::Ptr SketchOffsetDimension::entityTwo() const +{ + core::Ptr res = entityTwo_raw(); + return res; +} + +inline core::Ptr SketchOffsetDimension::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchOffsetDimension::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHOFFSETDIMENSION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchPoint.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchPoint.h new file mode 100644 index 0000000..31552d0 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchPoint.h @@ -0,0 +1,151 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchEntity.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHPOINT_CPP__ +# define ADSK_FUSION_SKETCHPOINT_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHPOINT_API +# endif +#else +# define ADSK_FUSION_SKETCHPOINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchEntityList; +}} +namespace adsk { namespace core { + class Point3D; + class Vector3D; +}} + +namespace adsk { namespace fusion { + +/// A point within a sketch. +class SketchPoint : public SketchEntity { +public: + + /// Returns a Point3D object which provides the position of the sketch point. + /// The returned geometry is always in sketch space. + core::Ptr geometry() const; + + /// Returns a Point3D object which provides the position of the sketch point in world space. + /// The returned coordinate takes into account the assembly context and the position of the + /// sketch in it's parent component, which means the coordinate will be returned in the root + /// component space. + core::Ptr worldGeometry() const; + + /// Moves the sketch geometry using the specified transform. + /// Move respects any constraints that would normally prohibit the move. + /// This will fail in the case where the IsReference property is true. + /// translation : The vector that defines the distance and direction to move. + /// Returns true if moving the sketch point was successful. + bool move(const core::Ptr& translation); + + /// Merges the input sketch point into this sketch point. This effectively + /// deletes the other sketch point and changes all entities that referenced + /// that sketch point to reference this sketch point. + /// This is the equivalent of dragging a sketch point on top of another + /// sketch point in the user interface. + /// point : The point to merge with this point. + /// Returns true if the merge was successful. + bool merge(const core::Ptr& point); + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + /// Returns the set of sketch entities that are directly connected to this point. For + /// example any entities that use this point as their start point or end point will be returned + /// and any circle, arc or ellipse who have this point as a center point will be returned. This + /// does not include entities that are related to the point through a constraint. + core::Ptr connectedEntities() const; + + ADSK_FUSION_SKETCHPOINT_API static const char* classType(); + ADSK_FUSION_SKETCHPOINT_API const char* objectType() const override; + ADSK_FUSION_SKETCHPOINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHPOINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual core::Point3D* geometry_raw() const = 0; + virtual core::Point3D* worldGeometry_raw() const = 0; + virtual bool move_raw(core::Vector3D* translation) = 0; + virtual bool merge_raw(SketchPoint* point) = 0; + virtual SketchPoint* nativeObject_raw() const = 0; + virtual SketchPoint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; + virtual SketchEntityList* connectedEntities_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchPoint::geometry() const +{ + core::Ptr res = geometry_raw(); + return res; +} + +inline core::Ptr SketchPoint::worldGeometry() const +{ + core::Ptr res = worldGeometry_raw(); + return res; +} + +inline bool SketchPoint::move(const core::Ptr& translation) +{ + bool res = move_raw(translation.get()); + return res; +} + +inline bool SketchPoint::merge(const core::Ptr& point) +{ + bool res = merge_raw(point.get()); + return res; +} + +inline core::Ptr SketchPoint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchPoint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} + +inline core::Ptr SketchPoint::connectedEntities() const +{ + core::Ptr res = connectedEntities_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHPOINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchPointList.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchPointList.h new file mode 100644 index 0000000..f7cea6b --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchPointList.h @@ -0,0 +1,87 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHPOINTLIST_CPP__ +# define ADSK_FUSION_SKETCHPOINTLIST_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHPOINTLIST_API +# endif +#else +# define ADSK_FUSION_SKETCHPOINTLIST_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchPoint; +}} + +namespace adsk { namespace fusion { + +/// A list of sketch points. +class SketchPointList : public core::Base { +public: + + /// Function that returns the specified sketch point using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of sketch points in the list. + size_t count() const; + + typedef SketchPoint iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHPOINTLIST_API static const char* classType(); + ADSK_FUSION_SKETCHPOINTLIST_API const char* objectType() const override; + ADSK_FUSION_SKETCHPOINTLIST_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHPOINTLIST_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchPoint* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchPointList::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SketchPointList::count() const +{ + size_t res = count_raw(); + return res; +} + +template inline void SketchPointList::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHPOINTLIST_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchPoints.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchPoints.h new file mode 100644 index 0000000..fc06dc6 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchPoints.h @@ -0,0 +1,104 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHPOINTS_CPP__ +# define ADSK_FUSION_SKETCHPOINTS_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHPOINTS_API +# endif +#else +# define ADSK_FUSION_SKETCHPOINTS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchPoint; +}} +namespace adsk { namespace core { + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// A collection of sketch points. +class SketchPoints : public core::Base { +public: + + /// Function that returns the specified sketch using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of sketch points in the sketch. + size_t count() const; + + /// Creates a point at the specified location. This is the equivalent + /// of creating a sketch point using the Point command in the user + /// interface and will create a visible point in the graphics window. + /// point : The coordinate location to create the sketch point. + /// Returns the new sketch point or null if the creation fails. + core::Ptr add(const core::Ptr& point); + + typedef SketchPoint iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHPOINTS_API static const char* classType(); + ADSK_FUSION_SKETCHPOINTS_API const char* objectType() const override; + ADSK_FUSION_SKETCHPOINTS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHPOINTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchPoint* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual SketchPoint* add_raw(core::Point3D* point) = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchPoints::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SketchPoints::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr SketchPoints::add(const core::Ptr& point) +{ + core::Ptr res = add_raw(point.get()); + return res; +} + +template inline void SketchPoints::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHPOINTS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchRadialDimension.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchRadialDimension.h new file mode 100644 index 0000000..655bc07 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchRadialDimension.h @@ -0,0 +1,90 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "SketchDimension.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHRADIALDIMENSION_CPP__ +# define ADSK_FUSION_SKETCHRADIALDIMENSION_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHRADIALDIMENSION_API +# endif +#else +# define ADSK_FUSION_SKETCHRADIALDIMENSION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchCurve; +}} + +namespace adsk { namespace fusion { + +/// An radial dimension in a sketch. +class SketchRadialDimension : public SketchDimension { +public: + + /// The arc or circle being constrained. + core::Ptr entity() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SKETCHRADIALDIMENSION_API static const char* classType(); + ADSK_FUSION_SKETCHRADIALDIMENSION_API const char* objectType() const override; + ADSK_FUSION_SKETCHRADIALDIMENSION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHRADIALDIMENSION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchCurve* entity_raw() const = 0; + virtual SketchRadialDimension* nativeObject_raw() const = 0; + virtual SketchRadialDimension* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchRadialDimension::entity() const +{ + core::Ptr res = entity_raw(); + return res; +} + +inline core::Ptr SketchRadialDimension::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SketchRadialDimension::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHRADIALDIMENSION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchText.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchText.h new file mode 100644 index 0000000..089f8f2 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchText.h @@ -0,0 +1,306 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/CoreTypeDefs.h" +#include "../FusionTypeDefs.h" +#include "SketchEntity.h" +#include +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHTEXT_CPP__ +# define ADSK_FUSION_SKETCHTEXT_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHTEXT_API +# endif +#else +# define ADSK_FUSION_SKETCHTEXT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchCurve; + class SketchLineList; + class SketchTextDefinition; +}} +namespace adsk { namespace core { + class Curve3D; + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// Text in a sketch. +class SketchText : public SketchEntity { +public: + + /// Gets and sets the height of the text in centimeters. + double height() const; + bool height(double value); + + /// Gets and sets the text. This is a simple string and ignores any formatting defined within the text. + std::string text() const; + bool text(const std::string& value); + + /// Gets and sets the position of the text on the x-y plane of the sketch. The text must lie on the x-y plane so the Z component + /// of the point is ignored and always treated as zero. + core::Ptr position() const; + bool position(const core::Ptr& value); + + /// Gets and sets the name of the font to use. + std::string fontName() const; + bool fontName(const std::string& value); + + /// Gets and sets the angle of the text relative to the x-axis of the x-y plane of the sketch. + double angle() const; + bool angle(double value); + + /// Gets and sets the text style to apply to the entire text. This is a bitwise enum so styles + /// can be combined to apply multiple styles. For example you can apply bold and underline. + TextStyles textStyle() const; + bool textStyle(TextStyles value); + + /// Returns the four sketch lines that define the boundary of the sketch text. By adding constraints to these lines + /// you can associatively control the size, position and angle of the sketch text. + core::Ptr boundaryLines() const; + + /// Explodes the SketchText into a set of curves. The original SketchText is deleted as a result of calling this. + /// Returns an array of the sketch curves that were created that represent the text. + std::vector> explode(); + + /// Returns the underlying curves that define the outline of the text. Calling this does not affect the + /// SketchText and does not create any new sketch geometry but returns the geometrical definition of the + /// sketch outline. + /// Returns an array of transient curves that represent the outline of the text. + std::vector> asCurves(); + + /// Gets and sets if the text is flipped horizontally. + bool isHorizontalFlip() const; + bool isHorizontalFlip(bool value); + + /// Gets and sets if the text is flipped vertically. + bool isVerticalFlip() const; + bool isVerticalFlip(bool value); + + /// Sets this SketchTextInput to define text that fits along a specified path. Fitting on a path will + /// space the characters so the text fits along the entire length of the path entity. + /// path : The entity that defines the path for the text. This can be a SketchCurve or BRepEdge object. + /// isAbovePath : Indicates if the text should be positioned above or below the path entity. + /// Returns true if the setting the definition was successful. + bool redefineAsFitOnPath(const core::Ptr& path, bool isAbovePath); + + /// Sets this SketchTextInput to define text that follows along a specified path. + /// path : The entity that defines the path for the text. This can be a SketchCurve or BRepEdge object. + /// isAbovePath : Indicates if the text should be positioned above or below the path entity. + /// horizontalAlignment : Specifies the horizontal alignment of the text with respect to the path curve. + /// characterSpacing : The spacing between the characters. This is an additional spacing to apply that is defined + /// as a percentage of the default spacing. A spacing of 0 indicates no additional spacing. + /// A spacing of 50 indicates to use the default plus 50% of the default. + /// Returns true if the setting the definition was successful. + bool redefineAsAlongPath(const core::Ptr& path, bool isAbovePath, core::HorizontalAlignments horizontalAlignment, double characterSpacing); + + /// Gets the definition that is currently used to specify how the sketch text is defined. + core::Ptr definition() const; + + ADSK_FUSION_SKETCHTEXT_API static const char* classType(); + ADSK_FUSION_SKETCHTEXT_API const char* objectType() const override; + ADSK_FUSION_SKETCHTEXT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHTEXT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual double height_raw() const = 0; + virtual bool height_raw(double value) = 0; + virtual char* text_raw() const = 0; + virtual bool text_raw(const char * value) = 0; + virtual core::Point3D* position_raw() const = 0; + virtual bool position_raw(core::Point3D* value) = 0; + virtual char* fontName_raw() const = 0; + virtual bool fontName_raw(const char * value) = 0; + virtual double angle_raw() const = 0; + virtual bool angle_raw(double value) = 0; + virtual TextStyles textStyle_raw() const = 0; + virtual bool textStyle_raw(TextStyles value) = 0; + virtual SketchLineList* boundaryLines_raw() const = 0; + virtual SketchCurve** explode_raw(size_t& return_size) = 0; + virtual core::Curve3D** asCurves_raw(size_t& return_size) = 0; + virtual bool isHorizontalFlip_raw() const = 0; + virtual bool isHorizontalFlip_raw(bool value) = 0; + virtual bool isVerticalFlip_raw() const = 0; + virtual bool isVerticalFlip_raw(bool value) = 0; + virtual bool redefineAsFitOnPath_raw(core::Base* path, bool isAbovePath) = 0; + virtual bool redefineAsAlongPath_raw(core::Base* path, bool isAbovePath, core::HorizontalAlignments horizontalAlignment, double characterSpacing) = 0; + virtual SketchTextDefinition* definition_raw() const = 0; +}; + +// Inline wrappers + +inline double SketchText::height() const +{ + double res = height_raw(); + return res; +} + +inline bool SketchText::height(double value) +{ + return height_raw(value); +} + +inline std::string SketchText::text() const +{ + std::string res; + + char* p= text_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool SketchText::text(const std::string& value) +{ + return text_raw(value.c_str()); +} + +inline core::Ptr SketchText::position() const +{ + core::Ptr res = position_raw(); + return res; +} + +inline bool SketchText::position(const core::Ptr& value) +{ + return position_raw(value.get()); +} + +inline std::string SketchText::fontName() const +{ + std::string res; + + char* p= fontName_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool SketchText::fontName(const std::string& value) +{ + return fontName_raw(value.c_str()); +} + +inline double SketchText::angle() const +{ + double res = angle_raw(); + return res; +} + +inline bool SketchText::angle(double value) +{ + return angle_raw(value); +} + +inline TextStyles SketchText::textStyle() const +{ + TextStyles res = textStyle_raw(); + return res; +} + +inline bool SketchText::textStyle(TextStyles value) +{ + return textStyle_raw(value); +} + +inline core::Ptr SketchText::boundaryLines() const +{ + core::Ptr res = boundaryLines_raw(); + return res; +} + +inline std::vector> SketchText::explode() +{ + std::vector> res; + size_t s; + + SketchCurve** p= explode_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline std::vector> SketchText::asCurves() +{ + std::vector> res; + size_t s; + + core::Curve3D** p= asCurves_raw(s); + if(p) + { + res.assign(p, p+s); + core::DeallocateArray(p); + } + return res; +} + +inline bool SketchText::isHorizontalFlip() const +{ + bool res = isHorizontalFlip_raw(); + return res; +} + +inline bool SketchText::isHorizontalFlip(bool value) +{ + return isHorizontalFlip_raw(value); +} + +inline bool SketchText::isVerticalFlip() const +{ + bool res = isVerticalFlip_raw(); + return res; +} + +inline bool SketchText::isVerticalFlip(bool value) +{ + return isVerticalFlip_raw(value); +} + +inline bool SketchText::redefineAsFitOnPath(const core::Ptr& path, bool isAbovePath) +{ + bool res = redefineAsFitOnPath_raw(path.get(), isAbovePath); + return res; +} + +inline bool SketchText::redefineAsAlongPath(const core::Ptr& path, bool isAbovePath, core::HorizontalAlignments horizontalAlignment, double characterSpacing) +{ + bool res = redefineAsAlongPath_raw(path.get(), isAbovePath, horizontalAlignment, characterSpacing); + return res; +} + +inline core::Ptr SketchText::definition() const +{ + core::Ptr res = definition_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHTEXT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchTextDefinition.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchTextDefinition.h new file mode 100644 index 0000000..2ade605 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchTextDefinition.h @@ -0,0 +1,65 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHTEXTDEFINITION_CPP__ +# define ADSK_FUSION_SKETCHTEXTDEFINITION_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHTEXTDEFINITION_API +# endif +#else +# define ADSK_FUSION_SKETCHTEXTDEFINITION_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + +/// The base class for the classes that define how text can be defined. +class SketchTextDefinition : public core::Base { +public: + + ADSK_FUSION_SKETCHTEXTDEFINITION_API static const char* classType(); + ADSK_FUSION_SKETCHTEXTDEFINITION_API const char* objectType() const override; + ADSK_FUSION_SKETCHTEXTDEFINITION_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHTEXTDEFINITION_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual void placeholderSketchTextDefinition0() {} + virtual void placeholderSketchTextDefinition1() {} + virtual void placeholderSketchTextDefinition2() {} + virtual void placeholderSketchTextDefinition3() {} + virtual void placeholderSketchTextDefinition4() {} + virtual void placeholderSketchTextDefinition5() {} + virtual void placeholderSketchTextDefinition6() {} + virtual void placeholderSketchTextDefinition7() {} + virtual void placeholderSketchTextDefinition8() {} + virtual void placeholderSketchTextDefinition9() {} + virtual void placeholderSketchTextDefinition10() {} + virtual void placeholderSketchTextDefinition11() {} + virtual void placeholderSketchTextDefinition12() {} + virtual void placeholderSketchTextDefinition13() {} + virtual void placeholderSketchTextDefinition14() {} + virtual void placeholderSketchTextDefinition15() {} +}; + +// Inline wrappers +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHTEXTDEFINITION_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchTextInput.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchTextInput.h new file mode 100644 index 0000000..3ffffeb --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchTextInput.h @@ -0,0 +1,277 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/CoreTypeDefs.h" +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHTEXTINPUT_CPP__ +# define ADSK_FUSION_SKETCHTEXTINPUT_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHTEXTINPUT_API +# endif +#else +# define ADSK_FUSION_SKETCHTEXTINPUT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchTextDefinition; +}} +namespace adsk { namespace core { + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// The SketchTextInput object is equivalent to the Sketch Text dialog in that it collects all of the input required +/// to create sketch text. Once the properties of the SketchTextInput object have been defined, use the add method +/// to create the sketch text. A SketchTextInput object is created by using the createInput of the SketchTexts object. +class SketchTextInput : public core::Base { +public: + + /// Gets and sets the height of the text in centimeters. + double height() const; + bool height(double value); + + /// Gets and sets the text. + std::string text() const; + bool text(const std::string& value); + + /// Gets and sets the position of the text on the x-y plane of the sketch. The text must lie on the x-y plane so the Z component + /// of the point is ignored and always treated as zero. + core::Ptr position() const; + bool position(const core::Ptr& value); + + /// Gets and sets the name of the font to use. + std::string fontName() const; + bool fontName(const std::string& value); + + /// Gets and sets the angle of the text relative to the x-axis of the x-y plane of the sketch. + double angle() const; + bool angle(double value); + + /// Gets and sets the text style to apply to the entire text. This is a bitwise enum so styles + /// can be combined to apply multiple styles. For example you can apply bold and italic. + TextStyles textStyle() const; + bool textStyle(TextStyles value); + + /// Gets and sets if the text is flipped horizontally. + bool isHorizontalFlip() const; + bool isHorizontalFlip(bool value); + + /// Gets and sets if the text is flipped vertically. + bool isVerticalFlip() const; + bool isVerticalFlip(bool value); + + /// Sets this SketchTextInput to define text that fits along a specified path. Fitting on a path will + /// space the characters so the text fits along the entire length of the path entity. + /// path : The entity that defines the path for the text. This can be a SketchCurve or BRepEdge object. + /// isAbovePath : Indicates if the text should be positioned above or below the path entity. + /// Returns true if the setting the definition was successful. + bool setAsFitOnPath(const core::Ptr& path, bool isAbovePath); + + /// Sets this SketchTextInput to define text that follows along a specified path. + /// path : The entity that defines the path for the text. This can be a SketchCurve or BRepEdge object. + /// isAbovePath : Indicates if the text should be positioned above or below the path entity. + /// horizontalAlignment : Specifies the horizontal alignment of the text with respect to the path curve. + /// characterSpacing : The percentage change in default spacing between characters. + /// Returns true if the setting the definition was successful. + bool setAsAlongPath(const core::Ptr& path, bool isAbovePath, core::HorizontalAlignments horizontalAlignment, double characterSpacing); + + /// Defines the first corner point of the rectangle that will contain the text. + /// cornerPoint : Specifies the location of one of the corner points of the rectangle that will contain the text. + /// This can be a Point3D object, with a Z component of zero, to define any arbitrary location on the X-Y + /// plane of the sketch or it can be an existing SketchPoint that lies on the sketch X-Y plane. + /// diagonalPoint : Specifies the location of the diagonal point of the rectangle that will contain the text. This point + /// cannot be aligned vertically or horizontally to the corner point but be a diagonal point to define + /// a rectangle. This can be a Point3D object, with a Z component of zero, to define any arbitrary location on the X-Y + /// plane of the sketch or it can be an existing SketchPoint that lies on the sketch X-Y plane and the sketch point + /// will become the opposing corner point. + /// horizontalAlignment : Specifies the horizontal alignment of the text with respect to the text rectangle. + /// verticalAlignment : Specifies the vertical alignment of the text with respect to the text rectangle. + /// characterSpacing : The spacing between the characters. This is an additional spacing to apply that is defined + /// as a percentage of the default spacing. A spacing of 0 indicates no additional spacing. + /// A spacing of 50 indicates to use the default plus 50% of the default. + /// Returns true if the setting the definition was successful. + bool setAsMultiLine(const core::Ptr& cornerPoint, const core::Ptr& diagonalPoint, core::HorizontalAlignments horizontalAlignment, core::VerticalAlignments verticalAlignment, double characterSpacing); + + /// Returns the SketchTextDefinition object associated with this input. When the SketchTextInput is first created this + /// property will return null. Once one of the "set" methods have been called, this will return the SketchTextDefinition + /// of the appropriate type and can be used to make any additional changes to the text. + core::Ptr definition() const; + + ADSK_FUSION_SKETCHTEXTINPUT_API static const char* classType(); + ADSK_FUSION_SKETCHTEXTINPUT_API const char* objectType() const override; + ADSK_FUSION_SKETCHTEXTINPUT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHTEXTINPUT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual double height_raw() const = 0; + virtual bool height_raw(double value) = 0; + virtual char* text_raw() const = 0; + virtual bool text_raw(const char * value) = 0; + virtual core::Point3D* position_raw() const = 0; + virtual bool position_raw(core::Point3D* value) = 0; + virtual char* fontName_raw() const = 0; + virtual bool fontName_raw(const char * value) = 0; + virtual double angle_raw() const = 0; + virtual bool angle_raw(double value) = 0; + virtual TextStyles textStyle_raw() const = 0; + virtual bool textStyle_raw(TextStyles value) = 0; + virtual bool isHorizontalFlip_raw() const = 0; + virtual bool isHorizontalFlip_raw(bool value) = 0; + virtual bool isVerticalFlip_raw() const = 0; + virtual bool isVerticalFlip_raw(bool value) = 0; + virtual bool setAsFitOnPath_raw(core::Base* path, bool isAbovePath) = 0; + virtual bool setAsAlongPath_raw(core::Base* path, bool isAbovePath, core::HorizontalAlignments horizontalAlignment, double characterSpacing) = 0; + virtual bool setAsMultiLine_raw(core::Base* cornerPoint, core::Base* diagonalPoint, core::HorizontalAlignments horizontalAlignment, core::VerticalAlignments verticalAlignment, double characterSpacing) = 0; + virtual SketchTextDefinition* definition_raw() const = 0; +}; + +// Inline wrappers + +inline double SketchTextInput::height() const +{ + double res = height_raw(); + return res; +} + +inline bool SketchTextInput::height(double value) +{ + return height_raw(value); +} + +inline std::string SketchTextInput::text() const +{ + std::string res; + + char* p= text_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool SketchTextInput::text(const std::string& value) +{ + return text_raw(value.c_str()); +} + +inline core::Ptr SketchTextInput::position() const +{ + core::Ptr res = position_raw(); + return res; +} + +inline bool SketchTextInput::position(const core::Ptr& value) +{ + return position_raw(value.get()); +} + +inline std::string SketchTextInput::fontName() const +{ + std::string res; + + char* p= fontName_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool SketchTextInput::fontName(const std::string& value) +{ + return fontName_raw(value.c_str()); +} + +inline double SketchTextInput::angle() const +{ + double res = angle_raw(); + return res; +} + +inline bool SketchTextInput::angle(double value) +{ + return angle_raw(value); +} + +inline TextStyles SketchTextInput::textStyle() const +{ + TextStyles res = textStyle_raw(); + return res; +} + +inline bool SketchTextInput::textStyle(TextStyles value) +{ + return textStyle_raw(value); +} + +inline bool SketchTextInput::isHorizontalFlip() const +{ + bool res = isHorizontalFlip_raw(); + return res; +} + +inline bool SketchTextInput::isHorizontalFlip(bool value) +{ + return isHorizontalFlip_raw(value); +} + +inline bool SketchTextInput::isVerticalFlip() const +{ + bool res = isVerticalFlip_raw(); + return res; +} + +inline bool SketchTextInput::isVerticalFlip(bool value) +{ + return isVerticalFlip_raw(value); +} + +inline bool SketchTextInput::setAsFitOnPath(const core::Ptr& path, bool isAbovePath) +{ + bool res = setAsFitOnPath_raw(path.get(), isAbovePath); + return res; +} + +inline bool SketchTextInput::setAsAlongPath(const core::Ptr& path, bool isAbovePath, core::HorizontalAlignments horizontalAlignment, double characterSpacing) +{ + bool res = setAsAlongPath_raw(path.get(), isAbovePath, horizontalAlignment, characterSpacing); + return res; +} + +inline bool SketchTextInput::setAsMultiLine(const core::Ptr& cornerPoint, const core::Ptr& diagonalPoint, core::HorizontalAlignments horizontalAlignment, core::VerticalAlignments verticalAlignment, double characterSpacing) +{ + bool res = setAsMultiLine_raw(cornerPoint.get(), diagonalPoint.get(), horizontalAlignment, verticalAlignment, characterSpacing); + return res; +} + +inline core::Ptr SketchTextInput::definition() const +{ + core::Ptr res = definition_raw(); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHTEXTINPUT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SketchTexts.h b/usr/autodesk/CPP/include/Fusion/Sketch/SketchTexts.h new file mode 100644 index 0000000..2b43b21 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SketchTexts.h @@ -0,0 +1,141 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHTEXTS_CPP__ +# define ADSK_FUSION_SKETCHTEXTS_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHTEXTS_API +# endif +#else +# define ADSK_FUSION_SKETCHTEXTS_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class SketchText; + class SketchTextInput; +}} +namespace adsk { namespace core { + class Point3D; +}} + +namespace adsk { namespace fusion { + +/// The collection of text blocks in a sketch. This provides access to the existing +/// text blocks and supports creating new text blocks. +class SketchTexts : public core::Base { +public: + + /// Function that returns the specified sketch text using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the number of texts in the sketch. + size_t count() const; + + /// Creates a SketchTextInput object that can be used to define additional settings when creating sketch text. The + /// SketchTextInput object is equivalent to the Sketch Text dialog in that it collects all of the input required + /// to create sketch text. Once the properties of the SketchTextInput object have been defined, use the add method + /// to create the sketch text. + /// formattedText : The text used for the sketch text. This is a simple string as no additional formatting is currently supported. + /// height : The height of the text in centimeters. + /// position : The position of the text on the x-y plane of the sketch. The text must lie on the x-y plane so the Z component + /// of the point is ignored and always treated as zero. + /// Returns a SketchTextInput object that can be used to set additional formatting and is used as input to the add method. + core::Ptr createInput(const std::string& formattedText, double height, const core::Ptr& position); + + /// Creates a sketch text. + /// input : A SketchTextInput object created using the SketchTexts.createInput method. + /// Returns the newly created SketchText object or null in the case of failure. + core::Ptr add(const core::Ptr& input); + + /// Creates a SketchTextInput object that is used to define the additional input to create text. The SketchTextInput + /// object is equivalent to the Sketch Text dialog in that it collects all of the input required to create sketch text. + /// You must call setAsFitOnPath, setAsAlongPath, or setAsMultiLine methods to define one of the three types of text and + /// can use other and define any + /// setAs Once the properties of the SketchTextInput object have been defined, use the add method + /// to create the sketch text. + /// formattedText : The text used for the sketch text. This is a simple string as no additional formatting is currently supported. + /// height : The height of the text in centimeters. + /// Returns a SketchTextInput object that can be used to set additional formatting and is used as input to the add method. + core::Ptr createInput2(const std::string& formattedText, double height); + + typedef SketchText iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHTEXTS_API static const char* classType(); + ADSK_FUSION_SKETCHTEXTS_API const char* objectType() const override; + ADSK_FUSION_SKETCHTEXTS_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHTEXTS_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchText* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual SketchTextInput* createInput_raw(const char * formattedText, double height, core::Point3D* position) = 0; + virtual SketchText* add_raw(SketchTextInput* input) = 0; + virtual SketchTextInput* createInput2_raw(const char * formattedText, double height) = 0; +}; + +// Inline wrappers + +inline core::Ptr SketchTexts::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t SketchTexts::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr SketchTexts::createInput(const std::string& formattedText, double height, const core::Ptr& position) +{ + core::Ptr res = createInput_raw(formattedText.c_str(), height, position.get()); + return res; +} + +inline core::Ptr SketchTexts::add(const core::Ptr& input) +{ + core::Ptr res = add_raw(input.get()); + return res; +} + +inline core::Ptr SketchTexts::createInput2(const std::string& formattedText, double height) +{ + core::Ptr res = createInput2_raw(formattedText.c_str(), height); + return res; +} + +template inline void SketchTexts::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHTEXTS_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/Sketches.h b/usr/autodesk/CPP/include/Fusion/Sketch/Sketches.h new file mode 100644 index 0000000..bd9c982 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/Sketches.h @@ -0,0 +1,154 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SKETCHES_CPP__ +# define ADSK_FUSION_SKETCHES_API XI_EXPORT +# else +# define ADSK_FUSION_SKETCHES_API +# endif +#else +# define ADSK_FUSION_SKETCHES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class Sketch; +}} + +namespace adsk { namespace fusion { + +/// Provides access to the sketches within a design and provides +/// methods to create new sketches. +class Sketches : public core::Base { +public: + + /// Function that returns the specified sketch using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the + /// collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// Returns the sketch with the specified name. + /// name : The name of the sketch as seen in the browser and the timeline. + /// Returns the sketch or null if there isn't a sketch with that name. + core::Ptr itemByName(const std::string& name) const; + + /// Returns the number of sketches in a component + size_t count() const; + + /// Creates a new sketch on the specified planar entity. + /// planarEntity : A construction plane or planar face that defines the sketch plane + /// occurrenceForCreation : A creation occurrence is needed if the planarEntity is in another component AND the + /// sketch is not in the root component. The occurrenceForCreation is analogous + /// to the active occurrence in the UI. + /// Returns the newly created Sketch or null if the creation failed. + core::Ptr add(const core::Ptr& planarEntity, const core::Ptr& occurrenceForCreation = NULL); + + /// Creates a parametric sketch that is associated with a base feature. + /// Because of a current limitation, if you want to create a sketch associated with a base + /// feature, you must first call the edit method of the base feature, use this method to + /// create the sketch, and then call the finishEdit method of the base feature. The base + /// feature must be in an "edit" state to be able to add any additional items to it. + /// planarEntity : A construction plane or planar face that defines the sketch plane. + /// targetBaseOrFormFeature : The existing base feature that you want to associate this sketch with. + /// includeFaceEdges : When a BrepFace is used as the planarEntity argument, this defines if the edges of the face + /// should be included in the sketch. + /// Returns the newly created Sketch or null if the creation failed. + core::Ptr addToBaseOrFormFeature(const core::Ptr& planarEntity, const core::Ptr& targetBaseOrFormFeature, bool includeFaceEdges); + + /// Creates a new sketch on the specified planar entity. If a BRepFace is provided, the edges of the face + /// are not projected into the sketch so the result of creating a new sketch with this method will + /// always be a new empty sketch. + /// planarEntity : A construction plane or planar face that defines the sketch plane. + /// occurrenceForCreation : A creation occurrence is needed if the planarEntity is in another component AND the + /// sketch is not in the root component. The occurrenceForCreation is analogous + /// to the active occurrence in the UI. + /// Returns the newly created Sketch or null if the creation failed. + core::Ptr addWithoutEdges(const core::Ptr& planarEntity, const core::Ptr& occurrenceForCreation = NULL); + + typedef Sketch iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_SKETCHES_API static const char* classType(); + ADSK_FUSION_SKETCHES_API const char* objectType() const override; + ADSK_FUSION_SKETCHES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SKETCHES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual Sketch* item_raw(size_t index) const = 0; + virtual Sketch* itemByName_raw(const char * name) const = 0; + virtual size_t count_raw() const = 0; + virtual Sketch* add_raw(core::Base* planarEntity, Occurrence* occurrenceForCreation) = 0; + virtual Sketch* addToBaseOrFormFeature_raw(core::Base* planarEntity, core::Base* targetBaseOrFormFeature, bool includeFaceEdges) = 0; + virtual Sketch* addWithoutEdges_raw(core::Base* planarEntity, Occurrence* occurrenceForCreation) = 0; +}; + +// Inline wrappers + +inline core::Ptr Sketches::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline core::Ptr Sketches::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline size_t Sketches::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr Sketches::add(const core::Ptr& planarEntity, const core::Ptr& occurrenceForCreation) +{ + core::Ptr res = add_raw(planarEntity.get(), occurrenceForCreation.get()); + return res; +} + +inline core::Ptr Sketches::addToBaseOrFormFeature(const core::Ptr& planarEntity, const core::Ptr& targetBaseOrFormFeature, bool includeFaceEdges) +{ + core::Ptr res = addToBaseOrFormFeature_raw(planarEntity.get(), targetBaseOrFormFeature.get(), includeFaceEdges); + return res; +} + +inline core::Ptr Sketches::addWithoutEdges(const core::Ptr& planarEntity, const core::Ptr& occurrenceForCreation) +{ + core::Ptr res = addWithoutEdges_raw(planarEntity.get(), occurrenceForCreation.get()); + return res; +} + +template inline void Sketches::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SKETCHES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SmoothConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/SmoothConstraint.h new file mode 100644 index 0000000..72311cd --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SmoothConstraint.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SMOOTHCONSTRAINT_CPP__ +# define ADSK_FUSION_SMOOTHCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_SMOOTHCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_SMOOTHCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchCurve; +}} + +namespace adsk { namespace fusion { + +/// A smooth constraint in a sketch. +class SmoothConstraint : public GeometricConstraint { +public: + + /// Returns the first curve. + core::Ptr curveOne() const; + + /// Returns the second curve. + core::Ptr curveTwo() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SMOOTHCONSTRAINT_API static const char* classType(); + ADSK_FUSION_SMOOTHCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_SMOOTHCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SMOOTHCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchCurve* curveOne_raw() const = 0; + virtual SketchCurve* curveTwo_raw() const = 0; + virtual SmoothConstraint* nativeObject_raw() const = 0; + virtual SmoothConstraint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SmoothConstraint::curveOne() const +{ + core::Ptr res = curveOne_raw(); + return res; +} + +inline core::Ptr SmoothConstraint::curveTwo() const +{ + core::Ptr res = curveTwo_raw(); + return res; +} + +inline core::Ptr SmoothConstraint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SmoothConstraint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SMOOTHCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/SymmetryConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/SymmetryConstraint.h new file mode 100644 index 0000000..e9944e4 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/SymmetryConstraint.h @@ -0,0 +1,111 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_SYMMETRYCONSTRAINT_CPP__ +# define ADSK_FUSION_SYMMETRYCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_SYMMETRYCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_SYMMETRYCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchEntity; + class SketchLine; +}} + +namespace adsk { namespace fusion { + +/// A symmetry constraint in a sketch. +class SymmetryConstraint : public GeometricConstraint { +public: + + /// Returns the first curve. + core::Ptr entityOne() const; + + /// Returns the second curve. + core::Ptr entityTwo() const; + + /// Returns the axis (SketchLine) that defines the symmetry. + core::Ptr symmetryLine() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_SYMMETRYCONSTRAINT_API static const char* classType(); + ADSK_FUSION_SYMMETRYCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_SYMMETRYCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_SYMMETRYCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchEntity* entityOne_raw() const = 0; + virtual SketchEntity* entityTwo_raw() const = 0; + virtual SketchLine* symmetryLine_raw() const = 0; + virtual SymmetryConstraint* nativeObject_raw() const = 0; + virtual SymmetryConstraint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr SymmetryConstraint::entityOne() const +{ + core::Ptr res = entityOne_raw(); + return res; +} + +inline core::Ptr SymmetryConstraint::entityTwo() const +{ + core::Ptr res = entityTwo_raw(); + return res; +} + +inline core::Ptr SymmetryConstraint::symmetryLine() const +{ + core::Ptr res = symmetryLine_raw(); + return res; +} + +inline core::Ptr SymmetryConstraint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr SymmetryConstraint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_SYMMETRYCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/TangentConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/TangentConstraint.h new file mode 100644 index 0000000..e4a1a33 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/TangentConstraint.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TANGENTCONSTRAINT_CPP__ +# define ADSK_FUSION_TANGENTCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_TANGENTCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_TANGENTCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchCurve; +}} + +namespace adsk { namespace fusion { + +/// A tangent constraint in a sketch. +class TangentConstraint : public GeometricConstraint { +public: + + /// Returns the first curve. + core::Ptr curveOne() const; + + /// Returns the second curve. + core::Ptr curveTwo() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_TANGENTCONSTRAINT_API static const char* classType(); + ADSK_FUSION_TANGENTCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_TANGENTCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TANGENTCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchCurve* curveOne_raw() const = 0; + virtual SketchCurve* curveTwo_raw() const = 0; + virtual TangentConstraint* nativeObject_raw() const = 0; + virtual TangentConstraint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr TangentConstraint::curveOne() const +{ + core::Ptr res = curveOne_raw(); + return res; +} + +inline core::Ptr TangentConstraint::curveTwo() const +{ + core::Ptr res = curveTwo_raw(); + return res; +} + +inline core::Ptr TangentConstraint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr TangentConstraint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TANGENTCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/VerticalConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/VerticalConstraint.h new file mode 100644 index 0000000..234b451 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/VerticalConstraint.h @@ -0,0 +1,90 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_VERTICALCONSTRAINT_CPP__ +# define ADSK_FUSION_VERTICALCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_VERTICALCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_VERTICALCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchLine; +}} + +namespace adsk { namespace fusion { + +/// A vertical constraint in a sketch. +class VerticalConstraint : public GeometricConstraint { +public: + + /// Returns the line being constrained. + core::Ptr line() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_VERTICALCONSTRAINT_API static const char* classType(); + ADSK_FUSION_VERTICALCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_VERTICALCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_VERTICALCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchLine* line_raw() const = 0; + virtual VerticalConstraint* nativeObject_raw() const = 0; + virtual VerticalConstraint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr VerticalConstraint::line() const +{ + core::Ptr res = line_raw(); + return res; +} + +inline core::Ptr VerticalConstraint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr VerticalConstraint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_VERTICALCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/Sketch/VerticalPointsConstraint.h b/usr/autodesk/CPP/include/Fusion/Sketch/VerticalPointsConstraint.h new file mode 100644 index 0000000..a5707f6 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/Sketch/VerticalPointsConstraint.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "GeometricConstraint.h" + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_VERTICALPOINTSCONSTRAINT_CPP__ +# define ADSK_FUSION_VERTICALPOINTSCONSTRAINT_API XI_EXPORT +# else +# define ADSK_FUSION_VERTICALPOINTSCONSTRAINT_API +# endif +#else +# define ADSK_FUSION_VERTICALPOINTSCONSTRAINT_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class Occurrence; + class SketchPoint; +}} + +namespace adsk { namespace fusion { + +/// A vertical constraint between two points in a sketch. +class VerticalPointsConstraint : public GeometricConstraint { +public: + + /// Returns the first point. + core::Ptr pointOne() const; + + /// Returns the second point. + core::Ptr pointTwo() const; + + /// The NativeObject is the object outside the context of an assembly and + /// in the context of it's parent component. + /// Returns null in the case where this object is not in the context of + /// an assembly but is already the native object. + core::Ptr nativeObject() const; + + /// Creates or returns a proxy for the native object + /// - i.e. a new object that represents this object but adds the assembly context + /// defined by the input occurrence. + /// occurrence : The occurrence that defines the context to create the proxy in. + /// Returns the proxy object or null if this isn't the NativeObject. + core::Ptr createForAssemblyContext(const core::Ptr& occurrence) const; + + ADSK_FUSION_VERTICALPOINTSCONSTRAINT_API static const char* classType(); + ADSK_FUSION_VERTICALPOINTSCONSTRAINT_API const char* objectType() const override; + ADSK_FUSION_VERTICALPOINTSCONSTRAINT_API void* queryInterface(const char* id) const override; + ADSK_FUSION_VERTICALPOINTSCONSTRAINT_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual SketchPoint* pointOne_raw() const = 0; + virtual SketchPoint* pointTwo_raw() const = 0; + virtual VerticalPointsConstraint* nativeObject_raw() const = 0; + virtual VerticalPointsConstraint* createForAssemblyContext_raw(Occurrence* occurrence) const = 0; +}; + +// Inline wrappers + +inline core::Ptr VerticalPointsConstraint::pointOne() const +{ + core::Ptr res = pointOne_raw(); + return res; +} + +inline core::Ptr VerticalPointsConstraint::pointTwo() const +{ + core::Ptr res = pointTwo_raw(); + return res; +} + +inline core::Ptr VerticalPointsConstraint::nativeObject() const +{ + core::Ptr res = nativeObject_raw(); + return res; +} + +inline core::Ptr VerticalPointsConstraint::createForAssemblyContext(const core::Ptr& occurrence) const +{ + core::Ptr res = createForAssemblyContext_raw(occurrence.get()); + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_VERTICALPOINTSCONSTRAINT_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/TSpline/TSplineBodies.h b/usr/autodesk/CPP/include/Fusion/TSpline/TSplineBodies.h new file mode 100644 index 0000000..d229795 --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/TSpline/TSplineBodies.h @@ -0,0 +1,125 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TSPLINEBODIES_CPP__ +# define ADSK_FUSION_TSPLINEBODIES_API XI_EXPORT +# else +# define ADSK_FUSION_TSPLINEBODIES_API +# endif +#else +# define ADSK_FUSION_TSPLINEBODIES_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class TSplineBody; +}} + +namespace adsk { namespace fusion { + +/// A collection of TSpline bodies. +class TSplineBodies : public core::Base { +public: + + /// Function that returns the specified T-Spline body using an index into the collection. + /// index : The index of the item within the collection to return. The first item in the collection has an index of 0. + /// Returns the specified item or null if an invalid index was specified. + core::Ptr item(size_t index) const; + + /// The number of bodies in the collection. + size_t count() const; + + /// Returns a TSplineBody by specifying the name of the body as seen in the browser. + /// name : The name of the body, as seen in the browser. This is case sensitive. + /// Returns the specified item or null if a body with that name was not found. + core::Ptr itemByName(const std::string& name) const; + + /// Creates a new TSplineBody by reading in a TSM file from disk. + /// tsmFilename : The full filename of the TSM file on disk. + /// Returns the newly created TSplineBody if successful or null in the case of failure. + core::Ptr addByTSMFile(const std::string& tsmFilename); + + /// Creates a new TSplineBody using the T-Spline description provided by the input + /// string which contains TSM formatted text. + /// tsmDescription : A string that contains a T-Spline description in TSM form. + /// Returns the newly created TSplineBody if successful or null in the case of failure. + core::Ptr addByTSMDescription(const std::string& tsmDescription); + + typedef TSplineBody iterable_type; + template void copyTo(OutputIterator result); + + ADSK_FUSION_TSPLINEBODIES_API static const char* classType(); + ADSK_FUSION_TSPLINEBODIES_API const char* objectType() const override; + ADSK_FUSION_TSPLINEBODIES_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TSPLINEBODIES_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual TSplineBody* item_raw(size_t index) const = 0; + virtual size_t count_raw() const = 0; + virtual TSplineBody* itemByName_raw(const char * name) const = 0; + virtual TSplineBody* addByTSMFile_raw(const char * tsmFilename) = 0; + virtual TSplineBody* addByTSMDescription_raw(const char * tsmDescription) = 0; +}; + +// Inline wrappers + +inline core::Ptr TSplineBodies::item(size_t index) const +{ + core::Ptr res = item_raw(index); + return res; +} + +inline size_t TSplineBodies::count() const +{ + size_t res = count_raw(); + return res; +} + +inline core::Ptr TSplineBodies::itemByName(const std::string& name) const +{ + core::Ptr res = itemByName_raw(name.c_str()); + return res; +} + +inline core::Ptr TSplineBodies::addByTSMFile(const std::string& tsmFilename) +{ + core::Ptr res = addByTSMFile_raw(tsmFilename.c_str()); + return res; +} + +inline core::Ptr TSplineBodies::addByTSMDescription(const std::string& tsmDescription) +{ + core::Ptr res = addByTSMDescription_raw(tsmDescription.c_str()); + return res; +} + +template inline void TSplineBodies::copyTo(OutputIterator result) +{ + for (size_t i = 0;i < count();++i) + { + *result = item(i); + ++result; + } +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TSPLINEBODIES_API \ No newline at end of file diff --git a/usr/autodesk/CPP/include/Fusion/TSpline/TSplineBody.h b/usr/autodesk/CPP/include/Fusion/TSpline/TSplineBody.h new file mode 100644 index 0000000..cb2667d --- /dev/null +++ b/usr/autodesk/CPP/include/Fusion/TSpline/TSplineBody.h @@ -0,0 +1,144 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2016 Autodesk, Inc. All rights reserved. +// +// Use of this software is subject to the terms of the Autodesk license +// agreement provided at the time of installation or download, or which +// otherwise accompanies this software. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once +#include "../../Core/Base.h" +#include "../FusionTypeDefs.h" +#include + +// THIS CLASS WILL BE VISIBLE TO AN API CLIENT. +// THIS HEADER FILE WILL BE GENERATED FROM NIDL. +#include "../../Core/OSMacros.h" + +#ifdef FUSIONXINTERFACE_EXPORTS +# ifdef __COMPILING_ADSK_FUSION_TSPLINEBODY_CPP__ +# define ADSK_FUSION_TSPLINEBODY_API XI_EXPORT +# else +# define ADSK_FUSION_TSPLINEBODY_API +# endif +#else +# define ADSK_FUSION_TSPLINEBODY_API XI_IMPORT +#endif + +namespace adsk { namespace fusion { + class FormFeature; +}} + +namespace adsk { namespace fusion { + +/// A TSpline body. +class TSplineBody : public core::Base { +public: + + /// Gets and sets the name of the body. If setting this property, there is the side-effect + /// that the B-Rep body created from this T-Spline body is also renamed. + std::string name() const; + bool name(const std::string& value); + + /// Returns the T-Spline body as a string in the form of a TSM description. + /// Returns the string formatted using the TSM format. + std::string getTSMDescription() const; + + /// Saves the body as a TSM file. + /// filename : The full filename of the file to save the body to. If the file already exists, + /// it will be overwritten. + /// Returns true if the file was successfully created. + bool saveAsTSMFile(const std::string& filename) const; + + /// Returns the owning form feature. + core::Ptr parentFormFeature() const; + + /// Returns a token for the TSplineBody object. This can be saved and used at a later + /// time with the Design.findEntityByToken method to get back the same T-Spline body. + /// When using entity tokens it's important to understand that the token string returned for a + /// specific entity can be different over time. However, even if you have two different token + /// strings that were obtained from the same entity, when you use findEntityByToken they + /// will both return the same entity. Because of that you should never compare entity tokens + /// as way to determine what the token represents. Instead, you need to use the findEntityByToken + /// method to get the two entities identified by the tokens and then compare them. + std::string entityToken() const; + + ADSK_FUSION_TSPLINEBODY_API static const char* classType(); + ADSK_FUSION_TSPLINEBODY_API const char* objectType() const override; + ADSK_FUSION_TSPLINEBODY_API void* queryInterface(const char* id) const override; + ADSK_FUSION_TSPLINEBODY_API static const char* interfaceId() { return classType(); } + +private: + + // Raw interface + virtual char* name_raw() const = 0; + virtual bool name_raw(const char * value) = 0; + virtual char* getTSMDescription_raw() const = 0; + virtual bool saveAsTSMFile_raw(const char * filename) const = 0; + virtual FormFeature* parentFormFeature_raw() const = 0; + virtual char* entityToken_raw() const = 0; +}; + +// Inline wrappers + +inline std::string TSplineBody::name() const +{ + std::string res; + + char* p= name_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool TSplineBody::name(const std::string& value) +{ + return name_raw(value.c_str()); +} + +inline std::string TSplineBody::getTSMDescription() const +{ + std::string res; + + char* p= getTSMDescription_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} + +inline bool TSplineBody::saveAsTSMFile(const std::string& filename) const +{ + bool res = saveAsTSMFile_raw(filename.c_str()); + return res; +} + +inline core::Ptr TSplineBody::parentFormFeature() const +{ + core::Ptr res = parentFormFeature_raw(); + return res; +} + +inline std::string TSplineBody::entityToken() const +{ + std::string res; + + char* p= entityToken_raw(); + if (p) + { + res = p; + core::DeallocateArray(p); + } + return res; +} +}// namespace fusion +}// namespace adsk + +#undef ADSK_FUSION_TSPLINEBODY_API \ No newline at end of file diff --git a/usr/autodesk/CPP/lib/cam.lib b/usr/autodesk/CPP/lib/cam.lib new file mode 100644 index 0000000000000000000000000000000000000000..f6bf8470d3a0d7df78eb7b1468b7e4488b4ab672 GIT binary patch literal 77744 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 literal 0 HcmV?d00001 diff --git a/usr/autodesk/CPP/lib/core.lib b/usr/autodesk/CPP/lib/core.lib new file mode 100644 index 0000000000000000000000000000000000000000..05a3b1442271e62a4174a8feb50fa7f57951dcd4 GIT binary patch literal 416770 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 a9|-G6$=_RZC*S&B`Sw>+O*$^~srCPTh%|)& literal 0 HcmV?d00001