Wood Routing Workflow Sample
Description
This script demonstrates routing wood panels.When running the sample, it assumes you have an open design containing one or more "panels" oriented flat in the X-Y plane. The script creates a setup and a 2D contour operation with tabs to route the panels from a standard sheet.
Code Samples
#include <Core/CoreAll.h> #include <Fusion/FusionAll.h> #include <Cam/CamAll.h> using namespace adsk::core; using namespace adsk::fusion; using namespace adsk::cam; // Assumes a model is loaded in Fusion, eg a couple of flat panels extern "C" XI_EXPORT bool run(const char* context) { Ptr<Application> app = Application::get(); Ptr<UserInterface> ui = app->userInterface(); // use existing doc: Ptr<Document> doc = app->activeDocument(); // switch to manufacturing space Ptr<Workspace> camWS = ui->workspaces()->itemById("CAMEnvironment"); camWS->activate(); // get the CAM product Ptr<Products> products = doc->products(); /* * Search a tool in our tool library */ // get the tool libraries from the library manager Ptr<CAMManager> camManager = CAMManager::get(); Ptr<CAMLibraryManager> libraryManager = camManager->libraryManager(); Ptr<ToolLibraries> toolLibraries = libraryManager->toolLibraries(); // we can use a library URl directly if we know its address (using Fusion metric sample lib) Ptr<URL> toolLibraryUrl = URL::create("systemlibraryroot://Samples/Milling Tools (Metric).json"); // load tool library Ptr<ToolLibrary> toolLibrary = toolLibraries->toolLibraryAtURL(toolLibraryUrl); if (!toolLibrary) { ui->messageBox("Failed to load tool library"); return false; } Ptr<Tool> MyTool = nullptr; // search an end mill for the contour operation for (Ptr<Tool>& tool : toolLibrary) { // read the tool type Ptr<ChoiceParameterValue> toolTypeParameter = tool->parameters()->itemByName("tool_type")->value(); std::string toolType = toolTypeParameter->value(); // compare toolType and filter on "flat end mill" if (toolType == "flat end mill" && !MyTool) { // search for tool diameter larger or equal to 10mm but less than 12mm Ptr<FloatParameterValue> diameterParameter = tool->parameters()->itemByName("tool_diameter")->value(); double diameter = diameterParameter->value(); if (diameter >= 1.0 && diameter < 1.2) { MyTool = tool; break; } } } if (!MyTool) { ui->messageBox("No flat end mill tool found"); return false; } /* * create setup */ Ptr<CAM> cam = products->itemByProductType("CAMProductType"); Ptr<Setups> setups = cam->setups(); Ptr<SetupInput> setupInput = setups->createInput(OperationTypes::MillingOperation); // create a list for the models to add to the setup Input std::vector<Ptr<Base>> models; // loop across all bRep bodies and add them all to our model list int countParts = cam->designRootOccurrence()->bRepBodies()->count(); int i = 0; while (i < countParts) { Ptr<BRepBody> part = cam->designRootOccurrence()->bRepBodies()->item(i); models.push_back(part); i = i + 1; } // pass the model list to the setup input setupInput->models(models); // create the setup Ptr<Setup> setup = setups->add(setupInput); // change some properties of the setup & stock setup->name("CAM Woodworking Script Sample"); setup->stockMode(SetupStockModes::FixedBoxStock); // set setup origin in the corner Ptr<ChoiceParameterValue> wcs_origin_boxPoint = setup->parameters()->itemByName("wcs_origin_boxPoint")->value(); wcs_origin_boxPoint->value("top 1"); // set stock size XYZ setup->parameters()->itemByName("job_stockFixedX")->expression("2440 mm"); setup->parameters()->itemByName("job_stockFixedY")->expression("1220 mm"); setup->parameters()->itemByName("job_stockFixedZ")->expression("18 mm"); /* * 2D contour operation */ // set operation properties Ptr<OperationInput> input = setup->operations()->createInput("contour2d"); input->tool(MyTool); input->displayName("2D Contour"); input->parameters()->itemByName("tolerance")->expression("0.1 mm"); // add tabs // activate tabs group to enable tabs and be able to modify its parameters input->parameters()->itemByName("group_tabs")->expression("true"); input->parameters()->itemByName("tabWidth")->expression("18 mm"); input->parameters()->itemByName("tabHeight")->expression("18 mm"); input->parameters()->itemByName("tabDistance")->expression("100 mm"); // add the operation to the setup Ptr<Operation> contourOp = setup->operations()->add(input); // add silhouette to contour selection for 2D contour operation // requires the operation to exist Ptr<CadContours2dParameterValue> cadcontours2dParam = contourOp->parameters()->itemByName("contours")->value(); Ptr<CurveSelections> chains = cadcontours2dParam->getCurveSelections(); // calculate and add a new silhouette curve to the geometry selection list chains->createNewSilhouetteSelection(); cadcontours2dParam->applyCurveSelections(chains); // calculate operation cam->generateToolpath(contourOp); /* * post process */ // copy-paste from basic milling sample return true; }