Parametric SVG(2D) Object for Drawing WB

A forum dedicated to the Draft, Arch and BIM workbenches development.
Forum rules
Be nice to others! Respect the FreeCAD code of conduct!
Post Reply
User avatar
chakkree
Posts: 327
Joined: Tue Jun 30, 2015 12:58 am
Location: Bangkok Thailand

Parametric SVG(2D) Object for Drawing WB

Post by chakkree »

After I study a source code of ArchSectionPlane.py. I think, Can we create a parametric SVG(2D) object?
I used xml.etree.ElementTree to manage SVG string.
The Result of study is below.

code for Parametric BeamSection prototype.

Code: Select all

# -*- coding: utf-8 -*-
"""
   BeamSection.py
   Test Parametric SVG(2D) Object concept
   15 Sep 2016
"""

from xml.etree import ElementTree as et

class svgBeamSectionView:
    def __init__(self, obj):
        obj.addProperty("App::PropertyLength","b","Beam Section","width of the beam section").b = 150
        obj.addProperty("App::PropertyLength","h","Beam Section", "height of the beam section").h = 300
        obj.addProperty("App::PropertyLength","dia","Beam Section","diameter of the rebar in beam section").dia = 12
        obj.addProperty("App::PropertyString","Name","Beam Section","Name of the rebar in beam section")
        
        
        obj.Proxy = self
        self.Type = "StructuralDrawing"
    
    def execute(self, obj):
        if not hasattr(self,"svg"):
            self.onChanged(obj,"b")
        result = et.Element('g'  ,stroke='black')
        result.set('stroke-width' , '0.25')
        result.set('id' , obj.Name)
        strTransform = 'rotate('+str(obj.Rotation)+','+str(obj.X)+','+str(obj.Y)+') '
        strTransform+= 'translate('+str(obj.X)+','+str(obj.Y)+') '
        #strTransform += 'scale('+str(obj.Scale)+','+str(obj.Scale)+')'
        result.set('transform' , strTransform)
        result.append(self.svg)
        obj.ViewResult = et.tostring(result)
    
    def onChanged(self, obj, prop):
        if prop in ["b","h","dia" , "Scale" , "Name"]:
            scale = obj.Scale
            b = obj.b.Value*scale ; h = obj.h.Value*scale; dia = obj.dia.Value*scale
            covering = 25 *scale
            dia_stir = 6 *scale
            font_size = 2
            beamSection = et.Element('g')
            border = et.Element('rect' , x='0' , y='0' , fill='none' ,
                        width='%g'%(b) ,height='%g'%(h) )
            
            y1 = -5
            dimH = et.Element('g' )
            dimH.append( et.Element('line' , x1='-2', y1='%g'%(y1), x2='%g'%(b+2) ,y2='%g'%(y1) )  )
            dimH.append( et.Element('line' , x1='0', y1='%g'%(y1-2), x2='0' ,y2='%g'%(y1+2) )  )
            dimH.append( et.Element('line' , x1='%g'%(b), y1='%g'%(y1-2), x2='%g'%(b) ,y2='%g'%(y1+2) )  )
            dimH.append( et.Element('line' , x1='-1', y1='%g'%(y1+1), x2='1' ,y2='%g'%(y1-1) )  )
            dimH.append( et.Element('line' , x1='%g'%(b-1), y1='%g'%(y1+1), x2='%g'%(b+1) ,y2='%g'%(y1-1) )  )
            x1 = -5
            dimV = et.Element('g' )
            dimV.append( et.Element('line' , x1='%g'%(x1), y1='%g'%(-2), x2='%g'%(x1) ,y2='%g'%(h+2) )  )
            dimV.append( et.Element('line' , x1='%g'%(x1-2), y1='0', x2='%g'%(x1+2) ,y2='0' )  )
            dimV.append( et.Element('line' , x1='%g'%(x1-2), y1='%g'%(h), x2='%g'%(x1+2) ,y2='%g'%(h) )  )
            dimV.append( et.Element('line' , x1='%g'%(x1-1), y1='1', x2='%g'%(x1+1) ,y2='-1' )  )
            dimV.append( et.Element('line' , x1='%g'%(x1-1), y1='%g'%(h+1), x2='%g'%(x1+1) ,y2='%g'%(h-1) )  )
            textDimH = et.Element('text' ,x='%g'%(b/2) , y='%g'%(y1-1.5) )
            textDimH.text = str(obj.b)
            textDimH.set('text-anchor' , "middle")
            textDimH.set('font-size' , str(font_size) )
            x1-=1 ; y1 = h/2
            textDimV = et.Element('text' ,x='%g'%(x1) , y='%g'%(y1) )
            textDimV.text = str(obj.h)
            textDimV.set('text-anchor' , "middle")
            textDimV.set('font-size' , str(font_size) )
            textDimV.set('transform' , 'rotate(-90 %g,%g)'%(x1 , y1) )
            
            x1 = covering+dia_stir*1.5+dia/2; y1=x1
            x2 = b-x1; y2=h-y1
            TopRebarL = et.Element('circle' ,cx='%g'%(x1) , cy='%g'%(y1)  , r='%g'%(dia/2) , fill='black' )
            TopRebarR = et.Element('circle' ,cx='%g'%(x2) , cy='%g'%(y1)  , r='%g'%(dia/2) , fill='black' )
            BottomRebarL = et.Element('circle' ,cx='%g'%(x1) , cy='%g'%(y2)  , r='%g'%(dia/2) , fill='black' )
            BottomRebarR = et.Element('circle' ,cx='%g'%(x2) , cy='%g'%(y2)  , r='%g'%(dia/2) , fill='black' )
            textTopRebar = et.Element('text' ,x='%g'%(b+2) , y='0' )
            textTopRebar.text = u"2RB%dมม"%(obj.dia.Value)
            textTopRebar.set('text-anchor' , "start")
            textTopRebar.set('font-size' , str(font_size) )
            textBottomRebar = et.Element('text' ,x='%g'%(b+2) , y='%g'%(h+1) )
            textBottomRebar.text = u"2RB%dมม"%(obj.dia.Value)
            textBottomRebar.set('text-anchor' , "start")
            textBottomRebar.set('font-size' , str(font_size) )
            textStirrupRebar = et.Element('text' ,x='%g'%(b+2) , y='%g'%(h/2) )
            textStirrupRebar.text = u"ปRB6มม@0.150ม"
            textStirrupRebar.set('text-anchor' , "start")
            textStirrupRebar.set('font-size' , str(font_size) )
            textName = et.Element('text' ,x='%g'%(b/2) , y='%g'%(h+7) )
            textName.text = obj.Name
            textName.set('text-anchor' , "middle")
            textName.set('font-size' , str(font_size*1.75) )
            
            x1 = (covering+dia_stir/2)
            y1 = (covering+dia_stir/2)
            w1 = b - (covering+dia_stir/2)*2
            h1 = h - (covering+dia_stir/2)*2
            D = dia_stir*4
            stirrup = et.Element('rect' , x='%g'%(x1) , y='%g'%(y1) , fill='none' ,
                        width='%g'%(w1) ,height='%g'%(h1) , rx = '%g'%(D/2) , ry = '%g'%(D/2)   )
            stirrup.set('stroke-width' , '%g'%(dia_stir))
            
            beamSection.append(border)
            beamSection.append(dimH)
            beamSection.append(dimV)
            beamSection.append(TopRebarL)
            beamSection.append(TopRebarR)
            beamSection.append(BottomRebarL)
            beamSection.append(BottomRebarR)
            beamSection.append(stirrup)
            beamSection.append(textDimH)
            beamSection.append(textDimV)
            beamSection.append(textTopRebar)
            beamSection.append(textBottomRebar)
            beamSection.append(textStirrupRebar)
            beamSection.append(textName)
            
            self.svg=beamSection
    
    def __getstate__(self):
        return self.Type
    def __setstate__(self,state):
        if state:
            self.Type = state
    def getDisplayModes(self,vobj):
        modes=["Default"]
        return modes
    def setDisplayMode(self,mode):
        return mode

def makeSVGBeamSectionView(name="Beam Section"):
    page = None
    for o in FreeCAD.ActiveDocument.Objects:
        if o.isDerivedFrom("Drawing::FeaturePage"):
            page = o
            break
    if not page:
        page = FreeCAD.ActiveDocument.addObject("Drawing::FeaturePage",translate("Arch","Page"))
        page.Template = Draft.getParam("template",FreeCAD.getResourceDir()+'Mod/Drawing/Templates/A4_Landscape_plain.svg')
    
    view = FreeCAD.ActiveDocument.addObject("Drawing::FeatureViewPython",name)
    page.addObject(view)
    svgBeamSectionView(view)
    view.Scale = 1/20.0
    return view

if __name__=="__main__":
    beam1 = makeSVGBeamSectionView("BeamSectionB1")
    beam1.X = 30; beam1.Y=50;
    beam1.Name = "B1"
    
    beam2 = makeSVGBeamSectionView("BeamSectionB2")
    beam2.X = 70; beam2.Y=50;
    beam2.b = 200; beam2.h=400
    beam2.dia = 15
    beam2.Name = "B2"
    
    beam3 = makeSVGBeamSectionView("BeamSectionB3")
    beam3.X = 110; beam3.Y=50
    beam3.b = 250; beam3.h=500
    beam3.dia = 19
    beam3.Name = "B3"
    FreeCAD.ActiveDocument.Page.addObject(beam1)
    FreeCAD.ActiveDocument.Page.addObject(beam2)
    FreeCAD.ActiveDocument.Page.addObject(beam3)
    
    FreeCAD.ActiveDocument.recompute()
Output Parametric SVG(2D) Object on Drawing.
TestBeamSection01.png
TestBeamSection01.png (169.47 KiB) Viewed 3781 times
TestBeamSection01.FCStd
(4.88 KiB) Downloaded 76 times
Last edited by chakkree on Fri Jul 10, 2020 4:31 am, edited 1 time in total.
User avatar
yorik
Founder
Posts: 13665
Joined: Tue Feb 17, 2009 9:16 pm
Location: Brussels
Contact:

Re: Parametric SVG(2D) Object

Post by yorik »

Yes absolutely! The deal would be that an Arch Structure element, together with rebars, could produce such graphics automatically...
User avatar
chakkree
Posts: 327
Joined: Tue Jun 30, 2015 12:58 am
Location: Bangkok Thailand

Re: Parametric SVG(2D) Object

Post by chakkree »

Old work in 2010, used SVG for construction drawing.
Next step, I will make it to Parametric SVG.
pyDrawingSVG-Rebars-testRebarShapes.png
pyDrawingSVG-Rebars-testRebarShapes.png (44.3 KiB) Viewed 3708 times
testRebarShapes_file01.svg
(15.79 KiB) Downloaded 152 times
User avatar
chakkree
Posts: 327
Joined: Tue Jun 30, 2015 12:58 am
Location: Bangkok Thailand

Re: Parametric SVG(2D) Object

Post by chakkree »

test create Section Section in function return as svg(xml).

Code: Select all

"""
   Symbols.py
   17 Sep 2016
"""


from xml.etree import ElementTree as et
from math import cos, radians


#  Section Symbol prototype
def SectionVerticalRight(x=0, y = 0 , length = 100 , text="A" , page="A-7" ):
    color = 'blue'
    R = 12/2.0
    font_size = R*0.8
    def CircularHead(x,y):
        CirHeadGrp= et.Element('g', stroke=color)
        CirHeadGrp.set('transform' , 'translate(%g,%g)'%(x,y))
        tri1 = et.Element('path' , fill=color )
        L = R/cos(radians(45))
        dataPath = 'M %g %g'%(L+5+R, 0)
        dataPath += ' l %g %g'%(-L, -L )
        dataPath += ' v %g z'%(L*2 )
        
        tri1.set('d' , dataPath)
        
        circle1 = et.Element('circle' ,cx='%g'%(R+5) , cy='%g'%0 , r = '%g'%(R) ,
                    fill="white")
        circle1.set('stroke-width' , '0.25')
        
        line1 = et.Element('line' , x1='0' , y1='0' , x2='%g'%(5+R*2) , y2='0')
        line1.set('stroke-width' , '0.35')
        
        text1 = et.Element('text', x='%g'%(5+R) , y='-1' ,stroke='none' , fill=color)
        text1.set('text-anchor' , "middle")
        text1.set('font-size' , str(font_size) )
        text1.text = text
        
        textPage = et.Element('text', x='%g'%(5+R) , y='%g'%(+R-2) ,stroke='none' , fill=color)
        textPage.set('text-anchor' , "middle")
        textPage.set('font-size' , str(font_size*0.75) )
        textPage.text = page
        
        CirHeadGrp.append(tri1)
        CirHeadGrp.append(circle1)
        CirHeadGrp.append(line1)
        CirHeadGrp.append(text1)
        CirHeadGrp.append(textPage)
        
        return CirHeadGrp
    
    svgGrp = et.Element('g' )
    line1 = et.Element('line' , x1='0' , y1='0' , x2='0' , y2='%g'%(length), 
               stroke=color )
    line1.set('stroke-width' , '0.35')
    line1.set('stroke-dasharray' , '10,2,3,2')
    svgGrp.append(line1)
    svgGrp.append(CircularHead(0,0))
    svgGrp.append(CircularHead(0,length))
    
    svgGrp.set('transform' , 'translate(%g,%g)'%(x,y))
    return svgGrp


if __name__=="__main__":
    doc = FreeCAD.ActiveDocument
    page = doc.Page
    
    sectionSymbol = doc.addObject("Drawing::FeatureViewPython",'Section Symbol')
    sectionSymbol.ViewResult = et.tostring( SectionVerticalRight(50,30) ) 
    page.addObject(sectionSymbol)
    
    sectionSymbol2 = doc.addObject("Drawing::FeatureViewPython",'Section Symbol2')
    sectionSymbol2.ViewResult = et.tostring( SectionVerticalRight(100,30 , 150 , "1" , "A-08") ) 
    page.addObject(sectionSymbol2)
    
    FreeCAD.ActiveDocument.recompute()
SectionSymbol01.png
SectionSymbol01.png (145.64 KiB) Viewed 3677 times
TestSectionSymbol01.FCStd
(5.7 KiB) Downloaded 74 times
cox
Posts: 971
Joined: Wed Nov 26, 2014 11:37 pm

Re: Parametric SVG(2D) Object

Post by cox »

chakkree wrote:Next step, I will make it to Parametric SVG.
I do not know if it matters, but Type 3 and 5 is the same rotated 180deg. :)
Need help? Feel free to ask, but please read the guidelines first
User avatar
chakkree
Posts: 327
Joined: Tue Jun 30, 2015 12:58 am
Location: Bangkok Thailand

Re: Parametric SVG(2D) Object

Post by chakkree »

cox wrote:I do not know if it matters, but Type 3 and 5 is the same rotated 180deg. :)
My old work, at start to learn about svg and rebar.
I ran a number on my own. not refer to and standard. :oops:
User avatar
bernd
Veteran
Posts: 12851
Joined: Sun Sep 08, 2013 8:07 pm
Location: Zürich, Switzerland
Contact:

Re: Parametric SVG(2D) Object

Post by bernd »

Have you been using Rebar_Type06 on real building site?
User avatar
chakkree
Posts: 327
Joined: Tue Jun 30, 2015 12:58 am
Location: Bangkok Thailand

Re: Parametric SVG(2D) Object

Post by chakkree »

bernd wrote:Have you been using Rebar_Type06 on real building site?
Not used in a real structure. I used for example test.(link to sample) How to use SVG for representation of construction drawing.
I used python to create SVG file and can only show on web browser(At first, only FireFox can view SVG)
But it has a problem that it not easy or comfortable to use.

Now, I found FreeCAD and I think FreeCAD can.
The number of Shape Code should reference on some standard shape codes.
Image
image ref. = http://www.steelreinforcementsuppliers. ... ape-codes/
User avatar
chakkree
Posts: 327
Joined: Tue Jun 30, 2015 12:58 am
Location: Bangkok Thailand

Re: Parametric SVG(2D) Object

Post by chakkree »

Paramatric SVG Grids Object (ortho.)

Code: Select all

"""
    Grids.py
     18 Sep 2016
"""
import FreeCAD,WorkingPlane,math,Draft,ArchCommands,DraftVecUtils,ArchComponent
from FreeCAD import Vector
if FreeCAD.GuiUp:
    import FreeCADGui
    from PySide import QtCore, QtGui
    from DraftTools import translate
    from pivy import coin
else:
    def translate(ctxt,txt):
        return txt
        
from xml.etree import ElementTree as et

class GridsView:
    def __init__(self, obj):
        obj.addProperty("App::PropertyStringList","GridX","GridView","Data List of Grid X")
        obj.addProperty("App::PropertyStringList","GridY","GridView","Data List of Grid Y")
        
        
        obj.Proxy = self
        self.Type = "ArchDrawing"
    
    def execute(self, obj):
        if not hasattr(self,"svg"):
            self.onChanged(obj,"b")
        result = et.Element('g'  ,stroke='black')
        result.set('stroke-width' , '0.25')
        result.set('id' , obj.Name)
        strTransform = 'rotate('+str(obj.Rotation)+','+str(obj.X)+','+str(obj.Y)+') '
        strTransform+= 'translate('+str(obj.X)+','+str(obj.Y)+') '
        #strTransform += 'scale('+str(obj.Scale)+','+str(obj.Scale)+')'
        result.set('transform' , strTransform)
        result.append(self.svg)
        obj.ViewResult = et.tostring(result)
    
    def onChanged(self, obj, prop):
        color = 'blue'
        font_size = 5
        Ext = 1000
        R = 3.5
        Gap = 10
        if prop in ["GridX","GridY", "Scale" , "Name"]:
            scale = obj.Scale

            GridSVG = et.Element('g' )
            ListX = []
            LabelX = []
            for iGrid in obj.GridX:
                Label = iGrid.split(':')[0]
                x =  float( iGrid.split(':')[1] )
                ListX.append ( x )
                LabelX.append ( Label )
            
            ListY = []
            LabelY = []
            for iGrid in obj.GridY:
                Label = iGrid.split(':')[0]
                y =  float( iGrid.split(':')[1] )
                ListY.append ( y )
                LabelY.append ( Label )
            
            minX = 0.0; maxX=0.0;
            minY = 0.0; maxY=0.0;
            for x in ListX:
                if x<minX: minX=x
                if x>maxX: maxX=x
            for y in ListY:
                if y<minY: minY=y
                if y>maxY: maxY=y
            for i in range(0,len(ListX)):
                x = ListX[i]
                line1 = et.Element('line' , stroke=color )
                line1.set('x1' , str(x*scale) )
                line1.set('x2' , str(x*scale) )
                line1.set('y1' , '%g'%(-(minY-Ext)*scale) )
                line1.set('y2' , '%g'%(-(maxY+Ext)*scale) )
                line1.set('stroke-dasharray' , '5 1 2 1' )
                
                LabelText = et.Element('text' , stroke='none' , fill=color )
                LabelText.set('x' , str(x*scale))
                LabelText.set('y' , '%g'%(-(maxY+Ext)*scale - Gap -2))
                LabelText.set('font-size' , str(font_size))
                LabelText.set('text-anchor' , 'middle')
                LabelText.text =  LabelX[i]
                
                circle1 =  et.Element('circle' , r='%g'%R , stroke=color , fill='none')
                circle1.set('cx' , str(x*scale) )
                circle1.set('cy' , '%g'%(-(maxY+Ext)*scale - Gap -R) )
                
                GridSVG.append(circle1)
                GridSVG.append(LabelText)
                GridSVG.append(line1)
            
            for i in range(0,len(ListY)):
                y = ListY[i]
                line1 = et.Element('line' , stroke=color )
                line1.set('y1' , str(-y*scale) )
                line1.set('y2' , str(-y*scale) )
                line1.set('x1' , '%g'%((minX-Ext)*scale) )
                line1.set('x2' , '%g'%((maxX+Ext)*scale) )
                line1.set('stroke-dasharray' , '5 1 2 1' )
                
                LabelText = et.Element('text' , stroke='none' , fill=color )
                LabelText.set('x' , '%g'%((-Ext)*scale -  Gap - R-2))
                LabelText.set('y' , str(- ((y)*scale -2) ) )
                LabelText.set('font-size' , str(font_size))
                LabelText.set('text-anchor' , 'middle')
                LabelText.text =  LabelY[i]
                
                circle1 =  et.Element('circle' , r='%g'%R , stroke=color , fill='none')
                circle1.set('cx' , '%g'%((-Ext)*scale -  Gap -R-2) )
                circle1.set('cy' , '%g'%(-y*scale) )
                
                GridSVG.append(circle1)
                GridSVG.append(LabelText)
                
                GridSVG.append(line1)                
            
            y1 =  maxY*scale+Gap+7
            DimH_1 = et.Element('g' , transform = 'translate(0,%g)'%-y1 , stroke='black' )
            DimH_1.set('stroke-width' , '0.15')
            DimH_1.append( et.Element('line' , x1='-5' , x2='%g'%( maxX*scale+5 ) , y1='0' ,y2='0' ) )
            DimH_1.append( et.Element('line' , x1='%g'%(minX*scale) , x2='%g'%(minX*scale) , y1='+2' ,y2='-2' ) )
            DimH_1.append( et.Element('circle' , cx='%g'%(minX*scale) , cy='0' ,r='0.5', stroke=color , fill='none' ))
            DimH_1.append( et.Element('line' , x1='%g'%(maxX*scale) , x2='%g'%(maxX*scale) , y1='+2' ,y2='-2' ) )
            DimH_1.append( et.Element('circle' , cx='%g'%(maxX*scale) , cy='0' ,r='0.5', stroke=color , fill='none' ))
            textDimH1 = et.Element('text' , stroke='none' , fill=color )
            textDimH1.set('x' , str( (minX+maxX)/2.0*scale   )  )
            textDimH1.set('y' , '-0.5'  )
            textDimH1.set('text-anchor' , 'middle')
            textDimH1.set('font-size' , '2' )
            textDimH1.text = "%.0f"%(maxX - minX)
            DimH_1.append(textDimH1)
            DimH_2 = et.Element('g' , transform = 'translate(0,%g)'%(-y1+5)  )
            DimH_2.set('stroke-width' , '0.15')
            DimH_2.append( et.Element('line' , x1='-2' , x2='%g'%( maxX*scale+2 ) , y1='0' ,y2='0' ) )
            ListXSorted = sorted(ListX)
            for i in range(0,len(ListXSorted)): 
                x = ListXSorted[i]
                DimH_2.append( et.Element('line' , x1='%g'%(x*scale) , x2='%g'%(x*scale) , y1='+2' ,y2='-2' ) )
                DimH_2.append( et.Element('circle' , cx='%g'%(x*scale) , cy='0' ,r='0.5', stroke=color , fill='none' ))
                if i>0:
                    dx = ListXSorted[i] - ListXSorted[i-1]
                    iDim = et.Element('text' , stroke='none' , fill=color )
                    iDim.set('x' , str( (ListXSorted[i-1] +dx/2.0)*scale   )  )
                    iDim.set('y' , '-0.5'  )
                    iDim.set('text-anchor' , 'middle')
                    iDim.set('font-size' , '2' )
                    iDim.text = "%.0f"%(dx)
                    DimH_2.append(iDim)
            
            x1 = minX*scale-Gap-7
            y1 = minY*scale ;  y2 = maxY*scale
            DimV_1 = et.Element('g' , transform = 'translate(%g,0)'%x1)
            DimV_1.set('stroke-width' , '0.15')
            DimV_1.append( et.Element('line' , x1='0' , x2='0' , y1='%g'%(y1+5) ,y2='%g'%( -y2-5 ) ) )
            DimV_1.append( et.Element('line' , x1='-2' , x2='+2' , y1='%g'%(y1) ,y2='%g'%(y1) ) )
            DimV_1.append( et.Element('circle' , cx='0' , cy='%g'%(y1) ,r='0.5', stroke=color , fill='none' ))
            DimV_1.append( et.Element('line' , x1='-2' , x2='+2' , y1='%g'%(-y2) ,y2='%g'%(-y2) ) )
            DimV_1.append( et.Element('circle' , cx='0' , cy='%g'%(-y2) ,r='0.5', stroke=color , fill='none' ))

            x1 = 0 ; y1 = minY + (maxY - minY)/2.0
            textDimV = et.Element('text' , stroke='none' , fill=color )
            textDimV.set('x' , str( x1*scale -0.5   )  ) 
            textDimV.set('y' , str( -y1*scale   )  )
            textDimV.set('text-anchor' , 'middle')
            textDimV.set('font-size' , '2' )
            textDimV.text = "%.0f"%(maxY - minY)
            textDimV.set('transform' , 'rotate(-90 %g,%g)'%(x1*scale-0.5 , -y1*scale) )
            DimV_1.append(textDimV)
            x1 = minX*scale-Gap-7
            DimV_2 = et.Element('g' , transform = 'translate(%g,0)'%(x1+5)  )
            DimV_2.set('stroke-width' , '0.15')
            DimV_2.append( et.Element('line' , y1='+2' , y2='%g'%( -maxY*scale-2 ) , x1='0' ,x2='0' ) )
            ListYSorted = sorted(ListY)
            for i in range(0,len(ListYSorted)): 
                y = ListYSorted[i]
                DimV_2.append( et.Element('line' , y1='%g'%(-y*scale) , y2='%g'%(-y*scale) , x1='+2' ,x2='-2' ) )
                DimV_2.append( et.Element('circle' , cy='%g'%(-y*scale) , cx='0' ,r='0.5', stroke=color , fill='none' ))
                if i>0:
                    dy = ListYSorted[i] - ListYSorted[i-1]
                    x1 = -0.5 ; y1 =ListYSorted[i-1] +dy/2.0
                    iDim = et.Element('text' , stroke='none' , fill=color )
                    iDim.set('y' , str( -y1*scale   )  )
                    iDim.set('x' , str(x1)  )
                    iDim.set('text-anchor' , 'middle')
                    iDim.set('font-size' , '2' )
                    iDim.text = "%.0f"%(dy)
                    iDim.set('transform' , 'rotate(-90 %g,%g)'%(x1 , -y1*scale) )
                    DimV_2.append(iDim)
            
            GridSVG.append( DimH_1 )
            GridSVG.append( DimH_2 )
            GridSVG.append( DimV_1 )
            GridSVG.append( DimV_2 )
            GridSVG.append( et.Element('circle' , cx='0' ,cy='0' , r='1' , fill ='none' , stroke='red')  )
            self.svg=GridSVG
    
    def __getstate__(self):
        return self.Type
    def __setstate__(self,state):
        if state:
            self.Type = state
    def getDisplayModes(self,vobj):
        modes=["Default"]
        return modes
    def setDisplayMode(self,mode):
        return mode

def makeSVGGridsView(name="Grids"):    
    page = None
    for o in FreeCAD.ActiveDocument.Objects:
        if o.isDerivedFrom("Drawing::FeaturePage"):
            page = o
            break
    if not page:
        page = FreeCAD.ActiveDocument.addObject("Drawing::FeaturePage",translate("Arch","Page"))
        page.Template = Draft.getParam("template",FreeCAD.getResourceDir()+'Mod/Drawing/Templates/A4_Landscape_plain.svg')
    
    view = FreeCAD.ActiveDocument.addObject("Drawing::FeatureViewPython",name)
    page.addObject(view)
    GridsView(view)
    view.Scale = 1/100.0
    return view

if __name__=="__main__":
    myGrid = makeSVGGridsView()
    myGrid.X = 50; myGrid.Y = 150
    myGrid.GridX = ["A:0","B:2000" , "C:5000"]
    myGrid.GridY = ["1:0","2:3000" , "3:8000"]

    FreeCAD.ActiveDocument.recompute()
TestGridsObject.png
TestGridsObject.png (249.12 KiB) Viewed 3614 times
Post Reply