Sketcher infinite axes

This commit is contained in:
Florian Foinant-Willig
2024-11-18 23:09:20 +01:00
committed by Yorik van Havre
parent 407b056952
commit ea8814785a
6 changed files with 124 additions and 23 deletions

View File

@@ -808,8 +808,6 @@ void EditModeCoinManager::processGeometryConstraintsInformationOverlay(
processGeometryInformationOverlay(geolistfacade);
updateAxesLength();
pEditModeConstraintCoinManager->processConstraints(geolistfacade);
}
@@ -852,22 +850,18 @@ void EditModeCoinManager::processGeometryInformationOverlay(const GeoListFacade&
overlayParameters.visibleInformationChanged = false; // just updated
}
void EditModeCoinManager::updateAxesLength()
void EditModeCoinManager::updateAxesLength(const Base::BoundBox2d& bb)
{
auto zCrossH = ViewProviderSketchCoinAttorney::getViewOrientationFactor(viewProvider)
* drawingParameters.zCross;
editModeScenegraphNodes.RootCrossCoordinate->point.set1Value(
0,
SbVec3f(-analysisResults.boundingBoxMagnitudeOrder, 0.0f, zCrossH));
editModeScenegraphNodes.RootCrossCoordinate->point.set1Value(
1,
SbVec3f(analysisResults.boundingBoxMagnitudeOrder, 0.0f, zCrossH));
editModeScenegraphNodes.RootCrossCoordinate->point.set1Value(
2,
SbVec3f(0.0f, -analysisResults.boundingBoxMagnitudeOrder, zCrossH));
editModeScenegraphNodes.RootCrossCoordinate->point.set1Value(
3,
SbVec3f(0.0f, analysisResults.boundingBoxMagnitudeOrder, zCrossH));
editModeScenegraphNodes.RootCrossCoordinate->point.set1Value(0,
SbVec3f(bb.MinX, 0.0f, zCrossH));
editModeScenegraphNodes.RootCrossCoordinate->point.set1Value(1,
SbVec3f(bb.MaxX, 0.0f, zCrossH));
editModeScenegraphNodes.RootCrossCoordinate->point.set1Value(2,
SbVec3f(0.0f, bb.MinY, zCrossH));
editModeScenegraphNodes.RootCrossCoordinate->point.set1Value(3,
SbVec3f(0.0f, bb.MaxY, zCrossH));
}
void EditModeCoinManager::updateColor()

View File

@@ -44,6 +44,8 @@ class Vector3;
class Vector2d;
class BoundBox2d;
class Placement;
} // namespace Base
@@ -256,6 +258,9 @@ public:
void setConstraintSelectability(bool enabled = true);
//@}
// Updates the Axes extension to span the specified area.
void updateAxesLength(const Base::BoundBox2d& bb);
private:
// This function populates the coin nodes with the information of the current geometry
void processGeometry(const GeoListFacade& geolistfacade);
@@ -265,9 +270,6 @@ private:
// parallel.
void processGeometryInformationOverlay(const GeoListFacade& geolistfacade);
// updates the Axes length to extend beyond the calculated bounding box magnitude
void updateAxesLength();
// updates the parameters to be used for the Overlay information layer
void updateOverlayParameters();

View File

@@ -3459,8 +3459,10 @@ void ViewProviderSketch::setEditViewer(Gui::View3DInventorViewer* viewer, int Mo
viewer->setupEditingRoot();
cameraSensor.setData(new VPRender {this, viewer->getSoRenderManager()});
cameraSensor.attach(viewer->getSoRenderManager()->getSceneGraph());
auto *camSensorData = new VPRender {this, viewer->getSoRenderManager()};
cameraSensor.setData(camSensorData);
cameraSensor.setDeleteCallback(&ViewProviderSketch::camSensDeleteCB, camSensorData);
cameraSensor.attach(viewer->getCamera());
}
void ViewProviderSketch::unsetEditViewer(Gui::View3DInventorViewer* viewer)
@@ -3468,6 +3470,7 @@ void ViewProviderSketch::unsetEditViewer(Gui::View3DInventorViewer* viewer)
auto dataPtr = static_cast<VPRender*>(cameraSensor.getData());
delete dataPtr;
cameraSensor.setData(nullptr);
cameraSensor.setDeleteCallback(nullptr, nullptr);
cameraSensor.detach();
viewer->removeGraphicsItem(rubberband.get());
@@ -3475,6 +3478,22 @@ void ViewProviderSketch::unsetEditViewer(Gui::View3DInventorViewer* viewer)
viewer->setSelectionEnabled(true);
}
void ViewProviderSketch::camSensDeleteCB(void* data, SoSensor *s)
{
auto *proxyVPrdr = static_cast<VPRender*>(data);
if (!proxyVPrdr)
return;
// The camera object the observer was attached to is gone, try to re-attach the sensor
// to the new camera.
// This happens i.e. when the user switches the camera type from orthographic to
// perspective.
SoCamera *camera = proxyVPrdr->renderMgr->getCamera();
if (camera) {
static_cast<SoNodeSensor *>(s)->attach(camera);
}
}
void ViewProviderSketch::camSensCB(void* data, SoSensor*)
{
VPRender* proxyVPrdr = static_cast<VPRender*>(data);
@@ -3516,6 +3535,15 @@ void ViewProviderSketch::onCameraChanged(SoCamera* cam)
Base::Interpreter().runStringObject(cmdStr.toLatin1());
}
// Stretch the axes to cover the whole viewport.
Gui::View3DInventor* view = qobject_cast<Gui::View3DInventor*>(this->getActiveView());
if (view) {
Base::Placement plc = getEditingPlacement();
const Base::BoundBox2d vpBBox = view->getViewer()
->getViewportOnXYPlaneOfPlacement(plc);
editCoinManager->updateAxesLength(vpBBox);
}
drawGrid(true);
}

View File

@@ -717,7 +717,8 @@ protected:
void unsetEdit(int ModNum) override;
void setEditViewer(Gui::View3DInventorViewer*, int ModNum) override;
void unsetEditViewer(Gui::View3DInventorViewer*) override;
static void camSensCB(void* data, SoSensor*); // camera sensor callback
static void camSensCB(void* data, SoSensor*); // camera sensor callback
static void camSensDeleteCB(void* data, SoSensor*); // camera sensor callback
void onCameraChanged(SoCamera* cam);
//@}