Files
create/src/Mod/Part/Gui/Command.cpp
blobfish 59e69bbe0e Part Dimension: alterations to existing files
Not sure what is happening with View3dInventorViewer.h.
    The only REAL change, beyond the addition of dim functions, is
    the removal of the member arrowrotation. It wasn't referenced anywhere.
2013-12-17 10:05:46 -05:00

1715 lines
60 KiB
C++

/***************************************************************************
* Copyright (c) Jürgen Riegel (juergen.riegel@web.de) 2002 *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#include "PreCompiled.h"
#ifndef _PreComp_
# include <sstream>
# include <QString>
# include <QDir>
# include <QFileInfo>
# include <QLineEdit>
# include <QPointer>
# include <Standard_math.hxx>
# include <TopoDS_Shape.hxx>
# include <TopExp_Explorer.hxx>
# include <Inventor/events/SoMouseButtonEvent.h>
#endif
#include <Base/Console.h>
#include <Base/Exception.h>
#include <App/Document.h>
#include <Gui/Application.h>
#include <Gui/BitmapFactory.h>
#include <Gui/Command.h>
#include <Gui/Control.h>
#include <Gui/Document.h>
#include <Gui/FileDialog.h>
#include <Gui/MainWindow.h>
#include <Gui/Selection.h>
#include <Gui/View3DInventor.h>
#include <Gui/View3DInventorViewer.h>
#include <Gui/WaitCursor.h>
#include "../App/PartFeature.h"
#include "DlgPartImportStepImp.h"
#include "DlgBooleanOperation.h"
#include "DlgExtrusion.h"
#include "DlgRevolution.h"
#include "DlgFilletEdges.h"
#include "DlgPrimitives.h"
#include "CrossSections.h"
#include "Mirroring.h"
#include "ViewProvider.h"
#include "TaskShapeBuilder.h"
#include "TaskLoft.h"
#include "TaskSweep.h"
#include "TaskDimension.h"
#include "TaskCheckGeometry.h"
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//===========================================================================
// Part_PickCurveNet
//===========================================================================
DEF_STD_CMD(CmdPartPickCurveNet);
CmdPartPickCurveNet::CmdPartPickCurveNet()
:Command("Part_PickCurveNet")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Pick curve network");
sToolTipText = QT_TR_NOOP("Pick a curve network");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Test1";
}
void CmdPartPickCurveNet::activated(int iMsg)
{
}
//===========================================================================
// Part_NewDoc
//===========================================================================
DEF_STD_CMD(CmdPartNewDoc);
CmdPartNewDoc::CmdPartNewDoc()
:Command("Part_NewDoc")
{
sAppModule = "Part";
sGroup = "Part";
sMenuText = "New document";
sToolTipText = "Create an empty part document";
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "New";
}
void CmdPartNewDoc::activated(int iMsg)
{
doCommand(Doc,"d = App.New()");
updateActive();
}
//===========================================================================
// Part_Box2
//===========================================================================
DEF_STD_CMD_A(CmdPartBox2);
CmdPartBox2::CmdPartBox2()
:Command("Part_Box2")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Box fix 1");
sToolTipText = QT_TR_NOOP("Create a box solid without dialog");
sWhatsThis = "Part_Box2";
sStatusTip = sToolTipText;
sPixmap = "Part_Box";
}
void CmdPartBox2::activated(int iMsg)
{
openCommand("Part Box Create");
doCommand(Doc,"from FreeCAD import Base");
doCommand(Doc,"import Part");
doCommand(Doc,"__fb__ = App.ActiveDocument.addObject(\"Part::Box\",\"PartBox\")");
doCommand(Doc,"__fb__.Location = Base.Vector(0.0,0.0,0.0)");
doCommand(Doc,"__fb__.Length = 100.0");
doCommand(Doc,"__fb__.Width = 100.0");
doCommand(Doc,"__fb__.Height = 100.0");
doCommand(Doc,"del __fb__");
commitCommand();
updateActive();
}
bool CmdPartBox2::isActive(void)
{
if (getActiveGuiDocument())
return true;
else
return false;
}
//===========================================================================
// Part_Box3
//===========================================================================
DEF_STD_CMD_A(CmdPartBox3);
CmdPartBox3::CmdPartBox3()
:Command("Part_Box3")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Box fix 2");
sToolTipText = QT_TR_NOOP("Create a box solid without dialog");
sWhatsThis = "Part_Box3";
sStatusTip = sToolTipText;
sPixmap = "Part_Box";
}
void CmdPartBox3::activated(int iMsg)
{
openCommand("Part Box Create");
doCommand(Doc,"from FreeCAD import Base");
doCommand(Doc,"import Part");
doCommand(Doc,"__fb__ = App.ActiveDocument.addObject(\"Part::Box\",\"PartBox\")");
doCommand(Doc,"__fb__.Location = Base.Vector(50.0,50.0,50.0)");
doCommand(Doc,"__fb__.Length = 100.0");
doCommand(Doc,"__fb__.Width = 100.0");
doCommand(Doc,"__fb__.Height = 100.0");
doCommand(Doc,"del __fb__");
commitCommand();
updateActive();
}
bool CmdPartBox3::isActive(void)
{
if (getActiveGuiDocument())
return true;
else
return false;
}
//===========================================================================
// Part_Primitives
//===========================================================================
DEF_STD_CMD_A(CmdPartPrimitives);
CmdPartPrimitives::CmdPartPrimitives()
:Command("Part_Primitives")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Create primitives...");
sToolTipText = QT_TR_NOOP("Creation of parametrized geometric primitives");
sWhatsThis = "Part_Primitives";
sStatusTip = sToolTipText;
sPixmap = "Part_CreatePrimitives";
}
void CmdPartPrimitives::activated(int iMsg)
{
PartGui::TaskPrimitives* dlg = new PartGui::TaskPrimitives();
Gui::Control().showDialog(dlg);
}
bool CmdPartPrimitives::isActive(void)
{
return (hasActiveDocument() && !Gui::Control().activeDialog());
}
namespace PartGui {
bool checkForSolids(const TopoDS_Shape& shape)
{
TopExp_Explorer xp;
xp.Init(shape, TopAbs_FACE, TopAbs_SHELL);
if (xp.More()) {
return false;
}
xp.Init(shape, TopAbs_WIRE, TopAbs_FACE);
if (xp.More()) {
return false;
}
xp.Init(shape, TopAbs_EDGE, TopAbs_WIRE);
if (xp.More()) {
return false;
}
xp.Init(shape, TopAbs_VERTEX, TopAbs_EDGE);
if (xp.More()) {
return false;
}
return true;
}
}
//===========================================================================
// Part_Cut
//===========================================================================
DEF_STD_CMD_A(CmdPartCut);
CmdPartCut::CmdPartCut()
:Command("Part_Cut")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Cut");
sToolTipText = QT_TR_NOOP("Make a cut of two shapes");
sWhatsThis = "Part_Cut";
sStatusTip = sToolTipText;
sPixmap = "Part_Cut";
}
void CmdPartCut::activated(int iMsg)
{
std::vector<Gui::SelectionObject> Sel = getSelection().getSelectionEx(0, Part::Feature::getClassTypeId());
if (Sel.size() != 2) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
QObject::tr("Select two shapes please."));
return;
}
for (std::vector<Gui::SelectionObject>::iterator it = Sel.begin(); it != Sel.end(); ++it) {
App::DocumentObject* obj = it->getObject();
if (obj->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) {
const TopoDS_Shape& shape = static_cast<Part::Feature*>(obj)->Shape.getValue();
if (!PartGui::checkForSolids(shape)) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
QObject::tr("Non-solids cannot be used for boolean operations."));
return;
}
}
}
std::string FeatName = getUniqueObjectName("Cut");
std::string BaseName = Sel[0].getFeatName();
std::string ToolName = Sel[1].getFeatName();
openCommand("Part Cut");
doCommand(Doc,"App.activeDocument().addObject(\"Part::Cut\",\"%s\")",FeatName.c_str());
doCommand(Doc,"App.activeDocument().%s.Base = App.activeDocument().%s",FeatName.c_str(),BaseName.c_str());
doCommand(Doc,"App.activeDocument().%s.Tool = App.activeDocument().%s",FeatName.c_str(),ToolName.c_str());
doCommand(Gui,"Gui.activeDocument().hide('%s')",BaseName.c_str());
doCommand(Gui,"Gui.activeDocument().hide('%s')",ToolName.c_str());
copyVisual(FeatName.c_str(), "ShapeColor", BaseName.c_str());
copyVisual(FeatName.c_str(), "DisplayMode", BaseName.c_str());
updateActive();
commitCommand();
}
bool CmdPartCut::isActive(void)
{
return getSelection().countObjectsOfType(Part::Feature::getClassTypeId())==2;
}
//===========================================================================
// Part_Common
//===========================================================================
DEF_STD_CMD_A(CmdPartCommon);
CmdPartCommon::CmdPartCommon()
:Command("Part_Common")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Intersection");
sToolTipText = QT_TR_NOOP("Make an intersection of two shapes");
sWhatsThis = "Part_Common";
sStatusTip = sToolTipText;
sPixmap = "Part_Common";
}
void CmdPartCommon::activated(int iMsg)
{
std::vector<Gui::SelectionObject> Sel = getSelection().getSelectionEx(0, Part::Feature::getClassTypeId());
if (Sel.size() < 2) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
QObject::tr("Select two shapes or more, please."));
return;
}
std::string FeatName = getUniqueObjectName("Common");
std::stringstream str;
std::vector<std::string> tempSelNames;
str << "App.activeDocument()." << FeatName << ".Shapes = [";
for (std::vector<Gui::SelectionObject>::iterator it = Sel.begin(); it != Sel.end(); ++it) {
App::DocumentObject* obj = it->getObject();
if (obj->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) {
const TopoDS_Shape& shape = static_cast<Part::Feature*>(obj)->Shape.getValue();
if (!PartGui::checkForSolids(shape)) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
QObject::tr("Non-solids cannot be used for boolean operations."));
return;
}
str << "App.activeDocument()." << it->getFeatName() << ",";
tempSelNames.push_back(it->getFeatName());
}
}
str << "]";
openCommand("Common");
doCommand(Doc,"App.activeDocument().addObject(\"Part::MultiCommon\",\"%s\")",FeatName.c_str());
runCommand(Doc,str.str().c_str());
for (std::vector<std::string>::iterator it = tempSelNames.begin(); it != tempSelNames.end(); ++it)
doCommand(Gui,"Gui.activeDocument().%s.Visibility=False",it->c_str());
copyVisual(FeatName.c_str(), "ShapeColor", tempSelNames.front().c_str());
copyVisual(FeatName.c_str(), "DisplayMode", tempSelNames.front().c_str());
updateActive();
commitCommand();
}
bool CmdPartCommon::isActive(void)
{
return getSelection().countObjectsOfType(Part::Feature::getClassTypeId())>=2;
}
//===========================================================================
// Part_Fuse
//===========================================================================
DEF_STD_CMD_A(CmdPartFuse);
CmdPartFuse::CmdPartFuse()
:Command("Part_Fuse")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Union");
sToolTipText = QT_TR_NOOP("Make a union of several shapes");
sWhatsThis = "Part_Fuse";
sStatusTip = sToolTipText;
sPixmap = "Part_Fuse";
}
void CmdPartFuse::activated(int iMsg)
{
std::vector<Gui::SelectionObject> Sel = getSelection().getSelectionEx(0, Part::Feature::getClassTypeId());
if (Sel.size() < 2) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
QObject::tr("Select two shapes or more, please."));
return;
}
std::string FeatName = getUniqueObjectName("Fusion");
std::stringstream str;
std::vector<std::string> tempSelNames;
str << "App.activeDocument()." << FeatName << ".Shapes = [";
for (std::vector<Gui::SelectionObject>::iterator it = Sel.begin(); it != Sel.end(); ++it) {
App::DocumentObject* obj = it->getObject();
if (obj->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) {
const TopoDS_Shape& shape = static_cast<Part::Feature*>(obj)->Shape.getValue();
if (!PartGui::checkForSolids(shape)) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
QObject::tr("Non-solids cannot be used for boolean operations."));
return;
}
str << "App.activeDocument()." << it->getFeatName() << ",";
tempSelNames.push_back(it->getFeatName());
}
}
str << "]";
openCommand("Fusion");
doCommand(Doc,"App.activeDocument().addObject(\"Part::MultiFuse\",\"%s\")",FeatName.c_str());
runCommand(Doc,str.str().c_str());
for (std::vector<std::string>::iterator it = tempSelNames.begin(); it != tempSelNames.end(); ++it)
doCommand(Gui,"Gui.activeDocument().%s.Visibility=False",it->c_str());
copyVisual(FeatName.c_str(), "ShapeColor", tempSelNames.front().c_str());
copyVisual(FeatName.c_str(), "DisplayMode", tempSelNames.front().c_str());
updateActive();
commitCommand();
}
bool CmdPartFuse::isActive(void)
{
return getSelection().countObjectsOfType(Part::Feature::getClassTypeId())>=2;
}
//===========================================================================
// Part_Compound
//===========================================================================
DEF_STD_CMD_A(CmdPartCompound);
CmdPartCompound::CmdPartCompound()
:Command("Part_Compound")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Make compound");
sToolTipText = QT_TR_NOOP("Make a compound of several shapes");
sWhatsThis = "Part_Compound";
sStatusTip = sToolTipText;
}
void CmdPartCompound::activated(int iMsg)
{
unsigned int n = getSelection().countObjectsOfType(Part::Feature::getClassTypeId());
if (n < 2) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
QObject::tr("Select two shapes or more, please."));
return;
}
std::string FeatName = getUniqueObjectName("Compound");
std::vector<Gui::SelectionSingleton::SelObj> Sel = getSelection().getSelection();
std::stringstream str;
std::vector<std::string> tempSelNames;
str << "App.activeDocument()." << FeatName << ".Links = [";
for (std::vector<Gui::SelectionSingleton::SelObj>::iterator it = Sel.begin(); it != Sel.end(); ++it){
str << "App.activeDocument()." << it->FeatName << ",";
tempSelNames.push_back(it->FeatName);
}
str << "]";
openCommand("Compound");
doCommand(Doc,"App.activeDocument().addObject(\"Part::Compound\",\"%s\")",FeatName.c_str());
runCommand(Doc,str.str().c_str());
updateActive();
commitCommand();
}
bool CmdPartCompound::isActive(void)
{
return getSelection().countObjectsOfType(Part::Feature::getClassTypeId())>=2;
}
//===========================================================================
// Part_Section
//===========================================================================
DEF_STD_CMD_A(CmdPartSection);
CmdPartSection::CmdPartSection()
:Command("Part_Section")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Section");
sToolTipText = QT_TR_NOOP("Make a section of two shapes");
sWhatsThis = "Part_Section";
sStatusTip = sToolTipText;
sPixmap = "Part_Section";
}
void CmdPartSection::activated(int iMsg)
{
std::vector<Gui::SelectionObject> Sel = getSelection().getSelectionEx(0, Part::Feature::getClassTypeId());
if (Sel.size() != 2) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
QObject::tr("Select two shapes please."));
return;
}
std::string FeatName = getUniqueObjectName("Section");
std::string BaseName = Sel[0].getFeatName();
std::string ToolName = Sel[1].getFeatName();
openCommand("Section");
doCommand(Doc,"App.activeDocument().addObject(\"Part::Section\",\"%s\")",FeatName.c_str());
doCommand(Doc,"App.activeDocument().%s.Base = App.activeDocument().%s",FeatName.c_str(),BaseName.c_str());
doCommand(Doc,"App.activeDocument().%s.Tool = App.activeDocument().%s",FeatName.c_str(),ToolName.c_str());
doCommand(Gui,"Gui.activeDocument().hide('%s')",BaseName.c_str());
doCommand(Gui,"Gui.activeDocument().hide('%s')",ToolName.c_str());
doCommand(Gui,"Gui.activeDocument().%s.LineColor = Gui.activeDocument().%s.ShapeColor", FeatName.c_str(),BaseName.c_str());
updateActive();
commitCommand();
}
bool CmdPartSection::isActive(void)
{
return getSelection().countObjectsOfType(Part::Feature::getClassTypeId())==2;
}
//===========================================================================
// CmdPartImport
//===========================================================================
DEF_STD_CMD_A(CmdPartImport);
CmdPartImport::CmdPartImport()
:Command("Part_Import")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Import CAD...");
sToolTipText = QT_TR_NOOP("Imports a CAD file");
sWhatsThis = "Part_Import";
sStatusTip = sToolTipText;
sPixmap = "Part_Import";
}
void CmdPartImport::activated(int iMsg)
{
QStringList filter;
filter << QString::fromAscii("STEP (*.stp *.step)");
filter << QString::fromAscii("STEP with colors (*.stp *.step)");
filter << QString::fromAscii("IGES (*.igs *.iges)");
filter << QString::fromAscii("IGES with colors (*.igs *.iges)");
filter << QString::fromAscii("BREP (*.brp *.brep)");
QString select;
QString fn = Gui::FileDialog::getOpenFileName(Gui::getMainWindow(), QString(), QString(), filter.join(QLatin1String(";;")), &select);
if (!fn.isEmpty()) {
Gui::WaitCursor wc;
App::Document* pDoc = getDocument();
if (!pDoc) return; // no document
openCommand("Import Part");
if (select == filter[1] ||
select == filter[3]) {
doCommand(Doc, "import ImportGui");
doCommand(Doc, "ImportGui.insert(\"%s\",\"%s\")", (const char*)fn.toUtf8(), pDoc->getName());
}
else {
doCommand(Doc, "import Part");
doCommand(Doc, "Part.insert(\"%s\",\"%s\")", (const char*)fn.toUtf8(), pDoc->getName());
}
commitCommand();
std::list<Gui::MDIView*> views = getActiveGuiDocument()->getMDIViewsOfType(Gui::View3DInventor::getClassTypeId());
for (std::list<Gui::MDIView*>::iterator it = views.begin(); it != views.end(); ++it) {
(*it)->viewAll();
}
}
}
bool CmdPartImport::isActive(void)
{
if (getActiveGuiDocument())
return true;
else
return false;
}
//===========================================================================
// CmdPartExport
//===========================================================================
DEF_STD_CMD_A(CmdPartExport);
CmdPartExport::CmdPartExport()
: Command("Part_Export")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Export CAD...");
sToolTipText = QT_TR_NOOP("Exports to a CAD file");
sWhatsThis = "Part_Export";
sStatusTip = sToolTipText;
sPixmap = "Part_Export.svg";
}
void CmdPartExport::activated(int iMsg)
{
QStringList filter;
filter << QString::fromAscii("STEP (*.stp *.step)");
filter << QString::fromAscii("STEP with colors (*.stp *.step)");
filter << QString::fromAscii("IGES (*.igs *.iges)");
filter << QString::fromAscii("IGES with colors (*.igs *.iges)");
filter << QString::fromAscii("BREP (*.brp *.brep)");
QString select;
QString fn = Gui::FileDialog::getSaveFileName(Gui::getMainWindow(), QString(), QString(), filter.join(QLatin1String(";;")), &select);
if (!fn.isEmpty()) {
App::Document* pDoc = getDocument();
if (!pDoc) return; // no document
if (select == filter[1] ||
select == filter[3]) {
Gui::Application::Instance->exportTo((const char*)fn.toUtf8(),pDoc->getName(),"ImportGui");
}
else {
Gui::Application::Instance->exportTo((const char*)fn.toUtf8(),pDoc->getName(),"Part");
}
}
}
bool CmdPartExport::isActive(void)
{
return Gui::Selection().countObjectsOfType(Part::Feature::getClassTypeId()) > 0;
}
//===========================================================================
// PartImportCurveNet
//===========================================================================
DEF_STD_CMD_A(CmdPartImportCurveNet);
CmdPartImportCurveNet::CmdPartImportCurveNet()
:Command("Part_ImportCurveNet")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Import curve network...");
sToolTipText= QT_TR_NOOP("Import a curve network");
sWhatsThis = "Part_ImportCurveNet";
sStatusTip = sToolTipText;
sPixmap = "Part_Box";
}
void CmdPartImportCurveNet::activated(int iMsg)
{
QStringList filter;
filter << QObject::tr("All CAD Files (*.stp *.step *.igs *.iges *.brp *.brep)");
filter << QObject::tr("STEP (*.stp *.step)");
filter << QObject::tr("IGES (*.igs *.iges)");
filter << QObject::tr("BREP (*.brp *.brep)");
filter << QObject::tr("All Files (*.*)");
QString fn = Gui::FileDialog::getOpenFileName(Gui::getMainWindow(), QString(), QString(), filter.join(QLatin1String(";;")));
if (!fn.isEmpty()) {
QFileInfo fi; fi.setFile(fn);
openCommand("Part Import Curve Net");
doCommand(Doc,"f = App.activeDocument().addObject(\"Part::CurveNet\",\"%s\")", (const char*)fi.baseName().toAscii());
doCommand(Doc,"f.FileName = \"%s\"",(const char*)fn.toAscii());
commitCommand();
updateActive();
}
}
bool CmdPartImportCurveNet::isActive(void)
{
if (getActiveGuiDocument())
return true;
else
return false;
}
//===========================================================================
// Part_MakeSolid
//===========================================================================
DEF_STD_CMD_A(CmdPartMakeSolid);
CmdPartMakeSolid::CmdPartMakeSolid()
:Command("Part_MakeSolid")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Convert to solid");
sToolTipText = QT_TR_NOOP("Create solid from a shell or compound");
sWhatsThis = "Part_MakeSolid";
sStatusTip = sToolTipText;
}
void CmdPartMakeSolid::activated(int iMsg)
{
std::vector<App::DocumentObject*> objs = Gui::Selection().getObjectsOfType
(Part::Feature::getClassTypeId());
doCommand(Doc, "import Part");
for (std::vector<App::DocumentObject*>::iterator it = objs.begin(); it != objs.end(); ++it) {
const TopoDS_Shape& shape = static_cast<Part::Feature*>(*it)->Shape.getValue();
if (!shape.IsNull()) {
TopAbs_ShapeEnum type = shape.ShapeType();
QString str;
if (type == TopAbs_SOLID) {
Base::Console().Message("%s is ignored because it is already a solid.\n",
(*it)->Label.getValue());
}
else if (type == TopAbs_COMPOUND || type == TopAbs_COMPSOLID) {
str = QString::fromAscii(
"__s__=App.ActiveDocument.%1.Shape.Faces\n"
"__s__=Part.Solid(Part.Shell(__s__))\n"
"__o__=App.ActiveDocument.addObject(\"Part::Feature\",\"%1_solid\")\n"
"__o__.Label=\"%2 (Solid)\"\n"
"__o__.Shape=__s__\n"
"del __s__, __o__"
)
.arg(QLatin1String((*it)->getNameInDocument()))
.arg(QLatin1String((*it)->Label.getValue()));
}
else if (type == TopAbs_SHELL) {
str = QString::fromAscii(
"__s__=App.ActiveDocument.%1.Shape\n"
"__s__=Part.Solid(__s__)\n"
"__o__=App.ActiveDocument.addObject(\"Part::Feature\",\"%1_solid\")\n"
"__o__.Label=\"%2 (Solid)\"\n"
"__o__.Shape=__s__\n"
"del __s__, __o__"
)
.arg(QLatin1String((*it)->getNameInDocument()))
.arg(QLatin1String((*it)->Label.getValue()));
}
else {
Base::Console().Message("%s is ignored because it is neither a shell nor a compound.\n",
(*it)->Label.getValue());
}
try {
if (!str.isEmpty())
doCommand(Doc, (const char*)str.toAscii());
}
catch (const Base::Exception& e) {
Base::Console().Error("Cannot convert %s because %s.\n",
(*it)->Label.getValue(), e.what());
}
}
}
}
bool CmdPartMakeSolid::isActive(void)
{
return Gui::Selection().countObjectsOfType
(Part::Feature::getClassTypeId()) > 0;
}
//===========================================================================
// Part_ReverseShape
//===========================================================================
DEF_STD_CMD_A(CmdPartReverseShape);
CmdPartReverseShape::CmdPartReverseShape()
:Command("Part_ReverseShape")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Reverse shapes");
sToolTipText = QT_TR_NOOP("Reverse orientation of shapes");
sWhatsThis = "Part_ReverseShape";
sStatusTip = sToolTipText;
}
void CmdPartReverseShape::activated(int iMsg)
{
std::vector<App::DocumentObject*> objs = Gui::Selection().getObjectsOfType
(Part::Feature::getClassTypeId());
doCommand(Doc, "import Part");
for (std::vector<App::DocumentObject*>::iterator it = objs.begin(); it != objs.end(); ++it) {
const TopoDS_Shape& shape = static_cast<Part::Feature*>(*it)->Shape.getValue();
if (!shape.IsNull()) {
QString str = QString::fromAscii(
"__s__=App.ActiveDocument.%1.Shape.copy()\n"
"__s__.reverse()\n"
"__o__=App.ActiveDocument.addObject(\"Part::Feature\",\"%1_rev\")\n"
"__o__.Label=\"%2 (Rev)\"\n"
"__o__.Shape=__s__\n"
"del __s__, __o__"
)
.arg(QLatin1String((*it)->getNameInDocument()))
.arg(QLatin1String((*it)->Label.getValue()));
try {
if (!str.isEmpty())
doCommand(Doc, (const char*)str.toAscii());
}
catch (const Base::Exception& e) {
Base::Console().Error("Cannot convert %s because %s.\n",
(*it)->Label.getValue(), e.what());
}
}
}
}
bool CmdPartReverseShape::isActive(void)
{
return Gui::Selection().countObjectsOfType
(Part::Feature::getClassTypeId()) > 0;
}
//===========================================================================
// Part_Boolean
//===========================================================================
DEF_STD_CMD_A(CmdPartBoolean);
CmdPartBoolean::CmdPartBoolean()
:Command("Part_Boolean")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Boolean...");
sToolTipText = QT_TR_NOOP("Run a boolean operation with two shapes selected");
sWhatsThis = "Part_Boolean";
sStatusTip = sToolTipText;
sPixmap = "Part_Booleans";
}
void CmdPartBoolean::activated(int iMsg)
{
Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
if (!dlg)
dlg = new PartGui::TaskBooleanOperation();
Gui::Control().showDialog(dlg);
}
bool CmdPartBoolean::isActive(void)
{
return (hasActiveDocument() && !Gui::Control().activeDialog());
}
//===========================================================================
// Part_Extrude
//===========================================================================
DEF_STD_CMD_A(CmdPartExtrude);
CmdPartExtrude::CmdPartExtrude()
:Command("Part_Extrude")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Extrude...");
sToolTipText = QT_TR_NOOP("Extrude a selected sketch");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_Extrude";
}
void CmdPartExtrude::activated(int iMsg)
{
Gui::Control().showDialog(new PartGui::TaskExtrusion());
}
bool CmdPartExtrude::isActive(void)
{
return (hasActiveDocument() && !Gui::Control().activeDialog());
}
//===========================================================================
// Part_Revolve
//===========================================================================
DEF_STD_CMD_A(CmdPartRevolve);
CmdPartRevolve::CmdPartRevolve()
:Command("Part_Revolve")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Revolve...");
sToolTipText = QT_TR_NOOP("Revolve a selected shape");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_Revolve";
}
void CmdPartRevolve::activated(int iMsg)
{
Gui::Control().showDialog(new PartGui::TaskRevolution());
}
bool CmdPartRevolve::isActive(void)
{
return (hasActiveDocument() && !Gui::Control().activeDialog());
}
//===========================================================================
// Part_Fillet
//===========================================================================
DEF_STD_CMD_A(CmdPartFillet);
CmdPartFillet::CmdPartFillet()
:Command("Part_Fillet")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Fillet...");
sToolTipText = QT_TR_NOOP("Fillet the selected edges of a shape");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_Fillet";
}
void CmdPartFillet::activated(int iMsg)
{
Gui::Control().showDialog(new PartGui::TaskFilletEdges(0));
}
bool CmdPartFillet::isActive(void)
{
return (hasActiveDocument() && !Gui::Control().activeDialog());
}
//===========================================================================
// Part_Chamfer
//===========================================================================
DEF_STD_CMD_A(CmdPartChamfer);
CmdPartChamfer::CmdPartChamfer()
:Command("Part_Chamfer")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Chamfer...");
sToolTipText = QT_TR_NOOP("Chamfer the selected edges of a shape");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_Chamfer";
}
void CmdPartChamfer::activated(int iMsg)
{
Gui::Control().showDialog(new PartGui::TaskChamferEdges(0));
}
bool CmdPartChamfer::isActive(void)
{
return (hasActiveDocument() && !Gui::Control().activeDialog());
}
//===========================================================================
// Part_Mirror
//===========================================================================
DEF_STD_CMD_A(CmdPartMirror);
CmdPartMirror::CmdPartMirror()
:Command("Part_Mirror")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Mirroring...");
sToolTipText = QT_TR_NOOP("Mirroring a selected shape");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_Mirror.svg";
}
void CmdPartMirror::activated(int iMsg)
{
Gui::Control().showDialog(new PartGui::TaskMirroring());
}
bool CmdPartMirror::isActive(void)
{
return (hasActiveDocument() && !Gui::Control().activeDialog());
}
//===========================================================================
// Part_CrossSections
//===========================================================================
DEF_STD_CMD_A(CmdPartCrossSections);
CmdPartCrossSections::CmdPartCrossSections()
:Command("Part_CrossSections")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Cross-sections...");
sToolTipText = QT_TR_NOOP("Cross-sections");
sWhatsThis = "Part_CrossSections";
sStatusTip = sToolTipText;
sPixmap = "Part_CrossSections";
}
void CmdPartCrossSections::activated(int iMsg)
{
Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
if (!dlg) {
std::vector<App::DocumentObject*> obj = Gui::Selection().getObjectsOfType
(Part::Feature::getClassTypeId());
Base::BoundBox3d bbox;
for (std::vector<App::DocumentObject*>::iterator it = obj.begin(); it != obj.end(); ++it) {
bbox.Add(static_cast<Part::Feature*>(*it)->Shape.getBoundingBox());
}
dlg = new PartGui::TaskCrossSections(bbox);
}
Gui::Control().showDialog(dlg);
}
bool CmdPartCrossSections::isActive(void)
{
return (Gui::Selection().countObjectsOfType(Part::Feature::getClassTypeId()) > 0 &&
!Gui::Control().activeDialog());
}
//===========================================================================
// Part_Builder
//===========================================================================
DEF_STD_CMD_A(CmdPartBuilder);
CmdPartBuilder::CmdPartBuilder()
:Command("Part_Builder")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Shape builder...");
sToolTipText = QT_TR_NOOP("Advanced utility to create shapes");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_Shapebuilder";
}
void CmdPartBuilder::activated(int iMsg)
{
Gui::Control().showDialog(new PartGui::TaskShapeBuilder());
}
bool CmdPartBuilder::isActive(void)
{
return (hasActiveDocument() && !Gui::Control().activeDialog());
}
//===========================================================================
// Part_Loft
//===========================================================================
DEF_STD_CMD_A(CmdPartLoft);
CmdPartLoft::CmdPartLoft()
: Command("Part_Loft")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Loft...");
sToolTipText = QT_TR_NOOP("Utility to loft");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_Loft";
}
void CmdPartLoft::activated(int iMsg)
{
Gui::Control().showDialog(new PartGui::TaskLoft());
}
bool CmdPartLoft::isActive(void)
{
return (hasActiveDocument() && !Gui::Control().activeDialog());
}
//===========================================================================
// Part_Sweep
//===========================================================================
DEF_STD_CMD_A(CmdPartSweep);
CmdPartSweep::CmdPartSweep()
: Command("Part_Sweep")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Sweep...");
sToolTipText = QT_TR_NOOP("Utility to sweep");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_Sweep";
}
void CmdPartSweep::activated(int iMsg)
{
Gui::Control().showDialog(new PartGui::TaskSweep());
}
bool CmdPartSweep::isActive(void)
{
return (hasActiveDocument() && !Gui::Control().activeDialog());
}
//===========================================================================
// Part_Offset
//===========================================================================
DEF_STD_CMD_A(CmdPartOffset);
CmdPartOffset::CmdPartOffset()
: Command("Part_Offset")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Offset...");
sToolTipText = QT_TR_NOOP("Utility to offset");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_Offset";
}
void CmdPartOffset::activated(int iMsg)
{
App::DocumentObject* shape = getSelection().getObjectsOfType(Part::Feature::getClassTypeId()).front();
std::string offset = getUniqueObjectName("Offset");
openCommand("Make Offset");
doCommand(Doc,"App.ActiveDocument.addObject(\"Part::Offset\",\"%s\")",offset.c_str());
doCommand(Doc,"App.ActiveDocument.%s.Source = App.ActiveDocument.%s" ,offset.c_str(), shape->getNameInDocument());
doCommand(Doc,"App.ActiveDocument.%s.Value = 1.0",offset.c_str());
updateActive();
//if (isActiveObjectValid())
// doCommand(Gui,"Gui.ActiveDocument.hide(\"%s\")",shape->getNameInDocument());
doCommand(Gui,"Gui.ActiveDocument.setEdit('%s')",offset.c_str());
//commitCommand();
adjustCameraPosition();
copyVisual(offset.c_str(), "ShapeColor", shape->getNameInDocument());
copyVisual(offset.c_str(), "LineColor" , shape->getNameInDocument());
copyVisual(offset.c_str(), "PointColor", shape->getNameInDocument());
}
bool CmdPartOffset::isActive(void)
{
Base::Type partid = Base::Type::fromName("Part::Feature");
bool objectsSelected = Gui::Selection().countObjectsOfType(partid) == 1;
return (objectsSelected && !Gui::Control().activeDialog());
}
//===========================================================================
// Part_Thickness
//===========================================================================
DEF_STD_CMD_A(CmdPartThickness);
CmdPartThickness::CmdPartThickness()
: Command("Part_Thickness")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Thickness...");
sToolTipText = QT_TR_NOOP("Utility to apply a thickness");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_Thickness";
}
void CmdPartThickness::activated(int iMsg)
{
Gui::SelectionFilter faceFilter ("SELECT Part::Feature SUBELEMENT Face COUNT 1..");
if (!faceFilter.match()) {
QMessageBox::warning(Gui::getMainWindow(),
QApplication::translate("CmdPartThickness", "Wrong selection"),
QApplication::translate("CmdPartThickness", "Selected one or more faces of a shape"));
return;
}
// get the selected object
const std::vector<Gui::SelectionObject>& result = faceFilter.Result[0];
std::string selection = result.front().getAsPropertyLinkSubString();
const Part::Feature* shape = static_cast<const Part::Feature*>(result.front().getObject());
if (shape->Shape.getValue().IsNull())
return;
int countSolids = 0;
TopExp_Explorer xp;
xp.Init(shape->Shape.getValue(),TopAbs_SOLID);
for (;xp.More(); xp.Next()) {
countSolids++;
}
if (countSolids != 1) {
QMessageBox::warning(Gui::getMainWindow(),
QApplication::translate("CmdPartThickness", "Wrong selection"),
QApplication::translate("CmdPartThickness", "Selected shape is not a solid"));
return;
}
std::string thick = getUniqueObjectName("Thickness");
openCommand("Make Thickness");
doCommand(Doc,"App.ActiveDocument.addObject(\"Part::Thickness\",\"%s\")",thick.c_str());
doCommand(Doc,"App.ActiveDocument.%s.Faces = %s" ,thick.c_str(), selection.c_str());
doCommand(Doc,"App.ActiveDocument.%s.Value = 1.0",thick.c_str());
updateActive();
if (isActiveObjectValid())
doCommand(Gui,"Gui.ActiveDocument.hide(\"%s\")",shape->getNameInDocument());
doCommand(Gui,"Gui.ActiveDocument.setEdit('%s')",thick.c_str());
//commitCommand();
adjustCameraPosition();
copyVisual(thick.c_str(), "ShapeColor", shape->getNameInDocument());
copyVisual(thick.c_str(), "LineColor" , shape->getNameInDocument());
copyVisual(thick.c_str(), "PointColor", shape->getNameInDocument());
}
bool CmdPartThickness::isActive(void)
{
Base::Type partid = Base::Type::fromName("Part::Feature");
bool objectsSelected = Gui::Selection().countObjectsOfType(partid) > 0;
return (objectsSelected && !Gui::Control().activeDialog());
}
//===========================================================================
// Part_ShapeInfo
//===========================================================================
DEF_STD_CMD_A(CmdShapeInfo);
CmdShapeInfo::CmdShapeInfo()
:Command("Part_ShapeInfo")
{
sAppModule = "Part";
sGroup = "Part";
sMenuText = "Shape info...";
sToolTipText = "Info about shape";
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_ShapeInfo";
}
void CmdShapeInfo::activated(int iMsg)
{
#if 0
static const char * const part_pipette[]={
"32 32 17 1",
"# c #000000",
"j c #080808",
"b c #101010",
"f c #1c1c1c",
"g c #4c4c4c",
"c c #777777",
"a c #848484",
"i c #9c9c9c",
"l c #b9b9b9",
"e c #cacaca",
"n c #d6d6d6",
"k c #dedede",
"d c #e7e7e7",
"m c #efefef",
"h c #f7f7f7",
"w c #ffffff",
". c None",
"................................",
".....................#####......",
"...................#######......",
"...................#########....",
"..................##########....",
"..................##########....",
"..................##########....",
".................###########....",
"...............#############....",
".............###############....",
".............#############......",
".............#############......",
"...............ab######.........",
"..............cdef#####.........",
".............ghdacf####.........",
"............#ehiacj####.........",
"............awiaaf####..........",
"...........iheacf##.............",
"..........#kdaag##..............",
".........gedaacb#...............",
".........lwiac##................",
".......#amlaaf##................",
".......cheaag#..................",
"......#ndaag##..................",
".....#imaacb#...................",
".....iwlacf#....................",
"....#nlaag##....................",
"....feaagj#.....................",
"....caag##......................",
"....ffbj##......................",
"................................",
"................................"};
Gui::Document* doc = Gui::Application::Instance->activeDocument();
Gui::View3DInventor* view = static_cast<Gui::View3DInventor*>(doc->getActiveView());
#endif
//if (view) {
// Gui::View3DInventorViewer* viewer = view->getViewer();
// viewer->setEditing(true);
// viewer->getWidget()->setCursor(QCursor(QPixmap(part_pipette),4,29));
// viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), PartGui::ViewProviderPart::shapeInfoCallback);
// }
}
bool CmdShapeInfo::isActive(void)
{
App::Document* doc = App::GetApplication().getActiveDocument();
if (!doc || doc->countObjectsOfType(Part::Feature::getClassTypeId()) == 0)
return false;
Gui::MDIView* view = Gui::getMainWindow()->activeWindow();
if (view && view->isDerivedFrom(Gui::View3DInventor::getClassTypeId())) {
Gui::View3DInventorViewer* viewer = static_cast<Gui::View3DInventor*>(view)->getViewer();
return !viewer->isEditing();
}
return false;
}
//===========================================================================
// Part_RuledSurface
//===========================================================================
DEF_STD_CMD_A(CmdPartRuledSurface);
CmdPartRuledSurface::CmdPartRuledSurface()
: Command("Part_RuledSurface")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Create ruled surface");
sToolTipText = QT_TR_NOOP("Create a ruled surface from either two Edges or two wires");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_RuledSurface";
}
void CmdPartRuledSurface::activated(int iMsg)
{
bool ok = false;
TopoDS_Shape curve1, curve2;
std::string link1, link2, obj1, obj2;
Gui::SelectionFilter edgeFilter ("SELECT Part::Feature SUBELEMENT Edge COUNT 1..2");
Gui::SelectionFilter wireFilter ("SELECT Part::Feature SUBELEMENT Wire COUNT 1..2");
Gui::SelectionFilter partFilter ("SELECT Part::Feature COUNT 2");
bool matchEdge = edgeFilter.match();
bool matchWire = wireFilter.match();
if (matchEdge || matchWire) {
// get the selected object
const std::vector<Gui::SelectionObject>& result = matchEdge
? edgeFilter.Result[0] : wireFilter.Result[0];
// two edges from one object
if (result.size() == 1) {
const Part::Feature* part = static_cast<const Part::Feature*>(result[0].getObject());
const std::vector<std::string>& edges = result[0].getSubNames();
if (edges.size() != 2) {
ok = false;
}
else {
ok = true;
// get the selected sub-shapes
const Part::TopoShape& shape = part->Shape.getValue();
curve1 = shape.getSubShape(edges[0].c_str());
curve2 = shape.getSubShape(edges[1].c_str());
obj1 = result[0].getObject()->getNameInDocument();
link1 = edges[0];
obj2 = result[0].getObject()->getNameInDocument();
link2 = edges[1];
}
}
// two objects and one edge per object
else if (result.size() == 2) {
const Part::Feature* part1 = static_cast<const Part::Feature*>(result[0].getObject());
const std::vector<std::string>& edges1 = result[0].getSubNames();
const Part::Feature* part2 = static_cast<const Part::Feature*>(result[1].getObject());
const std::vector<std::string>& edges2 = result[1].getSubNames();
if (edges1.size() != 1 || edges2.size() != 1) {
ok = false;
}
else {
ok = true;
const Part::TopoShape& shape1 = part1->Shape.getValue();
curve1 = shape1.getSubShape(edges1[0].c_str());
const Part::TopoShape& shape2 = part2->Shape.getValue();
curve2 = shape2.getSubShape(edges2[0].c_str());
obj1 = result[0].getObject()->getNameInDocument();
link1 = edges1[0];
obj2 = result[1].getObject()->getNameInDocument();
link2 = edges2[0];
}
}
}
else if (partFilter.match()) {
const std::vector<Gui::SelectionObject>& result = partFilter.Result[0];
const Part::Feature* part1 = static_cast<const Part::Feature*>(result[0].getObject());
const Part::Feature* part2 = static_cast<const Part::Feature*>(result[1].getObject());
const Part::TopoShape& shape1 = part1->Shape.getValue();
curve1 = shape1._Shape;
const Part::TopoShape& shape2 = part2->Shape.getValue();
curve2 = shape2._Shape;
obj1 = part1->getNameInDocument();
obj2 = part2->getNameInDocument();
if (!curve1.IsNull() && !curve2.IsNull()) {
if (curve1.ShapeType() == TopAbs_EDGE &&
curve2.ShapeType() == TopAbs_EDGE)
ok = true;
if (curve1.ShapeType() == TopAbs_WIRE &&
curve2.ShapeType() == TopAbs_WIRE)
ok = true;
}
}
if (!ok) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
QObject::tr("You have to select either two edges or two wires."));
return;
}
openCommand("Create ruled surface");
doCommand(Doc, "FreeCAD.ActiveDocument.addObject('Part::RuledSurface', 'Ruled Surface')");
doCommand(Doc, "FreeCAD.ActiveDocument.ActiveObject.Curve1=(FreeCAD.ActiveDocument.%s,['%s'])"
,obj1.c_str(), link1.c_str());
doCommand(Doc, "FreeCAD.ActiveDocument.ActiveObject.Curve2=(FreeCAD.ActiveDocument.%s,['%s'])"
,obj2.c_str(), link2.c_str());
commitCommand();
updateActive();
}
bool CmdPartRuledSurface::isActive(void)
{
return getActiveGuiDocument();
}
//===========================================================================
// Part_CheckGeometry
//===========================================================================
DEF_STD_CMD_A(CmdCheckGeometry);
CmdCheckGeometry::CmdCheckGeometry()
: Command("Part_CheckGeometry")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Check Geometry");
sToolTipText = QT_TR_NOOP("Analyzes Geometry For Errors");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_CheckGeometry";
}
void CmdCheckGeometry::activated(int iMsg)
{
Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
if (!dlg)
dlg = new PartGui::TaskCheckGeometryDialog();
Gui::Control().showDialog(dlg);
}
bool CmdCheckGeometry::isActive(void)
{
Base::Type partid = Base::Type::fromName("Part::Feature");
bool objectsSelected = Gui::Selection().countObjectsOfType(partid) > 0;
return (hasActiveDocument() && !Gui::Control().activeDialog() && objectsSelected);
}
//===========================================================================
// Part_ColorPerFace
//===========================================================================
DEF_STD_CMD_A(CmdColorPerFace);
CmdColorPerFace::CmdColorPerFace()
: Command("Part_ColorPerFace")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Color per face");
sToolTipText = QT_TR_NOOP("Set color per face");
sStatusTip = sToolTipText;
sWhatsThis = "Part_ColorPerFace";
}
void CmdColorPerFace::activated(int iMsg)
{
if (getActiveGuiDocument()->getInEdit())
getActiveGuiDocument()->resetEdit();
std::vector<App::DocumentObject*> sel = Gui::Selection().getObjectsOfType(Part::Feature::getClassTypeId());
Gui::ViewProvider* vp = Gui::Application::Instance->getViewProvider(sel.front());
// FIXME: Need a way to force 'Color' edit mode
// #0000477: Proper interface for edit modes of view provider
if (vp)
getActiveGuiDocument()->setEdit(vp, Gui::ViewProvider::Color);
}
bool CmdColorPerFace::isActive(void)
{
Base::Type partid = Base::Type::fromName("Part::Feature");
bool objectSelected = Gui::Selection().countObjectsOfType(partid) == 1;
return (hasActiveDocument() && !Gui::Control().activeDialog() && objectSelected);
}
//===========================================================================
// Part_Measure_Linear
//===========================================================================
DEF_STD_CMD_A(CmdMeasureLinear);
CmdMeasureLinear::CmdMeasureLinear()
: Command("Part_Measure_Linear")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Measure Linear");
sToolTipText = QT_TR_NOOP("Measure Linear");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_Measure_Linear";
}
void CmdMeasureLinear::activated(int iMsg)
{
PartGui::goDimensionLinearRoot();
}
bool CmdMeasureLinear::isActive(void)
{
return hasActiveDocument();
}
//===========================================================================
// Part_Measure_Angular
//===========================================================================
DEF_STD_CMD_A(CmdMeasureAngular);
CmdMeasureAngular::CmdMeasureAngular()
: Command("Part_Measure_Angular")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Measure Angular");
sToolTipText = QT_TR_NOOP("Measure Angular");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_Measure_Angular";
}
void CmdMeasureAngular::activated(int iMsg)
{
PartGui::goDimensionAngularRoot();
}
bool CmdMeasureAngular::isActive(void)
{
return hasActiveDocument();
}
//===========================================================================
// Part_Measure_Clear_All
//===========================================================================
DEF_STD_CMD_A(CmdMeasureClearAll);
CmdMeasureClearAll::CmdMeasureClearAll()
: Command("Part_Measure_Clear_All")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Clear All");
sToolTipText = QT_TR_NOOP("Clear All");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_Measure_Clear_All";
}
void CmdMeasureClearAll::activated(int iMsg)
{
PartGui::eraseAllDimensions();
}
bool CmdMeasureClearAll::isActive(void)
{
return hasActiveDocument();
}
//===========================================================================
// Part_Measure_Toggle_All
//===========================================================================
DEF_STD_CMD_A(CmdMeasureToggleAll);
CmdMeasureToggleAll::CmdMeasureToggleAll()
: Command("Part_Measure_Toggle_All")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Toggle All");
sToolTipText = QT_TR_NOOP("Toggle All");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_Measure_Toggle_All";
}
void CmdMeasureToggleAll::activated(int iMsg)
{
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("View");
bool visibility = group->GetBool("DimensionsVisible", true);
if (visibility)
group->SetBool("DimensionsVisible", false);
else
group->SetBool("DimensionsVisible", true);
}
bool CmdMeasureToggleAll::isActive(void)
{
return hasActiveDocument();
}
//===========================================================================
// Part_Measure_Toggle_3d
//===========================================================================
DEF_STD_CMD_A(CmdMeasureToggle3d);
CmdMeasureToggle3d::CmdMeasureToggle3d()
: Command("Part_Measure_Toggle_3d")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Toggle 3d");
sToolTipText = QT_TR_NOOP("Toggle 3d");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_Measure_Toggle_3d";
}
void CmdMeasureToggle3d::activated(int iMsg)
{
PartGui::toggle3d();
}
bool CmdMeasureToggle3d::isActive(void)
{
return hasActiveDocument();
}
//===========================================================================
// Part_Measure_Toggle_Delta
//===========================================================================
DEF_STD_CMD_A(CmdMeasureToggleDelta);
CmdMeasureToggleDelta::CmdMeasureToggleDelta()
: Command("Part_Measure_Toggle_Delta")
{
sAppModule = "Part";
sGroup = QT_TR_NOOP("Part");
sMenuText = QT_TR_NOOP("Toggle Delta");
sToolTipText = QT_TR_NOOP("Toggle Delta");
sWhatsThis = sToolTipText;
sStatusTip = sToolTipText;
sPixmap = "Part_Measure_Toggle_Delta";
}
void CmdMeasureToggleDelta::activated(int iMsg)
{
PartGui::toggleDelta();
}
bool CmdMeasureToggleDelta::isActive(void)
{
return hasActiveDocument();
}
void CreatePartCommands(void)
{
Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager();
rcCmdMgr.addCommand(new CmdPartMakeSolid());
rcCmdMgr.addCommand(new CmdPartReverseShape());
rcCmdMgr.addCommand(new CmdPartBoolean());
rcCmdMgr.addCommand(new CmdPartExtrude());
rcCmdMgr.addCommand(new CmdPartMirror());
rcCmdMgr.addCommand(new CmdPartRevolve());
rcCmdMgr.addCommand(new CmdPartCrossSections());
rcCmdMgr.addCommand(new CmdPartFillet());
rcCmdMgr.addCommand(new CmdPartChamfer());
rcCmdMgr.addCommand(new CmdPartCommon());
rcCmdMgr.addCommand(new CmdPartCut());
rcCmdMgr.addCommand(new CmdPartFuse());
rcCmdMgr.addCommand(new CmdPartCompound());
rcCmdMgr.addCommand(new CmdPartSection());
//rcCmdMgr.addCommand(new CmdPartBox2());
//rcCmdMgr.addCommand(new CmdPartBox3());
rcCmdMgr.addCommand(new CmdPartPrimitives());
rcCmdMgr.addCommand(new CmdPartImport());
rcCmdMgr.addCommand(new CmdPartExport());
rcCmdMgr.addCommand(new CmdPartImportCurveNet());
rcCmdMgr.addCommand(new CmdPartPickCurveNet());
rcCmdMgr.addCommand(new CmdShapeInfo());
rcCmdMgr.addCommand(new CmdPartRuledSurface());
rcCmdMgr.addCommand(new CmdPartBuilder());
rcCmdMgr.addCommand(new CmdPartLoft());
rcCmdMgr.addCommand(new CmdPartSweep());
rcCmdMgr.addCommand(new CmdPartOffset());
rcCmdMgr.addCommand(new CmdPartThickness());
rcCmdMgr.addCommand(new CmdCheckGeometry());
rcCmdMgr.addCommand(new CmdColorPerFace());
rcCmdMgr.addCommand(new CmdMeasureLinear());
rcCmdMgr.addCommand(new CmdMeasureAngular());
rcCmdMgr.addCommand(new CmdMeasureClearAll());
rcCmdMgr.addCommand(new CmdMeasureToggleAll());
rcCmdMgr.addCommand(new CmdMeasureToggle3d());
rcCmdMgr.addCommand(new CmdMeasureToggleDelta());
}