Made recommended formatting changes.

This commit is contained in:
David Daish
2020-04-01 17:02:05 +13:00
committed by Yorik van Havre
parent 8f910713d4
commit f868ff36ea
2 changed files with 411 additions and 423 deletions

View File

@@ -134,24 +134,24 @@ def removeFromComponent(compobject,subobject):
class Component(ArchIFC.IfcProduct):
"""The Arch Component object.
Acts as a base for all other Arch objects, such as Arch walls and Arch
structures. It's properties and behaviours are common to all Arch objects.
Acts as a base for all other Arch objects, such as Arch walls and Arch
structures. It's properties and behaviours are common to all Arch objects.
You can learn more about Arch Components, and the purpose of Arch Components
here: https://wiki.freecadweb.org/Arch_Component
"""
You can learn more about Arch Components, and the purpose of Arch Components
here: https://wiki.freecadweb.org/Arch_Component
"""
def __init__(self, obj):
"""Initialises the Component.
Registers the Proxy as this class object. Sets the object to have the
properties of an Arch component.
Registers the Proxy as this class object. Sets the object to have the
properties of an Arch component.
Parameters
----------
obj: <App::FeaturePython>
The object to turn into an Arch Component
"""
Parameters
----------
obj: <App::FeaturePython>
The object to turn into an Arch Component
"""
obj.Proxy = self
Component.setProperties(self, obj)
@@ -160,8 +160,8 @@ obj: <App::FeaturePython>
def setProperties(self, obj):
"""Gives the component it's component specific properties, such as material.
You can learn more about properties here: https://wiki.freecadweb.org/property
"""
You can learn more about properties here: https://wiki.freecadweb.org/property
"""
ArchIFC.IfcProduct.setProperties(self, obj)
@@ -236,29 +236,29 @@ You can learn more about properties here: https://wiki.freecadweb.org/property
def onBeforeChange(self,obj,prop):
"""Method called before the object has a property changed.
Specifically, this method is called before the value changes.
Specifically, this method is called before the value changes.
If "Placement" has changed, it records the old placement, so that .onChanged()
can compare between the old and new placement, and move it's children
accordingly.
"""
If "Placement" has changed, it records the old placement, so that .onChanged()
can compare between the old and new placement, and move it's children
accordingly.
"""
if prop == "Placement":
self.oldPlacement = FreeCAD.Placement(obj.Placement)
def onChanged(self, obj, prop):
"""Method called when the object has a property changed.
If "Placement" has changed, the component moves any children components that
have been set to move with their host, such that they stay in the same location
to this component.
If "Placement" has changed, the component moves any children components that
have been set to move with their host, such that they stay in the same location
to this component.
Also calls ArchIFC.IfcProduct.onChanged().
Also calls ArchIFC.IfcProduct.onChanged().
Parameters
----------
prop: string
The name of the property that has changed.
"""
Parameters
----------
prop: string
The name of the property that has changed.
"""
ArchIFC.IfcProduct.onChanged(self, obj, prop)
@@ -293,15 +293,15 @@ prop: string
def getMovableChildren(self,obj):
"""Finds the component's children set to move with their host.
In this case, children refer to Additions, Subtractions, and objects linked to
this object that refer to it as a host in the "Host" or "Hosts" properties.
Objects are set to move with their host via the MoveWithHost property.
In this case, children refer to Additions, Subtractions, and objects linked to
this object that refer to it as a host in the "Host" or "Hosts" properties.
Objects are set to move with their host via the MoveWithHost property.
Returns
-------
list of <App::FeaturePython>
List of child objects set to move with their host.
"""
Returns
-------
list of <App::FeaturePython>
List of child objects set to move with their host.
"""
ilist = obj.Additions + obj.Subtractions
for o in obj.InList:
@@ -323,14 +323,14 @@ list of <App::FeaturePython>
def getParentHeight(self,obj):
"""Gets a height value from hosts.
Recursively crawls hosts until it finds a Floor or BuildingPart, then returns
the value of it's Height property.
Recursively crawls hosts until it finds a Floor or BuildingPart, then returns
the value of it's Height property.
Returns
-------
<App::PropertyLength>
The Height value of the found Floor or BuildingPart.
"""
Returns
-------
<App::PropertyLength>
The Height value of the found Floor or BuildingPart.
"""
for parent in obj.InList:
if Draft.getType(parent) in ["Floor","BuildingPart"]:
@@ -348,17 +348,17 @@ Returns
def clone(self,obj):
"""If the object is a clone, copies the shape.
If the object is a clone according to the "CloneOf" property, it copies the object's
shape and several properties relating to shape, such as "Length" and "Thickness".
If the object is a clone according to the "CloneOf" property, it copies the object's
shape and several properties relating to shape, such as "Length" and "Thickness".
Will only perform the copy if this object and the object it's a clone of are of the same
type, or if the object has the type "Component" or "BuildingPart".
Will only perform the copy if this object and the object it's a clone of are of the same
type, or if the object has the type "Component" or "BuildingPart".
Returns
-------
bool
True if the copy occurs, False if otherwise.
"""
Returns
-------
bool
True if the copy occurs, False if otherwise.
"""
if hasattr(obj,"CloneOf"):
if obj.CloneOf:
@@ -375,14 +375,14 @@ bool
def getSiblings(self,obj):
"""Finds objects that have the same Base object, and type.
Looks to base object, and finds other objects that are based off this base
object. If these objects are the same type, returns them.
Looks to base object, and finds other objects that are based off this base
object. If these objects are the same type, returns them.
Returns
-------
list of <App::FeaturePython>
List of objects that have the same Base and type as this component.
"""
Returns
-------
list of <App::FeaturePython>
List of objects that have the same Base and type as this component.
"""
if not hasattr(obj,"Base"):
return []
@@ -401,27 +401,27 @@ list of <App::FeaturePython>
def getExtrusionData(self,obj):
"""Gets the object's extrusion data.
This method recursively scrapes the Bases of the object, until it finds a Base
that is derived from a <Part::Extrusion>. From there, it copies the extrusion
to the (0,0,0) origin.
This method recursively scrapes the Bases of the object, until it finds a Base
that is derived from a <Part::Extrusion>. From there, it copies the extrusion
to the (0,0,0) origin.
With this copy, it gets the <Part.Face> the shape was originally extruded from, the
<Base.Vector> of the extrusion, and the <Base.Placement> needed to move the copy back to it's
original location/orientation. It will return this data as a tuple.
With this copy, it gets the <Part.Face> the shape was originally extruded from, the
<Base.Vector> of the extrusion, and the <Base.Placement> needed to move the copy back to it's
original location/orientation. It will return this data as a tuple.
If it encounters an object derived from a <Part::Multifuse>, it will return this data
as a tuple containing lists. The lists will contain the same data as above, from each
of the objects within the multifuse.
If it encouters an object derived from a <Part::Multifuse>, it will return this data
as a tuple containing lists. The lists will contain the same data as above, from each
of the objects within the multifuse.
Returns
-------
tuple
Tuple containing:
Returns
-------
tuple
Tuple containing:
1) The <Part.Face> the object was extruded from.
2) The <Base.Vector> of the extrusion.
3) The <Base.Placement> of the extrusion.
"""
1) The <Part.Face> the object was extruded from.
2) The <Base.Vector> of the extrusion.
3) The <Base.Placement> of the extrusion.
"""
if hasattr(obj,"CloneOf"):
if obj.CloneOf:
@@ -506,22 +506,22 @@ tuple
def rebase(self,shape,hint=None):
"""Copies a shape to the (0,0,0) origin.
Creates a copy of a shape, such that it's center of mass is in the (0,0,0)
origin.
Creates a copy of a shape, such that it's center of mass is in the (0,0,0)
origin.
TODO Determine the way the shape is rotated by this method.
TODO Determine the way the shape is rotated by this method.
Returns the copy of the shape, and the <Base.Placement> needed to move the copy
back to it's original location/orientation.
Returns the copy of the shape, and the <Base.Placement> needed to move the copy
back to it's original location/orientation.
Parameters
----------
shape: <Part.Shape>
The shape to copy.
hint: <Base.Vector>, optional
If the angle between the normal vector of the shape, and the hint vector is
greater than 90 degrees, the normal will be reversed before being rotated.
"""
Parameters
----------
shape: <Part.Shape>
The shape to copy.
hint: <Base.Vector>, optional
If the angle between the normal vector of the shape, and the hint vector is
greater than 90 degrees, the normal will be reversed before being rotated.
"""
import DraftGeomUtils,math
@@ -541,10 +541,7 @@ hint: <Base.Vector>, optional
if hint and hint.getAngle(n) > 1.58:
n = n.negative()
r = FreeCAD.Rotation(
FreeCAD.Vector(0,0,1),
n
)
r = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), n)
if round(abs(r.Angle),8) == round(math.pi,8):
r = FreeCAD.Rotation()
@@ -552,11 +549,9 @@ hint: <Base.Vector>, optional
for s in shape:
s = s.copy()
s.translate(v.negative())
s.rotate(
FreeCAD.Vector(0,0,0),
r.Axis,
math.degrees(-r.Angle)
)
s.rotate(FreeCAD.Vector(0, 0, 0),
r.Axis,
math.degrees(-r.Angle))
shapes.append(s)
p = FreeCAD.Placement()
p.Base = v
@@ -569,19 +564,19 @@ hint: <Base.Vector>, optional
def hideSubobjects(self,obj,prop):
"""Hides Additions and Subtractions of this Component when that list changes.
Intended to be used in conjunction with the .onChanged() method, to access the
property that has changed.
Intended to be used in conjunction with the .onChanged() method, to access the
property that has changed.
When an object loses or gains an Addition, this method hides all Additions.
When it gains or loses a Subtraction, this method hides all Subtractions.
When an object loses or gains an Addition, this method hides all Additions.
When it gains or loses a Subtraction, this method hides all Subtractions.
Does not effect objects of type Window, or clones of Windows.
Does not effect objects of type Window, or clones of Windows.
Parameters
----------
prop: string
The name of the property that has changed.
"""
Parameters
----------
prop: string
The name of the property that has changed.
"""
if FreeCAD.GuiUp:
if prop in ["Additions","Subtractions"]:
@@ -602,28 +597,28 @@ prop: string
def processSubShapes(self,obj,base,placement=None):
"""Adds Additions and Subtractions to a base shape.
If Additions exist, fuses then to the base shape. If no base is provided, it
will just fuse other additions to the first addition.
If Additions exist, fuses then to the base shape. If no base is provided, it
will just fuse other additions to the first addition.
If Subtractions exist, it will cut them from the base shape. Roofs and Windows
are treated uniquely, as they define their own Shape to subtract from parent
shapes using their .getSubVolume() methods.
If Subtractions exist, it will cut them from the base shape. Roofs and Windows
are treated uniquely, as they define their own Shape to subtract from parent
shapes using their .getSubVolume() methods.
TODO determine what the purpose of the placement argument is.
TODO determine what the purpose of the placement argument is.
Parameters
----------
base: <Part.Shape>, optional
The base shape to add Additions and Subtractions to.
placement: <Base.Placement>, optional
Prior to adding or subtracting subshapes, the <Base.Placement> of the
subshapes are multiplied by the inverse of this parameter.
Parameters
----------
base: <Part.Shape>, optional
The base shape to add Additions and Subtractions to.
placement: <Base.Placement>, optional
Prior to adding or subtracting subshapes, the <Base.Placement> of the
subshapes are multiplied by the inverse of this parameter.
Returns
-------
<Part.Shape>
The base shape, with the additions and subtractions performed.
"""
Returns
-------
<Part.Shape>
The base shape, with the additions and subtractions performed.
"""
import Draft,Part
#print("Processing subshapes of ",obj.Label, " : ",obj.Additions)
@@ -726,26 +721,25 @@ Returns
def spread(self,obj,shape,placement=None):
"""Copies the object to it's Axis's points.
If the object has the "Axis" property assigned, this method creates a copy of
the shape for each point on the object assigned as the "Axis". Each of these
copies are then translated, equal to the displacement of the points from the
(0,0,0) origin.
If the object has the "Axis" property assigned, this method creates a copy of
the shape for each point on the object assigned as the "Axis". Each of these
copies are then translated, equal to the displacement of the points from the
(0,0,0) origin.
If the object's "Axis" is unassigned, returns the original shape unchanged.
If the object's "Axis" is unassigned, returns the original shape unchanged.
Parameters
----------
shape: <Part.Shape>
The shape to copy.
placement:
Does nothing.
Parameters
----------
shape: <Part.Shape>
The shape to copy.
placement:
Does nothing.
Returns
-------
<Part.Shape>
The shape, either spread to the axis points, or unchanged.
"""
Returns
-------
<Part.Shape>
The shape, either spread to the axis points, or unchanged.
"""
points = None
if hasattr(obj,"Axis"):
@@ -769,19 +763,19 @@ Returns
def isIdentity(self,placement):
"""Checks if a placement is *almost* zero.
Check if a <Base.Placement>'s displacement from (0,0,0) is almost zero, and if
the angle of it's rotation about it's axis is almost zero.
Check if a <Base.Placement>'s displacement from (0,0,0) is almost zero, and if
the angle of it's rotation about it's axis is almost zero.
Parameters
----------
placement: <Base.Placement>
The placement to examine.
Parameters
----------
placement: <Base.Placement>
The placement to examine.
Returns
-------
bool
Returns true if angle and displacement are almost zero, false it otherwise.
"""
Returns
-------
bool
Returns true if angle and displacement are almost zero, false it otherwise.
"""
if (placement.Base.Length < 0.000001) and (placement.Rotation.Angle < 0.000001):
return True
@@ -790,26 +784,26 @@ bool
def applyShape(self,obj,shape,placement,allowinvalid=False,allownosolid=False):
"""Checks the given shape, then assigns it to the object.
Checks if the shape is valid, isn't null, and if it has volume. Removes
redundant edges from the shape. Spreads shape to the "Axis" with method
.spread().
Checks if the shape is valid, isn't null, and if it has volume. Removes
redundant edges from the shape. Spreads shape to the "Axis" with method
.spread().
Sets the object's Shape and Placement to the values given, if successful.
Sets the object's Shape and Placement to the values given, if successful.
Finally, runs .computeAreas() method, to calculate the horizontal and vertical
area of the shape.
Finally, runs .computeAreas() method, to calculate the horizontal and vertical
area of the shape.
Parameters
----------
shape: <Part.Shape>
The shape to check and apply to the object.
placement: <Base.Placement>
The placement to apply to the object.
allowinvalid: bool, optional
Whether to allow invalid shapes, or to throw an error.
allownosolid: bool, optional
Whether to allow non-solid shapes, or to throw an error.
"""
Parameters
----------
shape: <Part.Shape>
The shape to check and apply to the object.
placement: <Base.Placement>
The placement to apply to the object.
allowinvalid: bool, optional
Whether to allow invalid shapes, or to throw an error.
allownosolid: bool, optional
Whether to allow non-solid shapes, or to throw an error.
"""
if shape:
if not shape.isNull():
@@ -854,19 +848,19 @@ allownosolid: bool, optional
def computeAreas(self,obj):
"""Computes the area properties of the object's shape.
Computes the vertical area, horizontal area, and perimeter length of the
object's shape.
Computes the vertical area, horizontal area, and perimeter length of the
object's shape.
The vertical area is the surface area of the faces perpendicular to the ground.
The vertical area is the surface area of the faces perpendicular to the ground.
The horizontal area is the area of the shape, when projected onto a hyperplane
across the XY axises, IE: the area when viewed from a bird's eye view.
The horizontal area is the area of the shape, when projected onto a hyperplane
across the XY axises, IE: the area when viewed from a bird's eye view.
The perimeter length is the length of the outside edges of this bird's eye view.
The perimeter length is the length of the outside edges of this bird's eye view.
These values are assigned to the object's "VerticalArea", "HorizontalArea", and
"PerimeterLength" properties.
"""
These values are assigned to the object's "VerticalArea", "HorizontalArea", and
"PerimeterLength" properties.
"""
if (not obj.Shape) or obj.Shape.isNull() or (not obj.Shape.isValid()) or (not obj.Shape.Faces):
@@ -937,22 +931,22 @@ These values are assigned to the object's "VerticalArea", "HorizontalArea", and
def isStandardCase(self,obj):
"""Determines if the component is a standard case of it's IFC type.
Not all IFC types have a standard case.
Not all IFC types have a standard case.
If an object is a standard case or not varies between the different types. Each
type has it's own rules to define what is a standard case.
If an object is a standard case or not varies between the different types. Each
type has it's own rules to define what is a standard case.
Rotated objects, or objects with Additions or Subtractions are not standard
cases.
Rotated objects, or objects with Additions or Subtractions are not standard
cases.
All objects whose IfcType is suffixed with the string " Sandard Case" is
automatically a standard case.
All objects whose IfcType is suffixed with the string " Sandard Case" is
automatically a standard case.
Returns
-------
bool
Whether the object is a standard case or not.
"""
Returns
-------
bool
Whether the object is a standard case or not.
"""
# Standard Case has been set manually by the user
if obj.IfcType.endswith("Standard Case"):
@@ -1006,22 +1000,22 @@ bool
class ViewProviderComponent:
"""A default View Provider for Component objects.
Acts as a base for all other Arch view providers. Its properties and
behaviours are common to all Arch view providers.
"""
Acts as a base for all other Arch view providers. Its properties and
behaviours are common to all Arch view providers.
"""
def __init__(self,vobj):
"""Initialises the Component view provider.
Registers the Proxy as this class object. Registers the Object, as the view
provider's object. Sets the view provider to have the
properties of an Arch component.
Registers the Proxy as this class object. Registers the Object, as the view
provider's object. Sets the view provider to have the
properties of an Arch component.
Parameters
----------
vobj: <Gui.ViewProviderDocumentObject>
The view provider to turn into an Component view provider.
"""
Parameters
----------
vobj: <Gui.ViewProviderDocumentObject>
The view provider to turn into an Component view provider.
"""
vobj.Proxy = self
self.Object = vobj.Object
@@ -1030,8 +1024,8 @@ vobj: <Gui.ViewProviderDocumentObject>
def setProperties(self,vobj):
"""Gives the component view provider it's component view provider specific properties.
You can learn more about properties here: https://wiki.freecadweb.org/property
"""
You can learn more about properties here: https://wiki.freecadweb.org/property
"""
if not "UseMaterialColor" in vobj.PropertiesList:
vobj.addProperty("App::PropertyBool","UseMaterialColor","Component",QT_TRANSLATE_NOOP("App::Property","Use the material color as this object's shape color, if available"))
@@ -1040,17 +1034,17 @@ You can learn more about properties here: https://wiki.freecadweb.org/property
def updateData(self,obj,prop):
"""Method called when the host object has a property changed.
If the object has a Material associated with it, matches the view object's
ShapeColor and Transparency to match the Material.
If the object has a Material associated with it, matches the view object's
ShapeColor and Transparency to match the Material.
If the object is now cloned, or is part of a compound, the view object inherits
the DiffuseColor.
If the object is now cloned, or is part of a compound, the view object inherits
the DiffuseColor.
Parameters
----------
prop: string
The name of the property that has changed.
"""
Parameters
----------
prop: string
The name of the property that has changed.
"""
#print(obj.Name," : updating ",prop)
if prop == "Material":
@@ -1092,14 +1086,14 @@ prop: string
def getIcon(self):
"""Returns the path to the appropriate icon.
If a clone, returns the cloned component icon path. Otherwise returns the Arch Component
icon.
If a clone, returns the cloned component icon path. Otherwise returns the Arch Component
icon.
Returns
-------
str
Path to the appropriate icon .svg file.
"""
Returns
-------
str
Path to the appropriate icon .svg file.
"""
import Arch_rc
if hasattr(self,"Object"):
@@ -1111,19 +1105,19 @@ str
def onChanged(self,vobj,prop):
"""Method called when the view provider has a property changed.
If DiffuseColor changes, change DiffuseColor to copy the host object's clone,
if it exists.
If DiffuseColor changes, change DiffuseColor to copy the host object's clone,
if it exists.
If ShapeColor changes, overwrite it with DiffuseColor.
If ShapeColor changes, overwrite it with DiffuseColor.
If Visibility changes, propagate the change to all view objects that are also
hosted by this view object's host.
If Visibility changes, propagate the change to all view objects that are also
hosted by this view object's host.
Parameters
----------
prop: string
The name of the property that has changed.
"""
Parameters
----------
prop: string
The name of the property that has changed.
"""
#print(vobj.Object.Name, " : changing ",prop)
#if prop == "Visibility":

View File

@@ -48,56 +48,56 @@ __author__ = "Yorik van Havre"
__url__ = "http://www.freecadweb.org"
__doc__="""This module provides tools to build Wall objects. Walls are simple
objects, usually vertical, typically obtained by giving a thickness to a base
line, then extruding it vertically.
objects, usually vertical, typically obtained by giving a thickness to a base
line, then extruding it vertically.
Examples
--------
TODO put examples here.
Examples
--------
TODO put examples here.
"""
"""
def makeWall(baseobj=None,height=None,length=None,width=None,align="Center",face=None,name="Wall"):
'''Creates a wall based on a given object, and returns the generated wall.
"""Creates a wall based on a given object, and returns the generated wall.
TODO: It is unclear what defines which units this function uses.
TODO: It is unclear what defines which units this function uses.
Parameters
----------
baseobj: <Part::PartFeature>, optional
The base object with which to build the wall. This can be a sketch, a draft
object, a face, or a solid. It can also be left as None.
height: float, optional
The height of the wall.
length: float, optional
The length of the wall. Not used if the wall is based off an object.
Will use Arch default if left empty.
width: float, optional
The width of the wall. Not used if the base object is a face. Will
use Arch default if left empty.
align: str, optional
Either "Center", "Left", or "Right". Effects the alignment of the wall on
it's baseline.
face: int, optional
The index number of a face on the given baseobj, to base the wall on.
name: str, optional
The name to give to the created wall.
Parameters
----------
baseobj: <Part::PartFeature>, optional
The base object with which to build the wall. This can be a sketch, a draft
object, a face, or a solid. It can also be left as None.
height: float, optional
The height of the wall.
length: float, optional
The length of the wall. Not used if the wall is based off an object.
Will use Arch default if left empty.
width: float, optional
The width of the wall. Not used if the base object is a face. Will
use Arch default if left empty.
align: str, optional
Either "Center", "Left", or "Right". Effects the alignment of the wall on
it's baseline.
face: int, optional
The index number of a face on the given baseobj, to base the wall on.
name: str, optional
The name to give to the created wall.
Returns
-------
<Part::FeaturePython>
Returns the generated wall.
Returns
-------
<Part::FeaturePython>
Returns the generated wall.
Notes
-----
Creates a new <Part::FeaturePython> object, and turns it into a parametric wall
object. This <Part::FeaturePython> object does not yet have any shape.
Notes
-----
Creates a new <Part::FeaturePython> object, and turns it into a parametric wall
object. This <Part::FeaturePython> object does not yet have any shape.
The wall then uses the baseobj.Shape as the basis to extrude out a wall shape,
giving the new <Part::FeaturePython> object a shape.
The wall then uses the baseobj.Shape as the basis to extrude out a wall shape,
giving the new <Part::FeaturePython> object a shape.
It then hides the original baseobj.
'''
It then hides the original baseobj.
"""
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
@@ -134,24 +134,24 @@ It then hides the original baseobj.
def joinWalls(walls,delete=False):
""" Joins the given list of walls into one sketch-based wall.
Takes the first wall in the list, and adds on the other walls in the list.
Returns the modified first wall.
Takes the first wall in the list, and adds on the other walls in the list.
Returns the modified first wall.
Setting delete to True, will delete the other walls. Will only join walls if
the walls have the same width, height and alignment.
Setting delete to True, will delete the other walls. Will only join walls if
the walls have the same width, height and alignment.
Parameters
----------
walls: list of <Part::FeaturePython>
List containing the walls to add to the first wall in the list. Walls must
be based off a base object.
delete: bool, optional
If True, deletes the other walls in the list.
Parameters
----------
walls: list of <Part::FeaturePython>
List containing the walls to add to the first wall in the list. Walls must
be based off a base object.
delete: bool, optional
If True, deletes the other walls in the list.
Returns
-------
<Part::FeaturePython>
"""
Returns
-------
<Part::FeaturePython>
"""
import Part
if not walls:
@@ -190,9 +190,9 @@ Returns
def mergeShapes(w1,w2):
"""Not currently implemented.
Returns a Shape built on two walls that share same properties and have a
coincident endpoint.
"""
Returns a Shape built on two walls that share same properties and have a
coincident endpoint.
"""
if not areSameWallTypes([w1,w2]):
return None
@@ -219,15 +219,15 @@ coincident endpoint.
def areSameWallTypes(walls):
"""Checks if a list of walls have the same height, width and alignment.
Parameters
----------
walls: list of <class 'ArchComponent.Component'>
Parameters
----------
walls: list of <class 'ArchComponent.Component'>
Returns
-------
bool
True if the walls have the same height, width and alignment, false if otherwise.
"""
Returns
-------
bool
True if the walls have the same height, width and alignment, false if otherwise.
"""
for att in ["Width","Height","Align"]:
value = None
@@ -250,13 +250,13 @@ bool
class _CommandWall:
"""The command definition for the Arch workbench's gui tool, Arch Wall. A tool for creating Arch walls.
Creates a wall from the object selected by the user. If no objects are
selected, enters an interactive mode to create a wall using selected points
to create a base.
Creates a wall from the object selected by the user. If no objects are
selected, enters an interactive mode to create a wall using selected points
to create a base.
Find documentation on the end user usage of Arch Wall here:
https://wiki.freecadweb.org/Arch_Wall
"""
Find documentation on the end user usage of Arch Wall here:
https://wiki.freecadweb.org/Arch_Wall
"""
def GetResources(self):
"""Returns a dictionary with the visual aspects of the Arch Wall tool."""
@@ -277,10 +277,10 @@ https://wiki.freecadweb.org/Arch_Wall
def Activated(self):
"""Executed when Arch Wall is called.
Creates a wall from the object selected by the user. If no objects are
selected, enters an interactive mode to create a wall using selected points
to create a base.
"""
Creates a wall from the object selected by the user. If no objects are
selected, enters an interactive mode to create a wall using selected points
to create a base.
"""
p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch")
self.Align = ["Center","Left","Right"][p.GetInt("WallAlignment",0)]
@@ -327,25 +327,23 @@ to create a base.
self.tracker = DraftTrackers.boxTracker()
if hasattr(FreeCAD,"DraftWorkingPlane"):
FreeCAD.DraftWorkingPlane.setup()
FreeCADGui.Snapper.getPoint(
callback=self.getPoint,
extradlg=self.taskbox(),
title=translate("Arch","First point of wall")+":"
)
FreeCADGui.Snapper.getPoint(callback=self.getPoint,
extradlg=self.taskbox(),
title=translate("Arch","First point of wall")+":")
def getPoint(self,point=None,obj=None):
"""Callback for clicks during interactive mode.
When method _CommandWall.Activated() has entered the interactive mode, this
callback runs when the user clicks.
When method _CommandWall.Activated() has entered the interactive mode, this
callback runs when the user clicks.
Parameters
----------
point: <class 'Base.Vector'>
The point the user has selected.
obj: <Part::PartFeature>, optional
The object the user's cursor snapped to, if any.
"""
Parameters
----------
point: <class 'Base.Vector'>
The point the user has selected.
obj: <Part::PartFeature>, optional
The object the user's cursor snapped to, if any.
"""
if obj:
if Draft.getType(obj) == "Wall":
@@ -359,20 +357,16 @@ obj: <Part::PartFeature>, optional
self.tracker.width(self.Width)
self.tracker.height(self.Height)
self.tracker.on()
FreeCADGui.Snapper.getPoint(
last=self.points[0],
callback=self.getPoint,
movecallback=self.update,
extradlg=self.taskbox(),
title=translate("Arch","Next point")+":",mode="line"
)
FreeCADGui.Snapper.getPoint(last=self.points[0],
callback=self.getPoint,
movecallback=self.update,
extradlg=self.taskbox(),
title=translate("Arch","Next point")+":",mode="line")
elif len(self.points) == 2:
import Part
l = Part.LineSegment(
FreeCAD.DraftWorkingPlane.getLocalCoords(self.points[0]),
FreeCAD.DraftWorkingPlane.getLocalCoords(self.points[1])
)
l = Part.LineSegment(FreeCAD.DraftWorkingPlane.getLocalCoords(self.points[0]),
FreeCAD.DraftWorkingPlane.getLocalCoords(self.points[1])
self.tracker.finalize()
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Wall"))
FreeCADGui.addModule("Arch")
@@ -408,12 +402,12 @@ obj: <Part::PartFeature>, optional
def addDefault(self):
"""Creates a wall using a line segment, with all parameters as the default.
Used solely by _CommandWall.getPoint() when the interactive mode has selected
two points.
Used solely by _CommandWall.getPoint() when the interactive mode has selected
two points.
Relies on the assumption that FreeCADGui.doCommand() has already created a
Part.LineSegment assigned as the variable "trace"
"""
Relies on the assumption that FreeCADGui.doCommand() has already created a
Part.LineSegment assigned as the variable "trace"
"""
FreeCADGui.addModule("Draft")
if FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch").GetBool("WallSketches",True):
@@ -432,15 +426,15 @@ Part.LineSegment assigned as the variable "trace"
def update(self,point):
"""Callback for the mouse moving during the interactive mode.
Updates the active dialog box to show the coordinates of the location of the
cursor. It also shows the length the line would take, if the user selected that
point.
Updates the active dialog box to show the co-ordinates of the location of the
cursor. It also shows the length the line would take, if the user selected that
point.
Parameters
----------
point: <class 'Base.Vector'>
The point the cursor is currently at, or has snapped to.
"""
Parameters
----------
point: <class 'Base.Vector'>
The point the cursor is currently at, or has snapped to.
"""
if FreeCADGui.Control.activeDialog():
b = self.points[0]
@@ -581,8 +575,8 @@ point: <class 'Base.Vector'>
def setContinue(self,i):
"""Simple callback to set if the interactive mode will restart when finished.
This allows for several walls to be placed one after another.
"""
This allows for several walls to be placed one after another.
"""
self.continueCmd = bool(i)
if hasattr(FreeCADGui,"draftToolBar"):
@@ -610,11 +604,11 @@ This allows for several walls to be placed one after another.
class _CommandMergeWalls:
"""The command definition for the Arch workbench's gui tool, Arch MergeWalls. A tool for merging walls.
Joins two or more walls by using the ArchWall.joinWalls() function.
Joins two or more walls by using the ArchWall.joinWalls() function.
Find documentation on the end user usage of Arch Wall here:
https://wiki.freecadweb.org/Arch_MergeWalls
"""
Find documentation on the end user usage of Arch Wall here:
https://wiki.freecadweb.org/Arch_MergeWalls
"""
def GetResources(self):
"""Returns a dictionary with the visual aspects of the Arch MergeWalls tool."""
@@ -634,11 +628,12 @@ https://wiki.freecadweb.org/Arch_MergeWalls
def Activated(self):
"""Executed when Arch MergeWalls is called.
Calls ArchWall.joinWalls() on walls selected by the user, with the delete
option enabled. If the user has selected a single wall, check to see if the
wall has any Additions that are walls. If so, merges these additions to the
wall, deleting the additions.
"""
Calls ArchWall.joinWalls() on walls selected by the user, with the delete
option enabled. If the user has selected a single wall, check to see if the
wall has any Additions that are walls. If so, merges these additions to the
wall, deleting the additions.
"""
walls = FreeCADGui.Selection.getSelection()
if len(walls) == 1:
if Draft.getType(walls[0]) == "Wall":
@@ -672,21 +667,21 @@ wall, deleting the additions.
class _Wall(ArchComponent.Component):
"""The Wall object. Takes a <App::FeaturePython> and turns it into a wall.
Walls are simple objects, usually vertical, typically obtained by giving a
thickness to a base line, then extruding it vertically.
Walls are simple objects, usually vertical, typically obtained by giving a
thickness to a base line, then extruding it vertically.
Parameters
----------
obj: <App::FeaturePython>
The object to turn into a wall. Note that this is not the object that forms
the basis for the new wall's shape. That is given later.
"""
Parameters
----------
obj: <App::FeaturePython>
The object to turn into a wall. Note that this is not the object that forms
the basis for the new wall's shape. That is given later.
"""
def __init__(self, obj):
"""Initialises the object's properties.
Sets the object to have the properties of an Arch component, and Arch wall.
"""
Sets the object to have the properties of an Arch component, and Arch wall.
"""
ArchComponent.Component.__init__(self, obj)
self.setProperties(obj)
@@ -695,13 +690,13 @@ Sets the object to have the properties of an Arch component, and Arch wall.
def setProperties(self, obj):
"""Gives the wall it's wall specific properties, such as it's alignment.
You can learn more about properties here: https://wiki.freecadweb.org/property
You can learn more about properties here: https://wiki.freecadweb.org/property
parameters
----------
obj: <part::featurepython>
The object to turn into a wall.
"""
parameters
----------
obj: <part::featurepython>
The object to turn into a wall.
"""
lp = obj.PropertiesList
if not "Length" in lp:
@@ -1257,29 +1252,25 @@ obj: <part::featurepython>
# Get the 'offseted' wire taking into account
# of Width and Align of each edge, and overall
# Offset
w2 = DraftGeomUtils.offsetWire(
wire,dvec,
bind=False,
occ=False,
widthList=widths,
offsetMode=None,
alignList=aligns,
normal=normal,
basewireOffset=off
)
w2 = DraftGeomUtils.offsetWire(wire, dvec,
bind=False,
occ=False,
widthList=widths,
offsetMode=None,
alignList=aligns,
normal=normal,
basewireOffset=off)
# Get the 'base' wire taking into account of
# width and align of each edge
w1 = DraftGeomUtils.offsetWire(
wire, dvec,
bind=False,
occ=False,
widthList=widths,
offsetMode="BasewireMode",
alignList=aligns,
normal=normal,
basewireOffset=off
)
w1 = DraftGeomUtils.offsetWire(wire, dvec,
bind=False,
occ=False,
widthList=widths,
offsetMode="BasewireMode",
alignList=aligns,
normal=normal,
basewireOffset=off)
sh = DraftGeomUtils.bind(w1,w2)
elif curAligns == "Right":
@@ -1298,20 +1289,23 @@ obj: <part::featurepython>
# dvec2 = DraftVecUtils.scaleTo(dvec,off)
# wire = DraftGeomUtils.offsetWire(wire,dvec2)
w2 = DraftGeomUtils.offsetWire(
wire, dvec,
bind=False,
occ=False,
widthList=widths,
offsetMode=None,
alignList=aligns,
normal=normal,
basewireOffset=off
)
w2 = DraftGeomUtils.offsetWire(wire, dvec,
bind=False,
occ=False,
widthList=widths,
offsetMode=None,
alignList=aligns,
normal=normal,
basewireOffset=off)
w1 = DraftGeomUtils.offsetWire(
basewireOffset=off
)
w1 = DraftGeomUtils.offsetWire(wire, dvec,
bind=False,
occ=False,
widthList=widths,
offsetMode="BasewireMode",
alignList=aligns,
normal=normal,
basewireOffset=off)
sh = DraftGeomUtils.bind(w1,w2)
@@ -1328,24 +1322,24 @@ obj: <part::featurepython>
w2 = DraftGeomUtils.offsetWire(wire,d1)
else:
dvec.multiply(width)
w2 = DraftGeomUtils.offsetWire(
wire, dvec,
bind=False,
occ=False,
widthList=widths,
offsetMode=None,
alignList=aligns,
normal=normal
)
w1 = DraftGeomUtils.offsetWire(
wire, dvec,
bind=False,
occ=False,
widthList=widths,
offsetMode="BasewireMode",
alignList=aligns,
normal=normal
)
w2 = DraftGeomUtils.offsetWire(wire, dvec,
bind=False,
occ=False,
widthList=widths,
offsetMode=None,
alignList=aligns,
normal=normal)
w1 = DraftGeomUtils.offsetWire(wire, dvec,
bind=False,
occ=False,
widthList=widths,
offsetMode="BasewireMode",
alignList=aligns,
normal=normal)
sh = DraftGeomUtils.bind(w1,w2)
del widths[0:edgeNum]