void TransformStrategy::resetViewTransform(App::DocumentObject* obj) { Gui::Document* doc = Gui::Application::Instance->getDocument(obj->getDocument()); std::map<std::string,App::Property*> props; obj->getPropertyMap(props); // search for the placement property std::map<std::string,App::Property*>::iterator jt; jt = std::find_if(props.begin(), props.end(), find_transform()); if (jt != props.end()) { Base::Placement local = static_cast<App::PropertyPlacement*>(jt->second)->getValue(); Gui::ViewProvider* vp = doc->getViewProvider(obj); if (vp) vp->setTransformation(local.toMatrix()); } else { // No placement found Gui::ViewProvider* vp = doc->getViewProvider(obj); if (vp) vp->setTransformation(Base::Matrix4D()); } }
void Transform::on_applyButton_clicked() { Gui::WaitCursor wc; Base::Placement plm = this->getPlacementData(); Base::Matrix4D mat = plm.toMatrix(); strategy->commitTransform(mat); // nullify the values QList<Gui::QuantitySpinBox*> sb = this->findChildren<Gui::QuantitySpinBox*>(); for (QList<Gui::QuantitySpinBox*>::iterator it = sb.begin(); it != sb.end(); ++it) { (*it)->blockSignals(true); (*it)->setValue(0.0); (*it)->blockSignals(false); } Base::Vector3d cnt = strategy->getRotationCenter(); ui->xCnt->setValue(Base::Quantity(cnt.x, Base::Unit::Length)); ui->yCnt->setValue(Base::Quantity(cnt.y, Base::Unit::Length)); ui->zCnt->setValue(Base::Quantity(cnt.z, Base::Unit::Length)); }
void ViewProvider2DObject::updateData(const App::Property* prop) { ViewProviderPart::updateData(prop); if (prop->getTypeId() == Part::PropertyPartShape::getClassTypeId()) { Base::BoundBox3d bbox = static_cast<const Part::PropertyPartShape*>(prop)->getBoundingBox(); if (!bbox.IsValid()) return; GridRoot->removeAllChildren(); Base::Placement place = static_cast<const Part::PropertyPartShape*>(prop)->getComplexData()->getPlacement(); place.invert(); Base::ViewProjMatrix proj(place.toMatrix()); Base::BoundBox2D bbox2d = bbox.ProjectBox(&proj); this->MinX = bbox2d.fMinX; this->MaxX = bbox2d.fMaxX; this->MinY = bbox2d.fMinY; this->MaxY = bbox2d.fMaxY; if (ShowGrid.getValue()) { createGrid(); } } }
void Placement::revertTransformation() { for (std::set<std::string>::iterator it = documents.begin(); it != documents.end(); ++it) { Gui::Document* document = Application::Instance->getDocument(it->c_str()); if (!document) continue; std::vector<App::DocumentObject*> obj = document->getDocument()-> getObjectsOfType(App::DocumentObject::getClassTypeId()); if (!obj.empty()) { for (std::vector<App::DocumentObject*>::iterator it=obj.begin();it!=obj.end();++it) { std::map<std::string,App::Property*> props; (*it)->getPropertyMap(props); // search for the placement property std::map<std::string,App::Property*>::iterator jt; jt = std::find_if(props.begin(), props.end(), find_placement(this->propertyName)); if (jt != props.end()) { Base::Placement cur = static_cast<App::PropertyPlacement*>(jt->second)->getValue(); Gui::ViewProvider* vp = document->getViewProvider(*it); if (vp) vp->setTransformation(cur.toMatrix()); } } } } }
void ComplexGeoData::setPlacement(const Base::Placement& rclPlacement) { setTransform(rclPlacement.toMatrix()); }
void Placement::applyPlacement(const Base::Placement& p, bool incremental, bool data) { Gui::Document* document = Application::Instance->activeDocument(); if (!document) return; std::vector<App::DocumentObject*> sel = Gui::Selection().getObjectsOfType (App::DocumentObject::getClassTypeId(), document->getDocument()->getName()); if (!sel.empty()) { if (data) { document->openCommand("Placement"); for (std::vector<App::DocumentObject*>::iterator it=sel.begin();it!=sel.end();++it) { std::map<std::string,App::Property*> props; (*it)->getPropertyMap(props); // search for the placement property std::map<std::string,App::Property*>::iterator jt; jt = std::find_if(props.begin(), props.end(), find_placement(this->propertyName)); if (jt != props.end()) { Base::Placement cur = static_cast<App::PropertyPlacement*>(jt->second)->getValue(); if (incremental) cur = p * cur; else cur = p; Base::Vector3d pos = cur.getPosition(); const Base::Rotation& rt = cur.getRotation(); QString cmd = QString::fromAscii( "App.getDocument(\"%1\").%2.Placement=" "App.Placement(" "App.Vector(%3,%4,%5)," "App.Rotation(%6,%7,%8,%9))\n") .arg(QLatin1String((*it)->getDocument()->getName())) .arg(QLatin1String((*it)->getNameInDocument())) .arg(pos.x,0,'g',6) .arg(pos.y,0,'g',6) .arg(pos.z,0,'g',6) .arg(rt[0],0,'g',6) .arg(rt[1],0,'g',6) .arg(rt[2],0,'g',6) .arg(rt[3],0,'g',6); Application::Instance->runPythonCode((const char*)cmd.toAscii()); } } document->commitCommand(); try { document->getDocument()->recompute(); } catch (...) { } } // apply transformation only on view matrix not on placement property else { for (std::vector<App::DocumentObject*>::iterator it=sel.begin();it!=sel.end();++it) { std::map<std::string,App::Property*> props; (*it)->getPropertyMap(props); // search for the placement property std::map<std::string,App::Property*>::iterator jt; jt = std::find_if(props.begin(), props.end(), find_placement(this->propertyName)); if (jt != props.end()) { Base::Placement cur = static_cast<App::PropertyPlacement*>(jt->second)->getValue(); if (incremental) cur = p * cur; else cur = p; Gui::ViewProvider* vp = document->getViewProvider(*it); if (vp) vp->setTransformation(cur.toMatrix()); } } } } else { Base::Console().Warning("No object selected.\n"); } }
void ViewProviderDragger::updatePlacementFromDragger(ViewProviderDragger* sudoThis, SoFCCSysDragger* draggerIn) { App::DocumentObject *genericObject = sudoThis->getObject(); if (!genericObject->isDerivedFrom(App::GeoFeature::getClassTypeId())) return; App::GeoFeature *geoFeature = static_cast<App::GeoFeature *>(genericObject); Base::Placement originalPlacement = geoFeature->Placement.getValue(); double pMatrix[16]; originalPlacement.toMatrix().getMatrix(pMatrix); Base::Placement freshPlacement = originalPlacement; //local cache for brevity. double translationIncrement = draggerIn->translationIncrement.getValue(); double rotationIncrement = draggerIn->rotationIncrement.getValue(); int tCountX = draggerIn->translationIncrementCountX.getValue(); int tCountY = draggerIn->translationIncrementCountY.getValue(); int tCountZ = draggerIn->translationIncrementCountZ.getValue(); int rCountX = draggerIn->rotationIncrementCountX.getValue(); int rCountY = draggerIn->rotationIncrementCountY.getValue(); int rCountZ = draggerIn->rotationIncrementCountZ.getValue(); //just as a little sanity check make sure only 1 field has changed. int numberOfFieldChanged = 0; if (tCountX) numberOfFieldChanged++; if (tCountY) numberOfFieldChanged++; if (tCountZ) numberOfFieldChanged++; if (rCountX) numberOfFieldChanged++; if (rCountY) numberOfFieldChanged++; if (rCountZ) numberOfFieldChanged++; if (numberOfFieldChanged == 0) return; assert(numberOfFieldChanged == 1); //helper lamdas. auto getVectorX = [&pMatrix]() {return Base::Vector3d(pMatrix[0], pMatrix[4], pMatrix[8]);}; auto getVectorY = [&pMatrix]() {return Base::Vector3d(pMatrix[1], pMatrix[5], pMatrix[9]);}; auto getVectorZ = [&pMatrix]() {return Base::Vector3d(pMatrix[2], pMatrix[6], pMatrix[10]);}; if (tCountX) { Base::Vector3d movementVector(getVectorX()); movementVector *= (tCountX * translationIncrement); freshPlacement.move(movementVector); geoFeature->Placement.setValue(freshPlacement); } else if (tCountY) { Base::Vector3d movementVector(getVectorY()); movementVector *= (tCountY * translationIncrement); freshPlacement.move(movementVector); geoFeature->Placement.setValue(freshPlacement); } else if (tCountZ) { Base::Vector3d movementVector(getVectorZ()); movementVector *= (tCountZ * translationIncrement); freshPlacement.move(movementVector); geoFeature->Placement.setValue(freshPlacement); } else if (rCountX) { Base::Vector3d rotationVector(getVectorX()); Base::Rotation rotation(rotationVector, rCountX * rotationIncrement); freshPlacement.setRotation(rotation * freshPlacement.getRotation()); geoFeature->Placement.setValue(freshPlacement); } else if (rCountY) { Base::Vector3d rotationVector(getVectorY()); Base::Rotation rotation(rotationVector, rCountY * rotationIncrement); freshPlacement.setRotation(rotation * freshPlacement.getRotation()); geoFeature->Placement.setValue(freshPlacement); } else if (rCountZ) { Base::Vector3d rotationVector(getVectorZ()); Base::Rotation rotation(rotationVector, rCountZ * rotationIncrement); freshPlacement.setRotation(rotation * freshPlacement.getRotation()); geoFeature->Placement.setValue(freshPlacement); } draggerIn->clearIncrementCounts(); }