Merge branch 'FreeCAD:master' into FixDefaultShapeVertexColor

This commit is contained in:
Benjamin Alterauge
2021-08-03 16:50:09 +02:00
committed by GitHub
4 changed files with 21 additions and 10 deletions

View File

@@ -431,9 +431,7 @@ class BuildingPart(ArchIFC.IfcProduct):
area = 0
if hasattr(obj,"Group"):
for child in obj.Group:
if hasattr(child,"Area") and hasattr(child,"IfcType"):
# only add arch objects that have an Area property
# TODO only spaces? ATM only spaces and windows have an Area property
if (Draft.get_type(child) in ["Space","BuildingPart"]) and hasattr(child,"IfcType"):
area += child.Area.Value
return area
@@ -443,8 +441,9 @@ class BuildingPart(ArchIFC.IfcProduct):
shapes = []
for child in Draft.get_group_contents(obj):
if hasattr(child,'Shape'):
shapes.extend(child.Shape.Faces)
if not Draft.get_type(child) in ["Space"]:
if hasattr(child,'Shape'):
shapes.extend(child.Shape.Faces)
return shapes
def getSpaces(self,obj):

View File

@@ -57,7 +57,7 @@ __title__ = "FreeCAD Wall"
__author__ = "Yorik van Havre"
__url__ = "https://www.freecadweb.org"
def makeWall(baseobj=None,height=None,length=None,width=None,align="Center",face=None,name=None):
def makeWall(baseobj=None,height=None,length=None,width=None,align=None,face=None,name=None):
"""Create a wall based on a given object, and returns the generated wall.
TODO: It is unclear what defines which units this function uses.
@@ -128,7 +128,10 @@ def makeWall(baseobj=None,height=None,length=None,width=None,align="Center",face
obj.Height = height
else:
obj.Height = p.GetFloat("WallHeight",3000)
obj.Align = align
if align:
obj.Align = align
else:
obj.Align = ["Center","Left","Right"][p.GetInt("WallAlignment",0)]
if obj.Base and FreeCAD.GuiUp:
if Draft.getType(obj.Base) != "Space":
obj.Base.ViewObject.hide()

View File

@@ -101,6 +101,10 @@ class Stretch(gui_base_original.Modifier):
if base:
if utils.getType(base) in supported:
self.sel.append([base, obj.Placement.multiply(obj.Base.Placement)])
elif hasattr(obj.Base, "Base"):
if obj.Base.Base:
if utils.getType(obj.Base.Base) in supported:
self.sel.append([obj.Base.Base, obj.Placement.multiply(obj.Base.Placement)])
elif utils.getType(obj) in ["Offset2D", "Array"]:
base = None
if hasattr(obj, "Source") and obj.Source:

View File

@@ -980,12 +980,16 @@ std::pair<Base::Vector3d, Base::Vector3d> CenterLine::calcEndPoints(DrawViewPart
bool CenterLine::Circulation(Base::Vector3d A, Base::Vector3d B, Base::Vector3d C)
{
// the determinant of this matrix calculates the area of a triangle, see
// https://en.wikipedia.org/wiki/Triangle#Using_coordinates
// a 3x3 matrix would also do the job, but FC supports only 4x4 matrixes
Base::Matrix4D CircMatrix(
A.x, A.y, 1, 0,
B.x, B.y, 1, 0,
C.x, C.y, 1, 0,
0, 0, 0, 1);
// the sign delivers the dicrection of travel along the triangle edges
if (CircMatrix.determinant() > 0)
return true;
else
@@ -1034,8 +1038,10 @@ std::pair<Base::Vector3d, Base::Vector3d> CenterLine::calcEndPoints2Lines(DrawVi
Base::Vector3d l2p2 = edges.back()->getEndPoint();
// The centerline is drawn using the midpoints of the two lines that connect l1p1-l2p1 and l1p2-l2p2.
// However, we don't know which point should be l1p1 to get a geometrically correct result.
// Thus we test this by a circulation test.
// However, we don't know which point should be l1p1 to get a geometrically correct result, see
// https://wiki.freecadweb.org/File:TD-CenterLineFlip.png for an illustration of the problem.
// Thus we test this by a circulation test, see this post for a brief explanation:
// https://forum.freecadweb.org/viewtopic.php?p=505733#p505615
if (Circulation(l1p1, l1p2, l2p1) != Circulation(l1p2, l2p2, l2p1)) {
Base::Vector3d temp; // reverse line 1
temp = l1p1;
@@ -1681,4 +1687,3 @@ bool CosmeticVertex::restoreCosmetic(void)
return result;
}