Merge branch 'master' into HEAD
git-svn-id: https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk@5375 e8eeb9e2-ec13-0410-a4a9-efa5cf37419d
This commit is contained in:
commit
6a91beadae
|
@ -21,8 +21,8 @@
|
|||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD,FreeCADGui,Part,Draft,ArchComponent,math
|
||||
from draftlibs import fcgeo,fcvec
|
||||
import FreeCAD,FreeCADGui,Draft,ArchComponent,math
|
||||
from draftlibs import fcvec
|
||||
from FreeCAD import Vector
|
||||
from PyQt4 import QtCore
|
||||
from pivy import coin
|
||||
|
@ -81,6 +81,7 @@ class _Axis(ArchComponent.Component):
|
|||
self.createGeometry(obj)
|
||||
|
||||
def createGeometry(self,obj):
|
||||
import Part
|
||||
pl = obj.Placement
|
||||
geoms = []
|
||||
dist = 0
|
||||
|
@ -121,6 +122,7 @@ class _ViewProviderAxis(ArchComponent.ViewProviderComponent):
|
|||
self.bubbles = None
|
||||
|
||||
def makeBubbles(self):
|
||||
import Part
|
||||
rn = self.ViewObject.RootNode.getChild(2).getChild(0).getChild(0)
|
||||
if self.bubbles:
|
||||
rn.removeChild(self.bubbles)
|
||||
|
|
|
@ -56,7 +56,7 @@ class _CommandBuilding:
|
|||
if Draft.getType(sel[0]) in ["Cell","Site","Floor"]:
|
||||
FreeCAD.ActiveDocument.openTransaction("Type conversion")
|
||||
nobj = makeBuilding()
|
||||
Commands.copyProperties(sel[0],nobj)
|
||||
ArchCommands.copyProperties(sel[0],nobj)
|
||||
FreeCAD.ActiveDocument.removeObject(sel[0].Name)
|
||||
FreeCAD.ActiveDocument.commitTransaction()
|
||||
ok = True
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD,FreeCADGui,Part,Draft,ArchComponent,ArchCommands
|
||||
import FreeCAD,FreeCADGui,Draft,ArchComponent,ArchCommands
|
||||
from FreeCAD import Vector
|
||||
from PyQt4 import QtCore
|
||||
|
||||
|
@ -58,7 +58,7 @@ class _CommandCell:
|
|||
if Draft.getType(sel[0]) in ["Floor","Site","Building"]:
|
||||
FreeCAD.ActiveDocument.openTransaction("Type conversion")
|
||||
nobj = makeCell()
|
||||
Commands.copyProperties(sel[0],nobj)
|
||||
ArchCommands.copyProperties(sel[0],nobj)
|
||||
FreeCAD.ActiveDocument.removeObject(sel[0].Name)
|
||||
FreeCAD.ActiveDocument.commitTransaction()
|
||||
ok = True
|
||||
|
@ -86,6 +86,7 @@ class _Cell(ArchComponent.Component):
|
|||
self.createGeometry(obj)
|
||||
|
||||
def createGeometry(self,obj):
|
||||
import Part
|
||||
pl = obj.Placement
|
||||
if obj.Components:
|
||||
if obj.JoinMode:
|
||||
|
|
|
@ -21,8 +21,8 @@
|
|||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD,FreeCADGui,Part,Draft,MeshPart,ArchComponent
|
||||
from draftlibs import fcgeo,fcvec
|
||||
import FreeCAD,FreeCADGui,Draft,ArchComponent
|
||||
from draftlibs import fcvec
|
||||
from FreeCAD import Vector
|
||||
from PyQt4 import QtCore
|
||||
|
||||
|
@ -138,6 +138,8 @@ def splitMesh(obj,mark=True):
|
|||
def meshToShape(obj,mark=True):
|
||||
'''meshToShape(object,[mark]): turns a mesh into a shape, joining coplanar facets. If
|
||||
mark is True (default), non-solid objects will be marked in red'''
|
||||
import Part,MeshPart
|
||||
from draftlibs import fcgeo
|
||||
if "Mesh" in obj.PropertiesList:
|
||||
faces = []
|
||||
mesh = obj.Mesh
|
||||
|
@ -195,6 +197,7 @@ def meshToShape(obj,mark=True):
|
|||
def removeShape(objs,mark=True):
|
||||
'''takes an arch object (wall or structure) built on a cubic shape, and removes
|
||||
the inner shape, keeping its length, width and height as parameters.'''
|
||||
from draftlibs import fcgeo
|
||||
if not isinstance(objs,list):
|
||||
objs = [objs]
|
||||
for obj in objs:
|
||||
|
|
|
@ -57,7 +57,7 @@ class _CommandFloor:
|
|||
if Draft.getType(sel[0]) in ["Cell","Site","Building"]:
|
||||
FreeCAD.ActiveDocument.openTransaction("Type conversion")
|
||||
nobj = makeFloor()
|
||||
Commands.copyProperties(sel[0],nobj)
|
||||
ArchCommands.copyProperties(sel[0],nobj)
|
||||
FreeCAD.ActiveDocument.removeObject(sel[0].Name)
|
||||
FreeCAD.ActiveDocument.commitTransaction()
|
||||
ok = True
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import FreeCAD,FreeCADGui,Part,ArchComponent,WorkingPlane,Drawing,math
|
||||
import FreeCAD,FreeCADGui,ArchComponent,WorkingPlane,Drawing,math
|
||||
from FreeCAD import Vector
|
||||
from PyQt4 import QtCore
|
||||
from pivy import coin
|
||||
from draftlibs import fcvec,fcgeo
|
||||
from draftlibs import fcvec
|
||||
|
||||
|
||||
class _CommandSectionPlane:
|
||||
|
@ -46,6 +46,7 @@ class _SectionPlane:
|
|||
self.Type = "SectionPlane"
|
||||
|
||||
def execute(self,obj):
|
||||
import Part
|
||||
pl = obj.Placement
|
||||
l = obj.ViewObject.DisplaySize
|
||||
p = Part.makePlane(l,l,Vector(l/2,-l/2,0),Vector(0,0,-1))
|
||||
|
@ -183,6 +184,8 @@ class _ArchDrawingView:
|
|||
return Vector(lx,ly,0)
|
||||
|
||||
def getPath(self,face,plane):
|
||||
import Part
|
||||
from draftlibs import fcgeo
|
||||
"returns a svg path from a face"
|
||||
svg ='<path '
|
||||
edges = fcgeo.sortEdges(face.Edges)
|
||||
|
|
|
@ -54,7 +54,7 @@ class _CommandSite:
|
|||
if Draft.getType(sel[0]) in ["Cell","Building","Floor"]:
|
||||
FreeCAD.ActiveDocument.openTransaction("Type conversion")
|
||||
nobj = makeSite()
|
||||
Commands.copyProperties(sel[0],nobj)
|
||||
ArchCommands.copyProperties(sel[0],nobj)
|
||||
FreeCAD.ActiveDocument.removeObject(sel[0].Name)
|
||||
FreeCAD.ActiveDocument.commitTransaction()
|
||||
ok = True
|
||||
|
|
|
@ -21,8 +21,8 @@
|
|||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD,FreeCADGui,Part,Draft,ArchComponent
|
||||
from draftlibs import fcgeo,fcvec
|
||||
import FreeCAD,FreeCADGui,Draft,ArchComponent
|
||||
from draftlibs import fcvec
|
||||
from FreeCAD import Vector
|
||||
from PyQt4 import QtCore
|
||||
|
||||
|
@ -94,6 +94,8 @@ class _Structure(ArchComponent.Component):
|
|||
self.createGeometry(obj)
|
||||
|
||||
def createGeometry(self,obj):
|
||||
import Part
|
||||
from draftlibs import fcgeo
|
||||
# getting default values
|
||||
height = normal = None
|
||||
if obj.Length:
|
||||
|
|
|
@ -21,8 +21,8 @@
|
|||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD,FreeCADGui,Part,Draft,ArchComponent
|
||||
from draftlibs import fcgeo,fcvec
|
||||
import FreeCAD,FreeCADGui,Draft,ArchComponent
|
||||
from draftlibs import fcvec
|
||||
from FreeCAD import Vector
|
||||
from PyQt4 import QtCore
|
||||
|
||||
|
@ -93,6 +93,9 @@ class _Wall(ArchComponent.Component):
|
|||
self.createGeometry(obj)
|
||||
|
||||
def createGeometry(self,obj):
|
||||
|
||||
import Part
|
||||
from draftlibs import fcgeo
|
||||
|
||||
def getbase(wire):
|
||||
"returns a full shape from a base wire"
|
||||
|
|
|
@ -21,8 +21,8 @@
|
|||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD,FreeCADGui,Part,Draft,ArchComponent
|
||||
from draftlibs import fcgeo,fcvec
|
||||
import FreeCAD,FreeCADGui,Draft,ArchComponent
|
||||
from draftlibs import fcvec
|
||||
from FreeCAD import Vector
|
||||
from PyQt4 import QtCore
|
||||
|
||||
|
@ -88,6 +88,8 @@ class _Window(ArchComponent.Component):
|
|||
self.createGeometry(obj)
|
||||
|
||||
def createGeometry(self,obj):
|
||||
import Part
|
||||
from draftlibs import fcgeo
|
||||
pl = obj.Placement
|
||||
if obj.Base:
|
||||
if obj.Base.isDerivedFrom("Part::Feature"):
|
||||
|
|
|
@ -73,9 +73,9 @@ How it works / how to extend:
|
|||
|
||||
# import FreeCAD modules
|
||||
|
||||
import FreeCAD, FreeCADGui, Part, math, sys, os, Image, Drawing, WorkingPlane
|
||||
import FreeCAD, FreeCADGui, math, sys, os, WorkingPlane
|
||||
from FreeCAD import Vector
|
||||
from draftlibs import fcvec, fcgeo
|
||||
from draftlibs import fcvec
|
||||
from pivy import coin
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
|
@ -145,6 +145,7 @@ def getRealName(name):
|
|||
|
||||
def getType(obj):
|
||||
"getType(object): returns the Draft type of the given object"
|
||||
import Part
|
||||
if isinstance(obj,Part.Shape):
|
||||
return "Shape"
|
||||
if "Proxy" in obj.PropertiesList:
|
||||
|
@ -390,6 +391,7 @@ def makeWire(pointslist,closed=False,placement=None,face=True,support=None):
|
|||
and last points are identical, the wire is closed. If face is
|
||||
true (and wire is closed), the wire will appear filled. Instead of
|
||||
a pointslist, you can also pass a Part Wire.'''
|
||||
from draftlibs import fcgeo
|
||||
if not isinstance(pointslist,list):
|
||||
nlist = []
|
||||
for v in pointslist.Vertexes:
|
||||
|
@ -589,6 +591,7 @@ def fuse(object1,object2):
|
|||
the union of the 2 given objects. If the objects are
|
||||
coplanar, a special Draft Wire is used, otherwise we use
|
||||
a standard Part fuse.'''
|
||||
from draftlibs import fcgeo
|
||||
if fcgeo.isCoplanar(object1.Shape.fuse(object2.Shape).Faces):
|
||||
obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython","Fusion")
|
||||
_Wire(obj)
|
||||
|
@ -704,6 +707,7 @@ def rotate(objectslist,angle,center=Vector(0,0,0),axis=Vector(0,0,1),copy=False)
|
|||
omitted, the rotation will be around the vertical Z axis.
|
||||
If copy is True, the actual objects are not moved, but copies
|
||||
are created instead. The objects (or their copies) are returned.'''
|
||||
import Part
|
||||
typecheck([(copy,bool)], "rotate")
|
||||
if not isinstance(objectslist,list): objectslist = [objectslist]
|
||||
newobjlist = []
|
||||
|
@ -797,6 +801,8 @@ def offset(obj,delta,copy=False,bind=False,sym=False,occ=False):
|
|||
and the offsetted wires will be bound by their endpoints, forming a face
|
||||
if sym is True, bind must be true too, and the offset is made on both
|
||||
sides, the total width being the given delta length.'''
|
||||
import Part
|
||||
from draftlibs import fcgeo
|
||||
|
||||
def getRect(p,obj):
|
||||
"returns length,heigh,placement"
|
||||
|
@ -910,6 +916,7 @@ def draftify(objectslist,makeblock=False):
|
|||
'''draftify(objectslist,[makeblock]): turns each object of the given list
|
||||
(objectslist can also be a single object) into a Draft parametric
|
||||
wire. If makeblock is True, multiple objects will be grouped in a block'''
|
||||
from draftlibs import fcgeo
|
||||
if not isinstance(objectslist,list):
|
||||
objectslist = [objectslist]
|
||||
newobjlist = []
|
||||
|
@ -949,6 +956,8 @@ def getSVG(obj,modifier=100,textmodifier=100,linestyle="continuous",fillstyle="s
|
|||
specifies a scale factor for linewidths in %, and textmodifier specifies
|
||||
a scale factor for texts, in % (both default = 100). You can also supply
|
||||
an arbitrary projection vector.'''
|
||||
import Part
|
||||
from draftlibs import fcgeo
|
||||
svg = ""
|
||||
tmod = ((textmodifier-100)/2)+100
|
||||
if tmod == 0: tmod = 0.01
|
||||
|
@ -1179,7 +1188,8 @@ def makeSketch(objectslist,autoconstraints=False,addTo=None,name="Sketch"):
|
|||
constraints will be automatically added to wire nodes, rectangles
|
||||
and circles. If addTo is an existing sketch, geometry will be added to it instead of
|
||||
creating a new one.'''
|
||||
|
||||
import Part
|
||||
from draftlibs import fcgeo
|
||||
from Sketcher import Constraint
|
||||
|
||||
StartPoint = 1
|
||||
|
@ -1382,6 +1392,8 @@ class _ViewProviderDimension:
|
|||
obj.Override = ''
|
||||
|
||||
def calcGeom(self,obj):
|
||||
import Part
|
||||
from draftlibs import fcgeo
|
||||
p1 = obj.Start
|
||||
p4 = obj.End
|
||||
base = Part.Line(p1,p4).toShape()
|
||||
|
@ -1732,6 +1744,8 @@ class _ViewProviderAngularDimension:
|
|||
self.onChanged(vobj,"FontName")
|
||||
|
||||
def calcGeom(self,obj):
|
||||
import Part
|
||||
from draftlibs import fcgeo
|
||||
rad = (obj.Dimline.sub(obj.Center)).Length
|
||||
cir = Part.makeCircle(rad,obj.Center,Vector(0,0,1),obj.FirstAngle,obj.LastAngle)
|
||||
cp = fcgeo.findMidpoint(cir.Edges[0])
|
||||
|
@ -1856,6 +1870,7 @@ class _Rectangle:
|
|||
self.createGeometry(fp)
|
||||
|
||||
def createGeometry(self,fp):
|
||||
import Part
|
||||
plm = fp.Placement
|
||||
p1 = Vector(0,0,0)
|
||||
p2 = Vector(p1.x+fp.Length,p1.y,p1.z)
|
||||
|
@ -1910,6 +1925,7 @@ class _Circle:
|
|||
self.createGeometry(fp)
|
||||
|
||||
def createGeometry(self,fp):
|
||||
import Part
|
||||
plm = fp.Placement
|
||||
shape = Part.makeCircle(fp.Radius,Vector(0,0,0),
|
||||
Vector(0,0,1),fp.FirstAngle,fp.LastAngle)
|
||||
|
@ -1967,6 +1983,8 @@ class _Wire:
|
|||
fp.Points = pts
|
||||
|
||||
def createGeometry(self,fp):
|
||||
import Part
|
||||
from draftlibs import fcgeo
|
||||
plm = fp.Placement
|
||||
if fp.Base and (not fp.Tool):
|
||||
if fp.Base.isDerivedFrom("Sketcher::SketchObject"):
|
||||
|
@ -2065,6 +2083,7 @@ class _Polygon:
|
|||
self.createGeometry(fp)
|
||||
|
||||
def createGeometry(self,fp):
|
||||
import Part
|
||||
plm = fp.Placement
|
||||
angle = (math.pi*2)/fp.FacesNumber
|
||||
if fp.DrawMode == 'inscribed':
|
||||
|
@ -2142,6 +2161,7 @@ class _BSpline:
|
|||
self.createGeometry(fp)
|
||||
|
||||
def createGeometry(self,fp):
|
||||
import Part
|
||||
plm = fp.Placement
|
||||
if fp.Points:
|
||||
if fp.Points[0] == fp.Points[-1]:
|
||||
|
@ -2209,6 +2229,7 @@ class _Block:
|
|||
self.createGeometry(fp)
|
||||
|
||||
def createGeometry(self,fp):
|
||||
import Part
|
||||
plm = fp.Placement
|
||||
shps = []
|
||||
for c in fp.Components:
|
||||
|
@ -2247,6 +2268,8 @@ class _Shape2DView:
|
|||
self.createGeometry(obj)
|
||||
|
||||
def createGeometry(self,obj):
|
||||
import Drawing
|
||||
from draftlibs import fcgeo
|
||||
pl = obj.Placement
|
||||
if obj.Base:
|
||||
if obj.Base.isDerivedFrom("Part::Feature"):
|
||||
|
@ -2296,6 +2319,7 @@ class _Array:
|
|||
self.createGeometry(obj)
|
||||
|
||||
def createGeometry(self,obj):
|
||||
from draftlibs import fcgeo
|
||||
if obj.Base:
|
||||
pl = obj.Placement
|
||||
if obj.ArrayType == "ortho":
|
||||
|
@ -2307,6 +2331,7 @@ class _Array:
|
|||
obj.Placement = pl
|
||||
|
||||
def rectArray(self,shape,xvector,yvector,xnum,ynum):
|
||||
import Part
|
||||
base = [shape.copy()]
|
||||
for xcount in range(xnum):
|
||||
currentxvector=fcvec.scale(xvector,xcount)
|
||||
|
@ -2324,6 +2349,7 @@ class _Array:
|
|||
return Part.makeCompound(base)
|
||||
|
||||
def polarArray(self,shape,center,angle,num):
|
||||
import Part
|
||||
fraction = angle/num
|
||||
base = [shape.copy()]
|
||||
for i in range(num):
|
||||
|
@ -2356,6 +2382,7 @@ class _Point:
|
|||
self.createGeometry(fp)
|
||||
|
||||
def createGeometry(self,fp):
|
||||
import Part
|
||||
shape = Part.Vertex(Vector(fp.X,fp.Y,fp.Z))
|
||||
fp.Shape = shape
|
||||
|
||||
|
|
|
@ -26,9 +26,9 @@ __author__ = "Yorik van Havre"
|
|||
__url__ = "http://free-cad.sourceforge.net"
|
||||
|
||||
|
||||
import FreeCAD, FreeCADGui, math, Draft, DraftGui, DraftTrackers, Part, SketcherGui
|
||||
import FreeCAD, FreeCADGui, math, Draft, DraftGui, DraftTrackers
|
||||
from DraftGui import todo
|
||||
from draftlibs import fcvec,fcgeo
|
||||
from draftlibs import fcvec
|
||||
from FreeCAD import Vector
|
||||
from pivy import coin
|
||||
from PyQt4 import QtCore,QtGui
|
||||
|
@ -101,6 +101,10 @@ class Snapper:
|
|||
be True to constrain the point against the closest working plane axis.
|
||||
Screenpos can be a list, a tuple or a coin.SbVec2s object."""
|
||||
|
||||
global Part,fcgeo
|
||||
import Part, SketcherGui
|
||||
from draftlibs import fcgeo
|
||||
|
||||
def cstr(point):
|
||||
"constrains if needed"
|
||||
if constrain:
|
||||
|
@ -110,7 +114,7 @@ class Snapper:
|
|||
return point
|
||||
|
||||
snaps = []
|
||||
|
||||
|
||||
# type conversion if needed
|
||||
if isinstance(screenpos,list):
|
||||
screenpos = tuple(screenpos)
|
||||
|
|
|
@ -29,9 +29,9 @@ __url__ = "http://free-cad.sourceforge.net"
|
|||
# Generic stuff
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
import os, FreeCAD, FreeCADGui, Part, WorkingPlane, math, re, importSVG, Draft, Draft_rc
|
||||
import os, FreeCAD, FreeCADGui, WorkingPlane, math, re, importSVG, Draft, Draft_rc
|
||||
from functools import partial
|
||||
from draftlibs import fcvec,fcgeo
|
||||
from draftlibs import fcvec
|
||||
from FreeCAD import Vector
|
||||
from DraftGui import todo,QtCore,QtGui
|
||||
from DraftSnap import *
|
||||
|
@ -311,6 +311,9 @@ class Creator:
|
|||
def Activated(self,name="None"):
|
||||
if FreeCAD.activeDraftCommand:
|
||||
FreeCAD.activeDraftCommand.finish()
|
||||
global Part, fcgeo
|
||||
import Part
|
||||
from draftlibs import fcgeo
|
||||
self.ui = None
|
||||
self.call = None
|
||||
self.doc = None
|
||||
|
@ -1624,6 +1627,9 @@ class Modifier:
|
|||
def Activated(self,name="None"):
|
||||
if FreeCAD.activeDraftCommand:
|
||||
FreeCAD.activeDraftCommand.finish()
|
||||
global Part, fcgeo
|
||||
import Part
|
||||
from draftlibs import fcgeo
|
||||
self.ui = None
|
||||
self.call = None
|
||||
self.commitList = []
|
||||
|
|
|
@ -25,15 +25,18 @@ __title__="FreeCAD Draft Trackers"
|
|||
__author__ = "Yorik van Havre"
|
||||
__url__ = "http://free-cad.sourceforge.net"
|
||||
|
||||
import FreeCAD,FreeCADGui,math,Draft,Part
|
||||
import FreeCAD,FreeCADGui,math,Draft
|
||||
from FreeCAD import Vector
|
||||
from draftlibs import fcvec,fcgeo
|
||||
from draftlibs import fcvec
|
||||
from pivy import coin
|
||||
from DraftGui import todo
|
||||
|
||||
class Tracker:
|
||||
"A generic Draft Tracker, to be used by other specific trackers"
|
||||
def __init__(self,dotted=False,scolor=None,swidth=None,children=[],ontop=False):
|
||||
global Part, fcgeo
|
||||
import Part
|
||||
from draftlibs import fcgeo
|
||||
self.ontop = ontop
|
||||
color = coin.SoBaseColor()
|
||||
color.rgb = scolor or FreeCADGui.draftToolBar.getDefaultColor("ui")
|
||||
|
@ -228,6 +231,7 @@ class dimTracker(Tracker):
|
|||
self.calc()
|
||||
|
||||
def calc(self):
|
||||
import Part
|
||||
if (self.p1 != None) and (self.p2 != None):
|
||||
points = [fcvec.tup(self.p1,True),fcvec.tup(self.p2,True),\
|
||||
fcvec.tup(self.p1,True),fcvec.tup(self.p2,True)]
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#***************************************************************************
|
||||
|
||||
|
||||
import FreeCAD, FreeCADGui, Part, math
|
||||
import FreeCAD, FreeCADGui, math
|
||||
from FreeCAD import Vector
|
||||
from draftlibs import fcvec
|
||||
|
||||
|
|
|
@ -31,8 +31,8 @@ paths, lines, arcs and rects.
|
|||
Bezier curves are skipped.
|
||||
'''
|
||||
|
||||
import xml.sax, string, FreeCAD, os, Part, math, re, Draft
|
||||
from draftlibs import fcvec, fcgeo
|
||||
import xml.sax, string, FreeCAD, os, math, re, Draft
|
||||
from draftlibs import fcvec
|
||||
from FreeCAD import Vector
|
||||
|
||||
try: import FreeCADGui
|
||||
|
@ -241,6 +241,8 @@ class svgHandler(xml.sax.ContentHandler):
|
|||
self.transform = None
|
||||
self.grouptransform = []
|
||||
self.lastdim = None
|
||||
|
||||
import Part
|
||||
|
||||
if gui and draftui:
|
||||
r = float(draftui.color.red()/255.0)
|
||||
|
|
Loading…
Reference in New Issue
Block a user