From b7ea4242bd74c4bef3463c448a032522fe7e5510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Luis=20Cerc=C3=B3s=20pita?= Date: Fri, 20 Jan 2012 14:36:22 +0100 Subject: [PATCH] Added Free surface 3D view update --- src/Mod/Ship/shipAreasCurve/Preview.py | 112 ++++++----------------- src/Mod/Ship/shipAreasCurve/TaskPanel.py | 9 +- 2 files changed, 37 insertions(+), 84 deletions(-) diff --git a/src/Mod/Ship/shipAreasCurve/Preview.py b/src/Mod/Ship/shipAreasCurve/Preview.py index b4d9e39b9a..8f2d7eba15 100644 --- a/src/Mod/Ship/shipAreasCurve/Preview.py +++ b/src/Mod/Ship/shipAreasCurve/Preview.py @@ -32,99 +32,47 @@ class Preview(object): def __init__(self): """ Constructor. """ - self.baseLine = None - self.baseLineLabel = None self.reinit() def reinit(self): """ Reinitializate drawer. """ + self.obj = None self.clean() - def update(self, L, B, T): - """ Update the 3D view printing annotations. - @param L Ship length. - @param B Ship beam. - @param T Ship draft. + def update(self, draft, trim, ship): + """ Update free surface 3D view + @param traft Draft. + @param trim Trim in degrees. """ - # Destroy all previous entities + # Destroy old object if exist self.clean() - # Draw base line - xStart = -0.6*L; - xEnd = 0.6*L; - baseLine = Part.makeLine((xStart,0,0),(xEnd,0,0)) - Part.show(baseLine) + # Set free surface bounds + bbox = ship.Shape.BoundBox + L = 1.5 * bbox.XLength + B = 3.0 * bbox.YLength + # Create plane + x = - 0.5 * L + y = - 0.5 * B + point = Base.Vector(x,y,0.0) + plane = Part.makePlane(L,B, point, Base.Vector(0,0,1)) + # Set position + plane.rotate(Base.Vector(0,0,0), Base.Vector(0,1,0), trim) + plane.translate(Base.Vector(0,0,draft)) + # Create the FreeCAD object + Part.show(plane) objs = FreeCAD.ActiveDocument.Objects - self.baseLine = objs[len(objs)-1] - self.baseLine.Label = 'BaseLine' - self.baseLineLabel = DrawText('BaseLineText', str(Translator.translate('Base line')), Base.Vector(xEnd,0,0)) - # Draw free surface - fsLine = Part.makeLine((xStart,0,T),(xEnd,0,T)) - Part.show(fsLine) - objs = FreeCAD.ActiveDocument.Objects - self.fsLine = objs[len(objs)-1] - self.fsLine.Label = 'FreeSurface' - self.fsLineLabel = DrawText('FSText', str(Translator.translate('Free surface')), Base.Vector(xEnd,0,T)) - # Draw forward perpendicular - zStart = -0.1*T - zEnd = 1.1*T - fpLine = Part.makeLine((0.5*L,0,zStart),(0.5*L,0,zEnd)) - Part.show(fpLine) - objs = FreeCAD.ActiveDocument.Objects - self.fpLine = objs[len(objs)-1] - self.fpLine.Label = 'ForwardPerpendicular' - self.fpLineLabel = DrawText('FPText', str(Translator.translate('Forward perpendicular')), Base.Vector(0.5*L,0,zEnd)) - # Draw after perpendicular - apLine = Part.makeLine((-0.5*L,0,zStart),(-0.5*L,0,zEnd)) - Part.show(apLine) - objs = FreeCAD.ActiveDocument.Objects - self.apLine = objs[len(objs)-1] - self.apLine.Label = 'AfterPerpendicular' - self.apLineLabel = DrawText('APText', str(Translator.translate('After perpendicular')), Base.Vector(-0.5*L,0,zEnd)) - # Draw amin frame - amLine = Part.makeLine((0,-0.5*B,zStart),(0,-0.5*B,zEnd)) - Part.show(amLine) - objs = FreeCAD.ActiveDocument.Objects - self.amLine = objs[len(objs)-1] - self.amLine.Label = 'AminFrame' - self.amLineLabel = DrawText('AMText', str(Translator.translate('Amin frame')), Base.Vector(0,-0.5*B,zEnd)) - + self.obj = objs[len(objs)-1] + self.obj.Label = 'FreeSurface' + # Set properties of object + guiObj = FreeCADGui.ActiveDocument.getObject(self.obj.Name) + guiObj.ShapeColor = (0.4,0.8,0.85) + guiObj.Transparency = 50 + def clean(self): """ Erase all annotations from screen. """ - if not self.baseLine: + if not self.obj: return - FreeCAD.ActiveDocument.removeObject(self.baseLine.Name) - FreeCAD.ActiveDocument.removeObject(self.baseLineLabel.Name) - FreeCAD.ActiveDocument.removeObject(self.fsLine.Name) - FreeCAD.ActiveDocument.removeObject(self.fsLineLabel.Name) - FreeCAD.ActiveDocument.removeObject(self.fpLine.Name) - FreeCAD.ActiveDocument.removeObject(self.fpLineLabel.Name) - FreeCAD.ActiveDocument.removeObject(self.apLine.Name) - FreeCAD.ActiveDocument.removeObject(self.apLineLabel.Name) - FreeCAD.ActiveDocument.removeObject(self.amLine.Name) - FreeCAD.ActiveDocument.removeObject(self.amLineLabel.Name) - -def DrawText(name, string, position, displayMode="Screen", angle=0.0, justification="Left", colour=(0.00,0.00,0.00), size=12): - """ Draws a text in a desired position. - @param name Name of the object - @param string Text to draw (recommended format u'') - @param position Point to draw the text - @param angle Counter clockwise rotation of text - @param justification Alignement of the text ("Left", "Right" or "Center") - @param colour Colour of the text - @param size Font size - @return FreeCAD annotation object - """ - # Create the object - text = FreeCAD.ActiveDocument.addObject("App::Annotation",name) - # Set the text - text.LabelText = [string, u''] - # Set the options - text.Position = position - FreeCADGui.ActiveDocument.getObject(text.Name).Rotation = angle - FreeCADGui.ActiveDocument.getObject(text.Name).Justification = justification - FreeCADGui.ActiveDocument.getObject(text.Name).FontSize = size - FreeCADGui.ActiveDocument.getObject(text.Name).TextColor = colour - FreeCADGui.ActiveDocument.getObject(text.Name).DisplayMode = displayMode - return FreeCAD.ActiveDocument.getObject(text.Name) + FreeCAD.ActiveDocument.removeObject(self.obj.Name) + self.obj=None diff --git a/src/Mod/Ship/shipAreasCurve/TaskPanel.py b/src/Mod/Ship/shipAreasCurve/TaskPanel.py index 09433b90cd..cbb3c20be8 100644 --- a/src/Mod/Ship/shipAreasCurve/TaskPanel.py +++ b/src/Mod/Ship/shipAreasCurve/TaskPanel.py @@ -146,6 +146,8 @@ class TaskPanel: flag = False if flag: self.form.trim.setValue(self.ship.AreaCurveTrim) + # Update GUI + self.preview.update(self.form.draft.value(), self.form.trim.value(), self.ship) msg = Translator.translate("Ready to work\n") App.Console.PrintMessage(msg) return False @@ -162,12 +164,15 @@ class TaskPanel: """ Method called when input data is changed. @param value Changed value. """ - pass + if not self.ship: + return + self.preview.update(self.form.draft.value(), self.form.trim.value(), self.ship) def onUpdate(self): """ Method called when update data request. """ - pass + if not self.ship: + return def save(self): """ Saves data into ship instance.