| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #ifndef ASSEMBLYGUI_VIEWPROVIDER_ViewProviderAssembly_H |
| #define ASSEMBLYGUI_VIEWPROVIDER_ViewProviderAssembly_H |
|
|
| #include <QCoreApplication> |
| #include <fastsignals/signal.h> |
|
|
| #include <Mod/Assembly/AssemblyGlobal.h> |
|
|
| #include <Gui/Selection/Selection.h> |
| #include <Gui/ViewProviderPart.h> |
|
|
| class SoSwitch; |
| class SoSensor; |
| class SoDragger; |
| class SoFieldSensor; |
|
|
| namespace Gui |
| { |
| class SoTransformDragger; |
| class View3DInventorViewer; |
| } |
|
|
| namespace AssemblyGui |
| { |
| class TaskAssemblyMessages; |
|
|
| struct MovingObject |
| { |
| App::DocumentObject* obj; |
| Base::Placement plc; |
| App::PropertyXLinkSub* ref; |
| App::DocumentObject* rootObj; |
| const std::string sub; |
|
|
| |
| MovingObject( |
| App::DocumentObject* o, |
| const Base::Placement& p, |
| App::DocumentObject* ro, |
| const std::string& s |
| ) |
| : obj(o) |
| , plc(p) |
| , ref(nullptr) |
| , rootObj(ro) |
| , sub(s) |
| {} |
|
|
| |
| MovingObject() |
| : obj(nullptr) |
| , ref(nullptr) |
| , rootObj(nullptr) |
| {} |
|
|
| ~MovingObject() |
| {} |
| }; |
|
|
| class AssemblyGuiExport ViewProviderAssembly: public Gui::ViewProviderPart, |
| public Gui::SelectionObserver |
| { |
| Q_DECLARE_TR_FUNCTIONS(AssemblyGui::ViewProviderAssembly) |
| PROPERTY_HEADER_WITH_OVERRIDE(AssemblyGui::ViewProviderAssembly); |
|
|
| enum class DragMode |
| { |
| Translation, |
| TranslationNoSolve, |
| TranslationOnAxis, |
| TranslationOnPlane, |
| Rotation, |
| RotationOnPlane, |
| TranslationOnAxisAndRotationOnePlane, |
| Ball, |
| None, |
| }; |
|
|
| public: |
| enum class IsolateMode |
| { |
| Transparent, |
| Wireframe, |
| Hidden, |
| }; |
|
|
| ViewProviderAssembly(); |
| ~ViewProviderAssembly() override; |
|
|
| |
| QIcon getIcon() const override; |
|
|
| bool doubleClicked() override; |
| void setupContextMenu(QMenu* menu, QObject* receiver, const char* member) override; |
| bool onDelete(const std::vector<std::string>& subNames) override; |
| bool canDelete(App::DocumentObject* obj) const override; |
|
|
| void updateData(const App::Property*) override; |
|
|
| |
| |
| bool setEdit(int ModNum) override; |
| void unsetEdit(int ModNum) override; |
| void setEditViewer(Gui::View3DInventorViewer*, int ModNum) override; |
| bool isInEditMode() const; |
|
|
| |
| bool acceptDeletionsInEdit() override |
| { |
| return true; |
| } |
|
|
| bool canDragObject(App::DocumentObject*) const override; |
| bool canDragObjectToTarget(App::DocumentObject* obj, App::DocumentObject* target) const override; |
|
|
| App::DocumentObject* getActivePart() const; |
|
|
|
|
| |
| bool keyPressed(bool pressed, int key) override; |
| |
| bool mouseMove(const SbVec2s& cursorPos, Gui::View3DInventorViewer* viewer) override; |
| |
| bool mouseButtonPressed( |
| int Button, |
| bool pressed, |
| const SbVec2s& cursorPos, |
| const Gui::View3DInventorViewer* viewer |
| ) override; |
| |
| void doubleClickedIn3dView(); |
|
|
|
|
| |
| DragMode findDragMode(); |
| void initMove(const SbVec2s& cursorPos, Gui::View3DInventorViewer* viewer); |
| void endMove(); |
| virtual void setEnableMovement(bool enable = true) |
| { |
| enableMovement = enable; |
| } |
| virtual bool getEnableMovement() const |
| { |
| return enableMovement; |
| } |
| virtual void setMoveOnlyPreselected(bool enable = true) |
| { |
| moveOnlyPreselected = enable; |
| } |
| virtual bool getMoveOnlyPreselected() const |
| { |
| return moveOnlyPreselected; |
| } |
| virtual void setMoveInCommand(bool enable = true) |
| { |
| moveInCommand = enable; |
| } |
| virtual bool getMoveInCommand() const |
| { |
| return moveInCommand; |
| } |
|
|
|
|
| bool canDragObjectIn3d(App::DocumentObject* obj) const; |
| bool getSelectedObjectsWithinAssembly(bool addPreselection = true, bool onlySolids = false); |
| App::DocumentObject* getSelectedJoint(); |
|
|
| |
| PyObject* getPyObject() override; |
|
|
| |
| |
| |
|
|
| void onSelectionChanged(const Gui::SelectionChanges& msg) override; |
|
|
| |
| void initMoveDragger(); |
| void endMoveDragger(); |
| static void draggerMotionCallback(void* data, SoDragger* d); |
|
|
| void setDragger(); |
| void unsetDragger(); |
| void setDraggerVisibility(bool val); |
| bool getDraggerVisibility(); |
| void setDraggerPlacement(Base::Placement plc); |
| Base::Placement getDraggerPlacement(); |
| Gui::SoTransformDragger* getDragger(); |
|
|
| static Base::Vector3d getCenterOfBoundingBox(const std::vector<MovingObject>& movingObjs); |
|
|
| void UpdateSolverInformation(); |
|
|
| void isolateComponents(std::set<App::DocumentObject*>& parts, IsolateMode mode); |
| void isolateJointReferences(App::DocumentObject* joint, IsolateMode mode = IsolateMode::Transparent); |
| void clearIsolate(); |
|
|
| DragMode dragMode; |
| bool canStartDragging; |
| bool partMoving; |
| bool enableMovement; |
| bool moveOnlyPreselected; |
| bool moveInCommand; |
| bool ctrlPressed; |
|
|
| long lastClickTime; |
|
|
| int numberOfSel; |
| Base::Vector3d prevPosition; |
| Base::Vector3d initialPosition; |
| Base::Vector3d initialPositionRot; |
| Base::Placement jcsPlc; |
| Base::Placement jcsGlobalPlc; |
| Base::Placement draggerInitPlc; |
|
|
| App::DocumentObject* movingJoint; |
|
|
| std::vector<std::pair<App::DocumentObject*, bool>> jointVisibilitiesBackup; |
| std::vector<std::pair<App::DocumentObject*, double>> objectMasses; |
| std::vector<MovingObject> docsToMove; |
|
|
| Gui::SoTransformDragger* asmDragger = nullptr; |
| SoSwitch* asmDraggerSwitch = nullptr; |
| SoFieldSensor* translationSensor = nullptr; |
| SoFieldSensor* rotationSensor = nullptr; |
|
|
| fastsignals::signal< |
| void(const QString& state, const QString& msg, const QString& url, const QString& linkText)> |
| signalSetUp; |
|
|
| private: |
| bool tryMouseMove(const SbVec2s& cursorPos, Gui::View3DInventorViewer* viewer); |
| void tryInitMove(const SbVec2s& cursorPos, Gui::View3DInventorViewer* viewer); |
|
|
| void collectMovableObjects( |
| App::DocumentObject* selRoot, |
| const std::string& subNamePrefix, |
| App::DocumentObject* currentObject, |
| bool onlySolids |
| ); |
|
|
| void slotAboutToOpenTransaction(const std::string& cmdName); |
|
|
| struct ComponentState |
| { |
| bool visibility; |
| bool selectable; |
| |
| bool overrideMaterial; |
| App::Material shapeMaterial; |
| }; |
|
|
| std::unordered_map<App::DocumentObject*, ComponentState> stateBackup; |
| App::DocumentObject* isolatedJoint {nullptr}; |
| bool isolatedJointVisibilityBackup {false}; |
|
|
| void applyIsolationRecursively( |
| App::DocumentObject* current, |
| std::set<App::DocumentObject*>& isolateSet, |
| IsolateMode mode, |
| std::set<App::DocumentObject*>& visited |
| ); |
|
|
| fastsignals::connection connectSolverUpdate; |
| fastsignals::scoped_connection m_preTransactionConn; |
| }; |
|
|
| } |
|
|
| #endif |
|
|