163 lines
6.0 KiB
C++
163 lines
6.0 KiB
C++
/***************************************************************************
|
|
* Copyright (c) 2017 Werner Mayer <wmayer[at]users.sourceforge.net> *
|
|
* *
|
|
* 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 *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
|
|
#ifndef GUI_VIEWPROVIDER_DRAGGER_H
|
|
#define GUI_VIEWPROVIDER_DRAGGER_H
|
|
|
|
#include "ViewProviderDocumentObject.h"
|
|
#include <Base/Placement.h>
|
|
#include <App/PropertyGeo.h>
|
|
#include <Base/Bitmask.h>
|
|
|
|
class SoDragger;
|
|
class SoTransform;
|
|
|
|
namespace Gui {
|
|
|
|
namespace TaskView {
|
|
class TaskDialog;
|
|
}
|
|
|
|
class SoTransformDragger;
|
|
class View3DInventorViewer;
|
|
class GizmoContainer;
|
|
|
|
/**
|
|
* The base class for all view providers modifying the placement
|
|
* of a geometric feature.
|
|
* @author Werner Mayer
|
|
*/
|
|
class GuiExport ViewProviderDragger : public ViewProviderDocumentObject
|
|
{
|
|
PROPERTY_HEADER_WITH_OVERRIDE(Gui::ViewProviderDragger);
|
|
|
|
public:
|
|
/// constructor.
|
|
ViewProviderDragger();
|
|
|
|
/// destructor.
|
|
~ViewProviderDragger() override;
|
|
|
|
/// Origin used when object is transformed. It temporarily changes the origin of object.
|
|
/// Dragger is normally placed at the transform origin, unless explicitly overridden via
|
|
/// ViewProviderDragger#setDraggerPlacement() method.
|
|
App::PropertyPlacement TransformOrigin;
|
|
|
|
void attach(App::DocumentObject* pcObject) override;
|
|
|
|
/// Convenience method to obtain the transform origin
|
|
Base::Placement getTransformOrigin() const { return TransformOrigin.getValue(); }
|
|
/// Convenience method to set the transform origin
|
|
void setTransformOrigin(const Base::Placement& placement);
|
|
/// Resets transform origin to the object origin
|
|
void resetTransformOrigin();
|
|
|
|
void setGizmoContainer(Gui::GizmoContainer* gizmoContainer);
|
|
|
|
public:
|
|
/** @name Edit methods */
|
|
//@{
|
|
bool doubleClicked() override;
|
|
void setupContextMenu(QMenu*, QObject*, const char*) override;
|
|
void updateData(const App::Property*) override;
|
|
|
|
ViewProvider *startEditing(int ModNum=0) override;
|
|
|
|
/*! synchronize From FC placement to Coin placement*/
|
|
static void updateTransform(const Base::Placement &from, SoTransform *to);
|
|
|
|
enum class DraggerComponent
|
|
{
|
|
None = 0,
|
|
XPos = 1 << 0,
|
|
YPos = 1 << 1,
|
|
ZPos = 1 << 2,
|
|
XRot = 1 << 3,
|
|
YRot = 1 << 4,
|
|
ZRot = 1 << 5,
|
|
All = XPos | YPos | ZPos | XRot | YRot | ZRot
|
|
};
|
|
using DraggerComponents = Base::Flags<DraggerComponent>;
|
|
/// updates placement of object based on dragger position and chosen axes components
|
|
void updatePlacementFromDragger(DraggerComponents components = DraggerComponent::All);
|
|
/// updates transform of object based on dragger position, can be used to preview movement
|
|
void updateTransformFromDragger();
|
|
|
|
/// Gets object placement relative to its coordinate system
|
|
Base::Placement getObjectPlacement() const;
|
|
/// Gets current dragger placement, including current dragger movement
|
|
Base::Placement getDraggerPlacement() const;
|
|
/// Gets original dragger placement, without current dragger movement
|
|
Base::Placement getOriginalDraggerPlacement() const;
|
|
/// Sets placement of dragger relative to objects origin
|
|
void setDraggerPlacement(const Base::Placement& placement);
|
|
|
|
protected:
|
|
bool setEdit(int ModNum) override;
|
|
void unsetEdit(int ModNum) override;
|
|
void setEditViewer(View3DInventorViewer*, int ModNum) override;
|
|
void unsetEditViewer(View3DInventorViewer*) override;
|
|
//@}
|
|
|
|
void onChanged(const App::Property* prop) override;
|
|
|
|
bool forwardToLink();
|
|
|
|
/// Gets placement property of the object
|
|
App::PropertyPlacement* getPlacementProperty() const;
|
|
|
|
/**
|
|
* Returns a newly create dialog for the part to be placed in the task view
|
|
* Must be reimplemented in subclasses.
|
|
*/
|
|
virtual TaskView::TaskDialog* getTransformDialog();
|
|
|
|
CoinPtr<SoTransformDragger> transformDragger;
|
|
ViewProvider *forwardedViewProvider = nullptr;
|
|
|
|
CoinPtr<SoSwitch> pcPlacement;
|
|
private:
|
|
static void dragStartCallback(void *data, SoDragger *d);
|
|
static void dragFinishCallback(void *data, SoDragger *d);
|
|
static void dragMotionCallback(void *data, SoDragger *d);
|
|
|
|
void updateDraggerPosition();
|
|
|
|
Base::Placement draggerPlacement { };
|
|
|
|
// Rotation by orthonormalizing depending on given axes components
|
|
Base::Rotation orthonormalize(Base::Vector3d x,
|
|
Base::Vector3d y,
|
|
Base::Vector3d z,
|
|
ViewProviderDragger::DraggerComponents components = DraggerComponent::All);
|
|
|
|
GizmoContainer* gizmoContainer = nullptr;
|
|
};
|
|
|
|
} // namespace Gui
|
|
|
|
ENABLE_BITMASK_OPERATORS(Gui::ViewProviderDragger::DraggerComponent)
|
|
|
|
#endif // GUI_VIEWPROVIDER_DRAGGER_H
|
|
|