Nice work Marko, impressive.
Regarding your usage of TDocStd_* and friends.
Something I like to do myself is not make my code unnessecarily complex.
I think for your application its a pretty gray zone whether its yet
sufficiently complex to use complex data structures like TDocStd_*, and I
do not know the ambitions of your project.
Finally, if you have a particular edge case, that would help to investigate
the reported issue.
I would suggest 2 things: 1) take a look at [1] and [2], which are the best
references in PytonOCC's examples regarding TDocStd_* usage. 2) if you can
provide an specific case where things go awry, could you add it to the
issue tracker on the pythonocc github page?

Thanks,

-jelle

[1]
https://github.com/tpaviot/pythonocc/tree/master/src/examples/Level2/InteractiveFeatureTree
[2]
https://github.com/tpaviot/pythonocc/tree/master/src/examples/Level2/OCAFBrowser

On Tue, Oct 16, 2012 at 4:50 PM, Marko <marko...@gmail.com> wrote:

> Hi!
>
> I'm writing a CAD application where I'm using an instance of
> TDocStd_Document to manage my document. Now I'd like to add the
> functionality of interactively deleting shapes from the document by
> selecting them and pressing 'del' on the keyboard.
>
> I have already had some success with that, though my solution is very
> inelegant and does not work in all cases. I'm providing a minimal
> example of my solution below. The interesting parts are the methods
> "DocCtrl.add" and "DocCtrl.remove". What would be the "correct way" to
> implement these? I have already tried other variations including using
> "RemoveShape" instead of "RemoveComponent" but I couldn't get it to
> work. The example needs Qt to be installed, if you want an example
> based on wxWidgets, I can post that as well.
>
> Thanks in advance!
> Marko
>
> PS: I'm writing an educational CAD program for use in schools as part
> of my master thesis. This is one of the last problems I'm trying to
> solve, and I will release my program as open source software in 1 or 2
> months. Here's a screenshot: http://i.imgur.com/eILSL.png
>
> example code
> ------------
>
> import sys
> from PyQt4 import QtCore, QtGui
> from OCC.Display.qtDisplay import qtViewer3d
> from OCC import BRepPrimAPI, gp, Quantity, TDocStd, TopAbs, TopLoc
> from OCC import TPrsStd, XCAFApp, XCAFDoc, XCAFPrs, TCollection
>
>
> class MainWindow(QtGui.QMainWindow):
>
>     def __init__(self, *args):
>         QtGui.QMainWindow.__init__(self, *args)
>         self.resize(900, 640)
>         self.viewer = Viewer(self)
>         self.setCentralWidget(self.viewer)
>
>
> class Viewer(qtViewer3d):
>
>     def __init__(self, parent):
>         qtViewer3d.__init__(self)
>
>     def init2(self):
>         """Perform the second initialization step."""
>         self.InitDriver()
>
>         self.doc_ctrl = DocCtrl()
>
>         # switch selection mode to 'solid':
>         h = self._display.Context.GetHandle()
>         context = TPrsStd.TPrsStd_AISViewer().New(
>                      self.doc_ctrl.top_label, h
>                      ).GetObject().GetInteractiveContext().GetObject()
>         context.OpenLocalContext()
>         context.ActivateStandardMode(TopAbs.TopAbs_SOLID)
>
>         self._ais_pres = TPrsStd.TPrsStd_AISPresentation().Set(
>              self.doc_ctrl.top_label, XCAFPrs.XCAFPrs_Driver().GetID()
>              ).GetObject()
>
>     def repaint(self):
>         self._ais_pres.Display(True)
>         self._display.Repaint()
>
>     def keyPressEvent(self, event):
>         if event.key() == QtCore.Qt.Key_Delete:
>             shape = self._display.GetSelectedShape()
>             if shape:
>                 self.doc_ctrl.remove(shape)
>                 self.repaint()
>
>
> class DocCtrl(object):
>     """Controller for a document object.  The document itself
>     can be accessed as 'self.document'. """
>
>     def __init__(self):
>
>         # list which associates each shape label with a component
>         # label - this list is used for deleting shapes:
>         self._label_list = []
>         self._doc_handle = TDocStd.Handle_TDocStd_Document()
>         self._xcaf_app = XCAFApp.GetApplication().GetObject()
>         self._xcaf_app.NewDocument(
>             TCollection.TCollection_ExtendedString(b'MDTV-CAF'),
>             self._doc_handle)
>         # The document itself:
>         self.document = self._doc_handle.GetObject()
>         self._color_tool = XCAFDoc.XCAFDoc_DocumentTool().ColorTool(
>                            self.document.Main()).GetObject()
>         self._shape_tool = XCAFDoc.XCAFDoc_DocumentTool().ShapeTool(
>                            self.document.Main()).GetObject()
>         self.top_label = self._shape_tool.NewShape()
>         self._loc = TopLoc.TopLoc_Location(gp.gp_Trsf())
>
>     def add(self, shape):
>         """Add a shape to the document"""
>
>         shape_label = self._shape_tool.AddShape(shape, False)
>         comp_label = self._shape_tool.AddComponent(
>                      self.top_label, shape_label, self._loc)
>         self._color_tool.SetColor(shape_label,
>                                   Quantity.Quantity_Color(0, 0, 1, 0),
>                                   XCAFDoc.XCAFDoc_ColorGen)
>
>         self._label_list.append([shape_label, comp_label])
>
>     def remove(self, shape):
>         """Remove a shape from the document"""
>
>         # get the label of the shape which should be removed
>         to_remove = self._shape_tool.FindShape(shape)
>
>         # find the shape that corresponds to the label and remove the
>         #   associated component
>         for shape_label, comp_label in self._label_list:
>             if shape_label.IsEqual(to_remove):
>                 self._shape_tool.RemoveComponent(comp_label)
>                 break
>
>
> app = QtGui.QApplication(sys.argv)
>
> win = MainWindow()
> win.show()
> win.viewer.init2()
>
> # create and add shapes
> box = BRepPrimAPI.BRepPrimAPI_MakeBox(60, 30, 10).Shape()
> cyl = BRepPrimAPI.BRepPrimAPI_MakeCylinder(25, 40).Shape()
>
> tr = gp.gp_Trsf()
> tr.SetTranslation(gp.gp_Vec(0, 50, 0))
> loc = TopLoc.TopLoc_Location(tr)
> moved_box = box.Moved(loc)
>
> # these shapes can be deleted by selecting them and pressing 'Del':
> win.viewer.doc_ctrl.add(box)
> win.viewer.doc_ctrl.add(cyl)
> # this shape cannot be deleted in this implementation:
> win.viewer.doc_ctrl.add(moved_box)
> win.viewer.repaint()
>
> app.exec_()
>
> _______________________________________________
> Pythonocc-users mailing list
> Pythonocc-users@gna.org
> https://mail.gna.org/listinfo/pythonocc-users
>
_______________________________________________
Pythonocc-users mailing list
Pythonocc-users@gna.org
https://mail.gna.org/listinfo/pythonocc-users

Reply via email to