bool ViewProviderPythonFeatureImp::setEdit(int ModNum) { // Run the onChanged method of the proxy object. Base::PyGILStateLocker lock; try { App::Property* proxy = object->getPropertyByName("Proxy"); if (proxy && proxy->getTypeId() == App::PropertyPythonObject::getClassTypeId()) { Py::Object vp = static_cast<App::PropertyPythonObject*>(proxy)->getValue(); if (vp.hasAttr(std::string("setEdit"))) { if (vp.hasAttr("__object__")) { Py::Callable method(vp.getAttr(std::string("setEdit"))); Py::Tuple args(1); args.setItem(0, Py::Int(ModNum)); Py::Boolean ok(method.apply(args)); return (bool)ok; } else { Py::Callable method(vp.getAttr(std::string("setEdit"))); Py::Tuple args(2); args.setItem(0, Py::Object(object->getPyObject(), true)); args.setItem(1, Py::Int(ModNum)); Py::Boolean ok(method.apply(args)); return (bool)ok; } } } } catch (Py::Exception&) { Base::PyException e; // extract the Python error text const char* name = object->getObject()->Label.getValue(); Base::Console().Error("ViewProviderPythonFeature::setEdit (%s): %s\n", name, e.what()); } return false; }
void PythonGroupCommand::activated(int iMsg) { try { Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction); QList<QAction*> a = pcAction->actions(); assert(iMsg < a.size()); QAction* act = a[iMsg]; Base::PyGILStateLocker lock; Py::Object cmd(_pcPyCommand); if (cmd.hasAttr("Activated")) { Py::Callable call(cmd.getAttr("Activated")); Py::Tuple args(1); args.setItem(0, Py::Int(iMsg)); Py::Object ret = call.apply(args); } // If the command group doesn't implement the 'Activated' method then invoke the command directly else { Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager(); rcCmdMgr.runCommandByName(act->property("CommandName").toByteArray()); } // Since the default icon is reset when enabing/disabling the command we have // to explicitly set the icon of the used command. pcAction->setIcon(a[iMsg]->icon()); } catch(Py::Exception&) { Base::PyGILStateLocker lock; Base::PyException e; Base::Console().Error("Running the Python command '%s' failed:\n%s\n%s", sName, e.getStackTrace().c_str(), e.what()); } }
DocumentObjectExecReturn *FeaturePythonImp::execute() { // Run the execute method of the proxy object. Base::PyGILStateLocker lock; try { Property* proxy = object->getPropertyByName("Proxy"); if (proxy && proxy->getTypeId() == PropertyPythonObject::getClassTypeId()) { Py::Object feature = static_cast<PropertyPythonObject*>(proxy)->getValue(); if (feature.hasAttr("__object__")) { Py::Callable method(feature.getAttr(std::string("execute"))); Py::Tuple args(0); method.apply(args); } else { Py::Callable method(feature.getAttr(std::string("execute"))); Py::Tuple args(1); args.setItem(0, Py::Object(object->getPyObject(), true)); method.apply(args); } } } catch (Py::Exception&) { Base::PyException e; // extract the Python error text e.ReportException(); std::stringstream str; str << object->Label.getValue() << ": " << e.what(); return new App::DocumentObjectExecReturn(str.str()); } return DocumentObject::StdReturn; }
std::vector<App::DocumentObject*> ViewProviderPythonFeatureImp::claimChildren(const std::vector<App::DocumentObject*>& base) const { std::vector<App::DocumentObject*> children; Base::PyGILStateLocker lock; try { App::Property* proxy = object->getPropertyByName("Proxy"); if (proxy && proxy->getTypeId() == App::PropertyPythonObject::getClassTypeId()) { Py::Object vp = static_cast<App::PropertyPythonObject*>(proxy)->getValue(); if (vp.hasAttr(std::string("claimChildren"))) { Py::Callable method(vp.getAttr(std::string("claimChildren"))); Py::Tuple args(0); Py::Sequence list(method.apply(args)); for (Py::Sequence::iterator it = list.begin(); it != list.end(); ++it) { PyObject* item = (*it).ptr(); if (PyObject_TypeCheck(item, &(App::DocumentObjectPy::Type))) { App::DocumentObject* obj = static_cast<App::DocumentObjectPy*>(item)->getDocumentObjectPtr(); children.push_back(obj); } } } else { children = base; } } } catch (Py::Exception&) { Base::PyException e; // extract the Python error text Base::Console().Error("ViewProviderPythonFeature::claimChildren: %s\n", e.what()); } return children; }
void ViewProviderPythonFeatureImp::attach(App::DocumentObject *pcObject) { // Run the attach method of the proxy object. Base::PyGILStateLocker lock; try { App::Property* proxy = object->getPropertyByName("Proxy"); if (proxy && proxy->getTypeId() == App::PropertyPythonObject::getClassTypeId()) { Py::Object vp = static_cast<App::PropertyPythonObject*>(proxy)->getValue(); if (vp.hasAttr(std::string("attach"))) { if (vp.hasAttr("__object__")) { Py::Callable method(vp.getAttr(std::string("attach"))); Py::Tuple args(0); method.apply(args); } else { Py::Callable method(vp.getAttr(std::string("attach"))); Py::Tuple args(1); args.setItem(0, Py::Object(object->getPyObject(), true)); method.apply(args); } // #0000415: Now simulate a property change event to call // claimChildren if implemented. pcObject->Label.touch(); } } } catch (Py::Exception&) { Base::PyException e; // extract the Python error text const char* name = object->getObject()->Label.getValue(); Base::Console().Error("ViewProviderPythonFeature::attach (%s): %s\n", name, e.what()); } }
Action * PythonGroupCommand::createAction(void) { Gui::ActionGroup* pcAction = new Gui::ActionGroup(this, Gui::getMainWindow()); pcAction->setDropDownMenu(true); applyCommandData(this->getName(), pcAction); int defaultId = 0; try { Base::PyGILStateLocker lock; Py::Object cmd(_pcPyCommand); Py::Callable call(cmd.getAttr("GetCommands")); Py::Tuple args; Py::Tuple ret(call.apply(args)); for (Py::Tuple::iterator it = ret.begin(); it != ret.end(); ++it) { Py::String str(*it); QAction* cmd = pcAction->addAction(QString()); cmd->setProperty("CommandName", QByteArray(static_cast<std::string>(str).c_str())); } if (cmd.hasAttr("GetDefaultCommand")) { Py::Callable call2(cmd.getAttr("GetDefaultCommand")); Py::Int def(call2.apply(args)); defaultId = static_cast<int>(def); } } catch(Py::Exception&) { Base::PyGILStateLocker lock; Base::PyException e; Base::Console().Error("createAction() of the Python command '%s' failed:\n%s\n%s", sName, e.getStackTrace().c_str(), e.what()); } _pcAction = pcAction; languageChange(); if (strcmp(getResource("Pixmap"),"") != 0) { pcAction->setIcon(Gui::BitmapFactory().iconFromTheme(getResource("Pixmap"))); } else { QList<QAction*> a = pcAction->actions(); // if out of range then set to 0 if (defaultId < 0 || defaultId >= a.size()) defaultId = 0; if (a.size() > defaultId) pcAction->setIcon(a[defaultId]->icon()); } pcAction->setProperty("defaultAction", QVariant(defaultId)); return pcAction; }
QIcon ViewProviderPythonFeatureImp::getIcon() const { // default icon //static QPixmap px = BitmapFactory().pixmap("Tree_Python"); // Run the getIcon method of the proxy object. Base::PyGILStateLocker lock; try { App::Property* proxy = object->getPropertyByName("Proxy"); if (proxy && proxy->getTypeId() == App::PropertyPythonObject::getClassTypeId()) { Py::Object vp = static_cast<App::PropertyPythonObject*>(proxy)->getValue(); if (vp.hasAttr(std::string("getIcon"))) { Py::Callable method(vp.getAttr(std::string("getIcon"))); Py::Tuple args(0); Py::String str(method.apply(args)); std::string content = str.as_std_string(); QPixmap icon; // Check if the passed string is a filename, otherwise treat as xpm data QFileInfo fi(QString::fromAscii(content.c_str())); if (fi.isFile() && fi.exists()) { icon.load(fi.absoluteFilePath()); } else { QByteArray ary; int strlen = (int)content.size(); ary.resize(strlen); for (int j=0; j<strlen; j++) ary[j]=content[j]; // Make sure to remove crap around the XPM data QList<QByteArray> lines = ary.split('\n'); QByteArray buffer; buffer.reserve(ary.size()+lines.size()); for (QList<QByteArray>::iterator it = lines.begin(); it != lines.end(); ++it) { QByteArray trim = it->trimmed(); if (!trim.isEmpty()) { buffer.append(trim); buffer.append('\n'); } } icon.loadFromData(buffer, "XPM"); } if (!icon.isNull()) { return icon; } } } } catch (Py::Exception&) { Base::PyException e; // extract the Python error text Base::Console().Error("ViewProviderPythonFeature::getIcon: %s\n", e.what()); } return QIcon(); }
void TaskDialogPython::helpRequested() { Base::PyGILStateLocker lock; try { if (dlg.hasAttr(std::string("helpRequested"))) { Py::Callable method(dlg.getAttr(std::string("helpRequested"))); Py::Tuple args(0); method.apply(args); } } catch (Py::Exception&) { Base::PyException e; // extract the Python error text Base::Console().Error("TaskDialogPython::helpRequested: %s\n", e.what()); } }
void TaskDialogPython::clicked(int i) { Base::PyGILStateLocker lock; try { if (dlg.hasAttr(std::string("clicked"))) { Py::Callable method(dlg.getAttr(std::string("clicked"))); Py::Tuple args(1); args.setItem(0, Py::Int(i)); method.apply(args); } } catch (Py::Exception&) { Base::PyException e; // extract the Python error text Base::Console().Error("TaskDialogPython::clicked: %s\n", e.what()); } }
bool TaskDialogPython::needsFullSpace() const { Base::PyGILStateLocker lock; try { if (dlg.hasAttr(std::string("needsFullSpace"))) { Py::Callable method(dlg.getAttr(std::string("needsFullSpace"))); Py::Tuple args(0); Py::Boolean ret(method.apply(args)); return (bool)ret; } } catch (Py::Exception&) { Base::PyException e; // extract the Python error text Base::Console().Error("TaskDialogPython::needsFullSpace: %s\n", e.what()); } return TaskDialog::needsFullSpace(); }
QDialogButtonBox::StandardButtons TaskDialogPython::getStandardButtons(void) const { Base::PyGILStateLocker lock; try { if (dlg.hasAttr(std::string("getStandardButtons"))) { Py::Callable method(dlg.getAttr(std::string("getStandardButtons"))); Py::Tuple args(0); Py::Int ret(method.apply(args)); int value = (int)ret; return QDialogButtonBox::StandardButtons(value); } } catch (Py::Exception&) { Base::PyException e; // extract the Python error text Base::Console().Error("TaskDialogPython::getStandardButtons: %s\n", e.what()); } return TaskDialog::getStandardButtons(); }
bool TaskWatcherPython::shouldShow() { Base::PyGILStateLocker lock; try { if (watcher.hasAttr(std::string("shouldShow"))) { Py::Callable method(watcher.getAttr(std::string("shouldShow"))); Py::Tuple args(0); Py::Boolean ret(method.apply(args)); return (bool)ret; } } catch (Py::Exception&) { Base::PyException e; // extract the Python error text Base::Console().Error("TaskWatcherPython::shouldShow: %s\n", e.what()); } if (!this->Filter.empty()) return match(); else return TaskWatcher::shouldShow(); }
void slotChangedObject(const App::DocumentObject& Obj, const App::Property& Prop) { if (object == &Obj && Prop.getTypeId() == Part::PropertyGeometryList::getClassTypeId()) { const Part::PropertyGeometryList& geom = static_cast<const Part::PropertyGeometryList&>(Prop); const std::vector<Part::Geometry*>& items = geom.getValues(); if (items.size() != 2) return; Part::Geometry* g1 = items[0]; Part::Geometry* g2 = items[1]; if (!g1 || g1->getTypeId() != Part::GeomArcOfCircle::getClassTypeId()) return; if (!g2 || g2->getTypeId() != Part::GeomLineSegment::getClassTypeId()) return; Part::GeomArcOfCircle* arc = static_cast<Part::GeomArcOfCircle*>(g1); Part::GeomLineSegment* seg = static_cast<Part::GeomLineSegment*>(g2); try { Base::Vector3d m1 = arc->getCenter(); //Base::Vector3d a3 = arc->getStartPoint(); Base::Vector3d a3 = arc->getEndPoint(true); //Base::Vector3d l1 = seg->getStartPoint(); Base::Vector3d l2 = seg->getEndPoint(); #if 0 Py::Module pd("FilletArc"); Py::Callable method(pd.getAttr(std::string("makeFilletArc"))); Py::Callable vector(pd.getAttr(std::string("Vector"))); Py::Tuple xyz(3); Py::Tuple args(6); xyz.setItem(0, Py::Float(m1.x)); xyz.setItem(1, Py::Float(m1.y)); xyz.setItem(2, Py::Float(m1.z)); args.setItem(0,vector.apply(xyz)); xyz.setItem(0, Py::Float(a3.x)); xyz.setItem(1, Py::Float(a3.y)); xyz.setItem(2, Py::Float(a3.z)); args.setItem(1,vector.apply(xyz)); xyz.setItem(0, Py::Float(l2.x)); xyz.setItem(1, Py::Float(l2.y)); xyz.setItem(2, Py::Float(l2.z)); args.setItem(2,vector.apply(xyz)); xyz.setItem(0, Py::Float((float)0)); xyz.setItem(1, Py::Float((float)0)); xyz.setItem(2, Py::Float((float)1)); args.setItem(3,vector.apply(xyz)); args.setItem(4,Py::Float(radius)); args.setItem(5,Py::Int((int)0)); Py::Tuple ret(method.apply(args)); Py::Object S1(ret.getItem(0)); Py::Object S2(ret.getItem(1)); Py::Object M2(ret.getItem(2)); Base::Vector3d s1, s2, m2; s1.x = (double)Py::Float(S1.getAttr("x")); s1.y = (double)Py::Float(S1.getAttr("y")); s1.z = (double)Py::Float(S1.getAttr("z")); s2.x = (double)Py::Float(S2.getAttr("x")); s2.y = (double)Py::Float(S2.getAttr("y")); s2.z = (double)Py::Float(S2.getAttr("z")); m2.x = (double)Py::Float(M2.getAttr("x")); m2.y = (double)Py::Float(M2.getAttr("y")); m2.z = (double)Py::Float(M2.getAttr("z")); coords->point.set1Value(0, (float)s1.x,(float)s1.y,(float)s1.z); coords->point.set1Value(1, (float)m2.x,(float)m2.y,(float)m2.z); coords->point.set1Value(2, (float)s2.x,(float)s2.y,(float)s2.z); Base::Console().Message("M1=<%.4f,%.4f>\n", m1.x,m1.y); Base::Console().Message("M2=<%.4f,%.4f>\n", m2.x,m2.y); Base::Console().Message("S1=<%.4f,%.4f>\n", s1.x,s1.y); Base::Console().Message("S2=<%.4f,%.4f>\n", s2.x,s2.y); Base::Console().Message("P=<%.4f,%.4f>\n", a3.x,a3.y); Base::Console().Message("Q=<%.4f,%.4f>\n", l2.x,l2.y); Base::Console().Message("\n"); #else Py::Module pd("PartDesign"); Py::Callable method(pd.getAttr(std::string("makeFilletArc"))); Py::Tuple args(6); args.setItem(0,Py::Vector(m1)); args.setItem(1,Py::Vector(a3)); args.setItem(2,Py::Vector(l2)); args.setItem(3,Py::Vector(Base::Vector3d(0,0,1))); args.setItem(4,Py::Float(radius)); //args.setItem(5,Py::Int((int)0)); args.setItem(5,Py::Int((int)1)); Py::Tuple ret(method.apply(args)); Py::Vector S1(ret.getItem(0)); Py::Vector S2(ret.getItem(1)); Py::Vector M2(ret.getItem(2)); Base::Vector3d s1 = S1.toVector(); Base::Vector3d s2 = S2.toVector(); Base::Vector3d m2 = M2.toVector(); coords->point.set1Value(0, (float)s1.x,(float)s1.y,(float)s1.z); coords->point.set1Value(1, (float)m2.x,(float)m2.y,(float)m2.z); coords->point.set1Value(2, (float)s2.x,(float)s2.y,(float)s2.z); Base::Console().Message("M1=<%.4f,%.4f>\n", m1.x,m1.y); Base::Console().Message("M2=<%.4f,%.4f>\n", m2.x,m2.y); Base::Console().Message("S1=<%.4f,%.4f>\n", s1.x,s1.y); Base::Console().Message("S2=<%.4f,%.4f>\n", s2.x,s2.y); Base::Console().Message("P=<%.4f,%.4f>\n", a3.x,a3.y); Base::Console().Message("Q=<%.4f,%.4f>\n", l2.x,l2.y); Base::Console().Message("\n"); #endif } catch (Py::Exception&) { Base::PyException e; // extract the Python error text Base::Console().Error("%s\n", e.what()); } } }
void ViewProviderPythonFeatureImp::updateData(const App::Property* prop) { // Run the updateData method of the proxy object. Base::PyGILStateLocker lock; try { App::Property* proxy = object->getPropertyByName("Proxy"); if (proxy && proxy->getTypeId() == App::PropertyPythonObject::getClassTypeId()) { Py::Object vp = static_cast<App::PropertyPythonObject*>(proxy)->getValue(); if (vp.hasAttr(std::string("updateData"))) { if (vp.hasAttr("__object__")) { Py::Callable method(vp.getAttr(std::string("updateData"))); Py::Tuple args(1); const char* prop_name = object->getObject()->getName(prop); if (prop_name) { args.setItem(0, Py::String(prop_name)); method.apply(args); } } else { Py::Callable method(vp.getAttr(std::string("updateData"))); Py::Tuple args(2); args.setItem(0, Py::Object(object->getObject()->getPyObject(), true)); const char* prop_name = object->getObject()->getName(prop); if (prop_name) { args.setItem(1, Py::String(prop_name)); method.apply(args); } } } } } catch (Py::Exception&) { Base::PyException e; // extract the Python error text const char* name = object->getObject()->Label.getValue(); Base::Console().Error("ViewProviderPythonFeature::updateData (%s): %s\n", name, e.what()); } }
std::vector<std::string> ViewProviderPythonFeatureImp::getDisplayModes(void) const { // Run the getDisplayModes method of the proxy object. Base::PyGILStateLocker lock; std::vector<std::string> modes; try { App::Property* proxy = object->getPropertyByName("Proxy"); if (proxy && proxy->getTypeId() == App::PropertyPythonObject::getClassTypeId()) { Py::Object vp = static_cast<App::PropertyPythonObject*>(proxy)->getValue(); if (vp.hasAttr(std::string("getDisplayModes"))) { if (vp.hasAttr("__object__")) { Py::Callable method(vp.getAttr(std::string("getDisplayModes"))); Py::Tuple args(0); Py::List list(method.apply(args)); for (Py::List::iterator it = list.begin(); it != list.end(); ++it) { Py::String str(*it); modes.push_back(str.as_std_string()); } } else { Py::Callable method(vp.getAttr(std::string("getDisplayModes"))); Py::Tuple args(1); args.setItem(0, Py::Object(object->getPyObject(), true)); Py::List list(method.apply(args)); for (Py::List::iterator it = list.begin(); it != list.end(); ++it) { Py::String str(*it); modes.push_back(str.as_std_string()); } } } } } catch (Py::Exception&) { Base::PyException e; // extract the Python error text const char* name = object->getObject()->Label.getValue(); Base::Console().Error("ViewProviderPythonFeature::getDisplayModes (%s): %s\n", name, e.what()); } return modes; }
const char* ViewProviderPythonFeatureImp::getDefaultDisplayMode() const { // Run the getDefaultDisplayMode method of the proxy object. Base::PyGILStateLocker lock; static std::string mode; try { App::Property* proxy = object->getPropertyByName("Proxy"); if (proxy && proxy->getTypeId() == App::PropertyPythonObject::getClassTypeId()) { Py::Object vp = static_cast<App::PropertyPythonObject*>(proxy)->getValue(); if (vp.hasAttr(std::string("getDefaultDisplayMode"))) { Py::Callable method(vp.getAttr(std::string("getDefaultDisplayMode"))); Py::Tuple args(0); Py::String str(method.apply(args)); if (str.isUnicode()) str = str.encode("ascii"); // json converts strings into unicode mode = str.as_std_string(); return mode.c_str(); } } } catch (Py::Exception&) { Base::PyException e; // extract the Python error text const char* name = object->getObject()->Label.getValue(); Base::Console().Error("ViewProviderPythonFeature::getDefaultDisplayMode (%s): %s\n", name, e.what()); } return 0; }
std::string ViewProviderPythonFeatureImp::setDisplayMode(const char* ModeName) { // Run the setDisplayMode method of the proxy object. Base::PyGILStateLocker lock; try { App::Property* proxy = object->getPropertyByName("Proxy"); if (proxy && proxy->getTypeId() == App::PropertyPythonObject::getClassTypeId()) { Py::Object vp = static_cast<App::PropertyPythonObject*>(proxy)->getValue(); if (vp.hasAttr(std::string("setDisplayMode"))) { Py::Callable method(vp.getAttr(std::string("setDisplayMode"))); Py::Tuple args(1); args.setItem(0, Py::String(ModeName)); Py::String str(method.apply(args)); return str.as_std_string(); } } } catch (Py::Exception&) { Base::PyException e; // extract the Python error text const char* name = object->getObject()->Label.getValue(); Base::Console().Error("ViewProviderPythonFeature::setDisplayMode (%s): %s\n", name, e.what()); } return ModeName; }