void CmdTechDrawNewView::activated(int iMsg) { Q_UNUSED(iMsg); TechDraw::DrawPage* page = DrawGuiUtil::findPage(this); if (!page) { return; } std::vector<App::DocumentObject*> shapes = getSelection().getObjectsOfType(Part::Feature::getClassTypeId()); if (shapes.empty()) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), QObject::tr("Select at least 1 Part object.")); return; } std::string PageName = page->getNameInDocument(); Gui::WaitCursor wc; const auto selectedProjections( getSelection().getObjectsOfType(TechDraw::DrawView::getClassTypeId()) ); float newScale = 1.0; float newRotation = 0.0; Base::Vector3d newDirection(0.0, 0.0, 1.0); if (!selectedProjections.empty()) { const auto myView( static_cast<TechDraw::DrawView*>(selectedProjections.front()) ); newScale = myView->Scale.getValue(); newRotation = myView->Rotation.getValue(); // The "Direction" property does not belong to TechDraw::DrawView, but to one of the // many child classes that are projecting objects into the drawing. Therefore, we get the // property by name. const App::PropertyVector* const propDirection = dynamic_cast<App::PropertyVector*>(myView->getPropertyByName("Direction")); if (propDirection) { newDirection = propDirection->getValue(); } } openCommand("Create view"); for (std::vector<App::DocumentObject*>::iterator it = shapes.begin(); it != shapes.end(); ++it) { std::string FeatName = getUniqueObjectName("View"); doCommand(Doc,"App.activeDocument().addObject('TechDraw::DrawViewPart','%s')",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.Source = App.activeDocument().%s",FeatName.c_str(),(*it)->getNameInDocument()); doCommand(Doc,"App.activeDocument().%s.Direction = (%e,%e,%e)",FeatName.c_str(), newDirection.x, newDirection.y, newDirection.z); doCommand(Doc,"App.activeDocument().%s.Scale = %e",FeatName.c_str(), newScale); doCommand(Doc,"App.activeDocument().%s.Rotation = %e",FeatName.c_str(), newRotation); doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)",PageName.c_str(),FeatName.c_str()); } updateActive(); commitCommand(); }
void CmdTechDrawLinkDimension::activated(int iMsg) { Q_UNUSED(iMsg); TechDraw::DrawPage* page = DrawGuiUtil::findPage(this); if (!page) { return; } std::string PageName = page->getNameInDocument(); bool result = _checkSelection(this,2); if (!result) return; std::vector<Gui::SelectionObject> selection = getSelection().getSelectionEx(); App::DocumentObject* obj3D = 0; std::vector<App::DocumentObject*> parts; std::vector<std::string> subs; std::vector<Gui::SelectionObject>::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { if ((*itSel).getObject()->isDerivedFrom(Part::Feature::getClassTypeId())) { obj3D = ((*itSel).getObject()); std::vector<std::string> subList = (*itSel).getSubNames(); for (auto& s:subList) { parts.push_back(obj3D); subs.push_back(s); } } } if (!obj3D) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("There is no 3D object in your selection")); return; } if (subs.empty()) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("There are no 3D Edges or Vertices in your selection")); return; } // dialog to select the Dimension to link Gui::Control().showDialog(new TaskDlgLinkDim(parts,subs,page)); page->getDocument()->recompute(); //still need to recompute in Gui. why? }
void CmdTechDrawAnnotation::activated(int iMsg) { Q_UNUSED(iMsg); TechDraw::DrawPage* page = _findPage(this); if (!page) { return; } std::string PageName = page->getNameInDocument(); std::string FeatName = getUniqueObjectName("Annotation"); openCommand("Create Annotation"); doCommand(Doc,"App.activeDocument().addObject('TechDraw::DrawViewAnnotation','%s')",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)",PageName.c_str(),FeatName.c_str()); updateActive(); commitCommand(); }
void CmdTechDrawNewViewSection::activated(int iMsg) { Q_UNUSED(iMsg); //TODO: should just use BaseView's page TechDraw::DrawPage* page = _findPage(this); if (!page) { return; } //std::vector<App::DocumentObject*> shapes = getSelection().getObjectsOfType(Part::Feature::getClassTypeId()); std::vector<App::DocumentObject*> shapes = getSelection().getObjectsOfType(TechDraw::DrawViewPart::getClassTypeId()); if (shapes.empty()) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), QObject::tr("Select at least 1 DrawingView object.")); return; } App::DocumentObject* dObj = *(shapes.begin()); TechDraw::DrawViewPart* dvp = static_cast<TechDraw::DrawViewPart*>(dObj); if (dvp->getSectionRef()) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), QObject::tr("This View already has a related Section. Choose another.")); return; } std::string PageName = page->getNameInDocument(); Gui::WaitCursor wc; openCommand("Create view"); std::string FeatName = getUniqueObjectName("Section"); std::string SourceName = dvp->Source.getValue()->getNameInDocument(); doCommand(Doc,"App.activeDocument().addObject('TechDraw::DrawViewSection','%s')",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.Source = App.activeDocument().%s",FeatName.c_str(),SourceName.c_str()); doCommand(Doc,"App.activeDocument().%s.BaseView = App.activeDocument().%s",FeatName.c_str(),(dObj)->getNameInDocument()); doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)",PageName.c_str(),FeatName.c_str()); App::DocumentObject *docObj = getDocument()->getObject(FeatName.c_str()); TechDraw::DrawViewSection* dsv = dynamic_cast<TechDraw::DrawViewSection *>(docObj); if (!dsv) { throw Base::Exception("CmdTechDrawNewViewSection DSV not found\n"); } Gui::Control().showDialog(new TaskDlgSectionView(dvp,dsv)); updateActive(); commitCommand(); }
void CmdTechDrawProjGroup::activated(int iMsg) { Q_UNUSED(iMsg); TechDraw::DrawPage* page = _findPage(this); if (!page) { return; } std::vector<App::DocumentObject*> shapes = getSelection().getObjectsOfType(Part::Feature::getClassTypeId()); if (shapes.size() != 1) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), QObject::tr("Select exactly 1 Part object.")); return; } std::string PageName = page->getNameInDocument(); Gui::WaitCursor wc; openCommand("Create Projection Group"); std::string multiViewName = getUniqueObjectName("cView"); std::string SourceName = (*shapes.begin())->getNameInDocument(); doCommand(Doc,"App.activeDocument().addObject('TechDraw::DrawProjGroup','%s')",multiViewName.c_str()); doCommand(Doc,"App.activeDocument().%s.Source = App.activeDocument().%s",multiViewName.c_str(),SourceName.c_str()); App::DocumentObject *docObj = getDocument()->getObject(multiViewName.c_str()); auto multiView( static_cast<TechDraw::DrawProjGroup *>(docObj) ); // set the anchor std::string anchor = "Front"; doCommand(Doc,"App.activeDocument().%s.addProjection('%s')",multiViewName.c_str(),anchor.c_str()); doCommand(Doc,"App.activeDocument().%s.Anchor = App.activeDocument().%s.getItemByLabel('%s')", multiViewName.c_str(),multiViewName.c_str(),anchor.c_str()); // add the multiView to the page doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)",PageName.c_str(),multiViewName.c_str()); // create the rest of the desired views Gui::Control().showDialog(new TaskDlgProjGroup(multiView,true)); // // add the multiView to the page // doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)",PageName.c_str(),multiViewName.c_str()); updateActive(); commitCommand(); }
void CmdTechDrawClip::activated(int iMsg) { Q_UNUSED(iMsg); TechDraw::DrawPage* page = _findPage(this); if (!page) { return; } std::string PageName = page->getNameInDocument(); std::string FeatName = getUniqueObjectName("Clip"); openCommand("Create Clip"); doCommand(Doc,"App.activeDocument().addObject('TechDraw::DrawViewClip','%s')",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.ShowFrame = True",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.Height = 30.0",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.Width = 30.0",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.ShowLabels = False",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)",PageName.c_str(),FeatName.c_str()); updateActive(); commitCommand(); }
void CmdTechDrawToggleFrame::activated(int iMsg) { TechDraw::DrawPage* page = _findPageCD(this); if (!page) { return; } std::string PageName = page->getNameInDocument(); Gui::Document* activeGui = Gui::Application::Instance->getDocument(page->getDocument()); Gui::ViewProvider* vp = activeGui->getViewProvider(page); ViewProviderPage* dvp = dynamic_cast<ViewProviderPage*>(vp); if (dvp && dvp->getMDIViewPage()) { dvp->getMDIViewPage()->setFrameState(!dvp->getMDIViewPage()->getFrameState()); } else { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No TechDraw Page"), QObject::tr("Need a TechDraw Page for this command")); return; } }
void CmdTechDrawExportPage::activated(int iMsg) { Q_UNUSED(iMsg); TechDraw::DrawPage* page = _findPage(this); if (!page) { return; } std::string PageName = page->getNameInDocument(); Gui::Document* activeGui = Gui::Application::Instance->getDocument(page->getDocument()); Gui::ViewProvider* vp = activeGui->getViewProvider(page); ViewProviderPage* dvp = dynamic_cast<ViewProviderPage*>(vp); if (dvp && dvp->getMDIViewPage()) { dvp->getMDIViewPage()->saveSVG(); } else { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No Drawing View"), QObject::tr("Open Drawing View before attempting export to SVG.")); return; } }
void CmdTechDrawNewHatch::activated(int iMsg) { Q_UNUSED(iMsg); if (!_checkSelectionHatch(this)) { return; } std::vector<Gui::SelectionObject> selection = getSelection().getSelectionEx(); auto objFeat( dynamic_cast<TechDraw::DrawViewPart *>(selection[0].getObject()) ); if( objFeat == nullptr ) { return; } const std::vector<std::string> &subNames = selection[0].getSubNames(); TechDraw::DrawPage* page = objFeat->findParentPage(); std::string PageName = page->getNameInDocument(); std::string FeatName = getUniqueObjectName("Hatch"); std::stringstream featLabel; featLabel << FeatName << "F" << TechDraw::DrawUtil::getIndexFromName(subNames.at(0)); openCommand("Create Hatch"); doCommand(Doc,"App.activeDocument().addObject('TechDraw::DrawHatch','%s')",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.Label = '%s'",FeatName.c_str(),featLabel.str().c_str()); auto hatch( static_cast<TechDraw::DrawHatch *>(getDocument()->getObject(FeatName.c_str())) ); hatch->Source.setValue(objFeat, subNames); //should this be: doCommand(Doc,"App..Feat..Source = [(App...%s,%s),(App..%s,%s),...]",objs[0]->getNameInDocument(),subs[0],...); //seems very unwieldy commitCommand(); //Horrible hack to force Tree update ??still required?? double x = objFeat->X.getValue(); objFeat->X.setValue(x); getDocument()->recompute(); }
void CmdTechDrawNewAngle3PtDimension::activated(int iMsg) { Q_UNUSED(iMsg); bool result = _checkSelection(this,3); if (!result) return; result = _checkDrawViewPart(this); if (!result) return; std::vector<Gui::SelectionObject> selection = getSelection().getSelectionEx(); TechDraw::DrawViewPart * objFeat = 0; std::vector<std::string> SubNames; std::vector<Gui::SelectionObject>::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) { objFeat = static_cast<TechDraw::DrawViewPart*> ((*itSel).getObject()); SubNames = (*itSel).getSubNames(); } } TechDraw::DrawPage* page = objFeat->findParentPage(); std::string PageName = page->getNameInDocument(); TechDraw::DrawViewDimension *dim = 0; std::string FeatName = getUniqueObjectName("Dimension"); std::vector<App::DocumentObject *> objs; std::vector<std::string> subs; if (_isValidVertexes(this, 3)) { objs.push_back(objFeat); objs.push_back(objFeat); objs.push_back(objFeat); subs.push_back(SubNames[0]); subs.push_back(SubNames[1]); subs.push_back(SubNames[2]); } else { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Need three points to make an 3 point Angle Dimension")); return; } openCommand("Create Dimension"); doCommand(Doc,"App.activeDocument().addObject('TechDraw::DrawViewDimension','%s')",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.Type = '%s'",FeatName.c_str() ,"Angle3Pt"); dim = dynamic_cast<TechDraw::DrawViewDimension *>(getDocument()->getObject(FeatName.c_str())); if (!dim) { throw Base::Exception("CmdTechDrawNewAngle3PtDimension - dim not found\n"); } dim->References2D.setValues(objs, subs); doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)",PageName.c_str(),FeatName.c_str()); commitCommand(); dim->recomputeFeature(); //Horrible hack to force Tree update double x = objFeat->X.getValue(); objFeat->X.setValue(x); }
void CmdTechDrawNewDistanceYDimension::activated(int iMsg) { Q_UNUSED(iMsg); bool result = _checkSelection(this,2); if (!result) return; result = _checkDrawViewPart(this); if (!result) return; std::vector<Gui::SelectionObject> selection = getSelection().getSelectionEx(); TechDraw::DrawViewPart * objFeat = 0; std::vector<std::string> SubNames; std::vector<Gui::SelectionObject>::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) { objFeat = static_cast<TechDraw::DrawViewPart*> ((*itSel).getObject()); SubNames = (*itSel).getSubNames(); } } TechDraw::DrawPage* page = objFeat->findParentPage(); std::string PageName = page->getNameInDocument(); TechDraw::DrawViewDimension *dim = 0; std::string FeatName = getUniqueObjectName("Dimension"); std::string dimType; std::vector<App::DocumentObject *> objs; std::vector<std::string> subs; int edgeType = _isValidSingleEdge(this); if ((edgeType == isVertical) || (edgeType == isDiagonal)) { objs.push_back(objFeat); subs.push_back(SubNames[0]); } else if (_isValidVertexes(this)) { objs.push_back(objFeat); objs.push_back(objFeat); subs.push_back(SubNames[0]); subs.push_back(SubNames[1]); } else if ((_isValidEdgeToEdge(this) == isVertical) || (_isValidEdgeToEdge(this) == isHorizontal) || (_isValidEdgeToEdge(this) == isDiagonal) || (_isValidEdgeToEdge(this) == isAngle)) { edgeType = _isValidEdgeToEdge(this); objs.push_back(objFeat); objs.push_back(objFeat); subs.push_back(SubNames[0]); subs.push_back(SubNames[1]); } else if (_isValidVertexToEdge(this)) { objs.push_back(objFeat); objs.push_back(objFeat); subs.push_back(SubNames[0]); subs.push_back(SubNames[1]); } else { std::stringstream edgeMsg; edgeMsg << "Need 2 Vertexes, 1 straight Edge, 1 Vertex/1 straight edge or 2 straight Edges for Horizontal Dimension (edge type: " << _edgeTypeToText(edgeType) << ")"; QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr(edgeMsg.str().c_str())); return; } openCommand("Create Dimension"); doCommand(Doc,"App.activeDocument().addObject('TechDraw::DrawViewDimension','%s')",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.Type = '%s'",FeatName.c_str() ,"DistanceY"); dim = dynamic_cast<TechDraw::DrawViewDimension *>(getDocument()->getObject(FeatName.c_str())); if (!dim) { throw Base::Exception("CmdTechDrawNewDistanceYDimension - dim not found\n"); } dim->References2D.setValues(objs, subs); doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)",PageName.c_str(),FeatName.c_str()); commitCommand(); dim->recomputeFeature(); TechDraw::pointPair pp = dim->getLinearPoints(); Base::Vector3d mid = (pp.first + pp.second)/2.0; dim->X.setValue(mid.x); dim->Y.setValue(-mid.y); //Horrible hack to force Tree update double x = objFeat->X.getValue(); objFeat->X.setValue(x); }
void CmdTechDrawNewDiameterDimension::activated(int iMsg) { Q_UNUSED(iMsg); bool result = _checkSelection(this,1); if (!result) return; result = _checkDrawViewPart(this); if (!result) return; std::vector<Gui::SelectionObject> selection = getSelection().getSelectionEx(); TechDraw::DrawViewPart * objFeat = 0; std::vector<std::string> SubNames; std::vector<Gui::SelectionObject>::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) { objFeat = static_cast<TechDraw::DrawViewPart*> ((*itSel).getObject()); SubNames = (*itSel).getSubNames(); } } TechDraw::DrawPage* page = objFeat->findParentPage(); std::string PageName = page->getNameInDocument(); TechDraw::DrawViewDimension *dim = 0; std::string FeatName = getUniqueObjectName("Dimension"); std::vector<App::DocumentObject *> objs; std::vector<std::string> subs; int edgeType = _isValidSingleEdge(this); if (edgeType == isCircle) { objs.push_back(objFeat); subs.push_back(SubNames[0]); } else if (edgeType == isBSplineCircle) { QMessageBox::StandardButton result = QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Warning"), QObject::tr("Selected edge is a BSpline. Diameter will be approximate."), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel); if (result == QMessageBox::Ok) { objs.push_back(objFeat); subs.push_back(SubNames[0]); } else { return; } } else { std::stringstream edgeMsg; edgeMsg << "Selection for Diameter does not contain a circular edge (edge type: " << _edgeTypeToText(edgeType) << ")"; QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr(edgeMsg.str().c_str())); return; } openCommand("Create Dimension"); doCommand(Doc,"App.activeDocument().addObject('TechDraw::DrawViewDimension','%s')",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.Type = '%s'",FeatName.c_str() ,"Diameter"); dim = dynamic_cast<TechDraw::DrawViewDimension *>(getDocument()->getObject(FeatName.c_str())); if (!dim) { throw Base::Exception("CmdTechDrawNewDiameterDimension - dim not found\n"); } dim->References2D.setValues(objs, subs); doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)",PageName.c_str(),FeatName.c_str()); commitCommand(); dim->recomputeFeature(); //Horrible hack to force Tree update double x = objFeat->X.getValue(); objFeat->X.setValue(x); }
void CmdTechDrawNewDimension::activated(int iMsg) { Q_UNUSED(iMsg); bool result = _checkSelection(this,2); if (!result) return; result = _checkDrawViewPart(this); if (!result) return; //do we still need to pick DVPs out of selection? or should we complain about junk? std::vector<Gui::SelectionObject> selection = getSelection().getSelectionEx(); TechDraw::DrawViewPart* objFeat = 0; std::vector<std::string> SubNames; std::vector<Gui::SelectionObject>::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) { objFeat = static_cast<TechDraw::DrawViewPart*> ((*itSel).getObject()); SubNames = (*itSel).getSubNames(); } } TechDraw::DrawPage* page = objFeat->findParentPage(); std::string PageName = page->getNameInDocument(); TechDraw::DrawViewDimension *dim = 0; std::string FeatName = getUniqueObjectName("Dimension"); std::string dimType; std::vector<App::DocumentObject *> objs; std::vector<std::string> subs; int edgeType = _isValidSingleEdge(this); if (edgeType) { if (edgeType < isCircle) { dimType = "Distance"; objs.push_back(objFeat); subs.push_back(SubNames[0]); } else if (edgeType == isCircle) { dimType = "Radius"; } else { dimType = "Radius"; } } else if (_isValidVertexes(this)) { dimType = "Distance"; objs.push_back(objFeat); objs.push_back(objFeat); subs.push_back(SubNames[0]); subs.push_back(SubNames[1]); } else if (_isValidEdgeToEdge(this)) { int edgeCase = _isValidEdgeToEdge(this); objs.push_back(objFeat); objs.push_back(objFeat); subs.push_back(SubNames[0]); subs.push_back(SubNames[1]); switch (edgeCase) { case isHorizontal: dimType = "DistanceX"; break; case isVertical: dimType = "DistanceY"; break; case isDiagonal: dimType = "Distance"; break; case isAngle: dimType = "Angle"; default: break; } } else if (_isValidVertexToEdge(this)) { dimType = "Distance"; objs.push_back(objFeat); objs.push_back(objFeat); subs.push_back(SubNames[0]); subs.push_back(SubNames[1]); } else { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can't make a Dimension from this selection")); return; } openCommand("Create Dimension"); doCommand(Doc,"App.activeDocument().addObject('TechDraw::DrawViewDimension','%s')",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.Type = '%s'",FeatName.c_str() ,dimType.c_str()); dim = dynamic_cast<TechDraw::DrawViewDimension *>(getDocument()->getObject(FeatName.c_str())); if (!dim) { throw Base::Exception("CmdTechDrawNewDimension - dim not found\n"); } dim->References2D.setValues(objs, subs); doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)",PageName.c_str(),FeatName.c_str()); commitCommand(); dim->recomputeFeature(); //Horrible hack to force Tree update double x = objFeat->X.getValue(); objFeat->X.setValue(x); }