Hüllfläche eines Gebäudes

In diesem Forum Fragen und Diskussionen in Deutsch
Forum rules
Foren-Regeln und hilfreiche Informationen

WICHTIG: Bitte zuerst lesen, bevor Sie posten
Chri1
Posts: 86
Joined: Wed Oct 17, 2018 9:00 am

Re: Hüllfläche eines Gebäudes

Post by Chri1 »

So, wieder in Stückchen weiter:
Ich gebe weitere Propertys dazu - für Boden, die Wände und Deckel:

Code: Select all

    obj.addProperty("App::PropertyInteger","ID_unt")
    obj.addProperty("App::PropertyInteger","ID_W1")
......
Dann wird eine Fläche angeklickt und ein Makro aufgerufen:

Code: Select all

#Geklickte Fläche (oder Ecke):
sel = FreeCAD.Gui.Selection.getSelectionEx()
a = sel[0]
a.SubElementNames  #    Liste   ('Face1',)
gecklickt = a.SubElementNames[0] #    'Face1'

#Alle Flächen 
selobj = FreeCAD.Gui.Selection.getSelection()
b = selobj[0]
b.Shape.Faces ### [<Face object at 0000000010E508A0>, <Face object 

for ding in b.Shape.Faces:
	print ding
Und hier steh ich jetzt an: Wie bekomme ich den Namen vom ding?
(den Namen könnte man mit "gecklickt" vergleichen und der entsprechenden FlächenID einen Wert zuordnen)
Oder geht es einfacher, kann man irgendwie statt des Namens des "geklickt" einen Index bekommen? Dann ginge es ohne Schleife.
Bzw.: Kann man sich darauf verlassen, dass bei "geklickt" immer "Face" und danach eine Ziffer steht und die Ziffer der Reihenfolge von Part.makeShell([f1,f2,f3,f4,f5,f6]) entspricht?


LG
Chri
User avatar
Gift
Posts: 769
Joined: Tue Aug 18, 2015 10:08 am
Location: Germany, Sauerland

Re: Hüllfläche eines Gebäudes

Post by Gift »

Chri1 wrote: Mon Oct 29, 2018 11:34 am Eigenschaften: Ich möchte jeder Fläche eine (Bauteil)-ID zuordnen können.
(Fläche anklicken und eine ID eingeben)
Warum Proxy auf Null: Ehrlich gesagt, ganz pragmatisch: Ich weiß es nicht, weil es in https://yorikvanhavre.gitbooks.io/a-fre ... jects.html so steht und das Prisma erst dadurch angezeigt wird.

LG
Chri
Wieso speicherst du die Eigenschaften(ID) nicht einfach in Feld und erstellst eine 1:1 Beziehung durch den Index. So wird es auch bei den Flächenfarben umgesetzt.

Code: Select all

import FreeCAD as App
import Part

doc = App.ActiveDocument
box = doc.addObject('Part::Box','Box')
doc.recompute()
box.ViewObject.DiffuseColor = [(1.,1.,0.), (0.,1.,1.), (0.,1.,1.), (0.,1.,1.), (0.,1.,1.), (0.,1.,1.)]
Zum Proxy: Den Trick kannte ich noch nicht. Da ich eigentliche immer direkt einen Provider mit anlegen, gab es bei mir noch nicht das Problem.
Chri1 wrote: Mon Oct 29, 2018 6:41 pm So, wieder in Stückchen weiter:
Ich gebe weitere Propertys dazu - für Boden, die Wände und Deckel:

Code: Select all

    obj.addProperty("App::PropertyInteger","ID_unt")
    obj.addProperty("App::PropertyInteger","ID_W1")
......
Dann wird eine Fläche angeklickt und ein Makro aufgerufen:

Code: Select all

#Geklickte Fläche (oder Ecke):
sel = FreeCAD.Gui.Selection.getSelectionEx()
a = sel[0]
a.SubElementNames  #    Liste   ('Face1',)
gecklickt = a.SubElementNames[0] #    'Face1'

#Alle Flächen 
selobj = FreeCAD.Gui.Selection.getSelection()
b = selobj[0]
b.Shape.Faces ### [<Face object at 0000000010E508A0>, <Face object 

for ding in b.Shape.Faces:
	print ding
Und hier steh ich jetzt an: Wie bekomme ich den Namen vom ding?
(den Namen könnte man mit "gecklickt" vergleichen und der entsprechenden FlächenID einen Wert zuordnen)
Oder geht es einfacher, kann man irgendwie statt des Namens des "geklickt" einen Index bekommen? Dann ginge es ohne Schleife.
Bzw.: Kann man sich darauf verlassen, dass bei "geklickt" immer "Face" und danach eine Ziffer steht und die Ziffer der Reihenfolge von Part.makeShell([f1,f2,f3,f4,f5,f6]) entspricht?


LG
Chri
Die Information enthält Shape nicht. Ich hätte gedacht, dass folgender Code Hilfreich sein könnte. Aber ich erhalte laufend neue Instanzen. Damit ist ein Vergleich also nicht möglich. :|

Code: Select all

import FreeCAD, FreeCADGui

sub = FreeCADGui.Selection.getSelectionEx()[0]
FreeCAD.Console.PrintMessage(sub.SubElementNames[0])

sel = FreeCAD.Gui.Selection.getSelection()[0]
for idx, face in enumerate(sel.Shape.Faces):
    if sub.SubObjects[0] == face:
        FreeCAD.Console.PrintMessage('Face' + str(idx))
Chri1
Posts: 86
Joined: Wed Oct 17, 2018 9:00 am

Re: Hüllfläche eines Gebäudes

Post by Chri1 »

Hi
Wieso speicherst du die Eigenschaften(ID) nicht einfach in Feld und erstellst eine 1:1 Beziehung durch den Index.
obj.addProperty("App::PropertyIntegerList","BTID").BTID =[0,0,0,0,0,0]
Komme aber damit nicht ganz klar, Siehe letzte Zeile im Code

Abgesehen davon, so funktioniert es:
(Die angeklickte Fläche erhält - rein willkürlich - 15)

Code: Select all

#Geklickte Fläche (oder Ecke):
sel = FreeCAD.Gui.Selection.getSelectionEx()
a = sel[0]
a.SubElementNames  #('Face1',)
gew = a.SubElementNames[0] #'Face1'
gewindex = int(gew[4:])-1
print "Gewählt:"
print gewindex
FreeCAD.Console.PrintMessage("\n ------ Gewählt:")
FreeCAD.Console.PrintMessage(gewindex)

#Alle Flächen 
selobj = FreeCAD.Gui.Selection.getSelection()
b = selobj[0]
b.Shape.Faces ### [<Face object at 0000000010E508A0>, <Face object 

for ding in b.Shape.Faces:
	print ding

for counter, ding in enumerate(b.Shape.Faces):
	FreeCAD.Console.PrintMessage("\n")
	FreeCAD.Console.PrintMessage(counter)
        if (counter == gewindex):
           treffer = counter
           FreeCAD.Console.PrintMessage ("    Treffer: ")
           FreeCAD.Console.PrintMessage (treffer)

Liste = ["ID_0", "ID_1", "ID_2", "ID_3", "ID_4", "ID_5"]
FreeCAD.Console.PrintMessage(Liste[counter])
setattr(b,Liste[treffer],15)

b.BTID[treffer] = 15   # So funktioniert es nicht. Aber Wie?
Werde mich nun allmählich dem eigentlichen Tittel des Beitrages "Hüllfläche eines Gebäudes" zuwenden.
Plan habe ich noch keinen, außer einem vagen:
Alle Prismen vereinen (Union), dann der Reihe nach alle Flächen des Hüllkörpers abfragen, welche Fläche von welchem Quader sie berühren und deren BT_ID übernehmen.
Sinnvoll darüber nachzudenken?


LG
Chri
User avatar
Gift
Posts: 769
Joined: Tue Aug 18, 2015 10:08 am
Location: Germany, Sauerland

Re: Hüllfläche eines Gebäudes

Post by Gift »

Es gibt eine Methode isSame. Damit solltest du dein Problem lösen können:

Code: Select all

import FreeCAD, FreeCADGui

sub = FreeCADGui.Selection.getSelectionEx()[0]
FreeCAD.Console.PrintMessage(sub.SubElementNames[0] + "\n")

sel    = FreeCAD.Gui.Selection.getSelection()[0]
subobj = sub.SubObjects[0]
for idx, face in enumerate(sel.Shape.Faces):
    if  subobj.isSame(face):
        FreeCAD.Console.PrintMessage('Face' + str(idx+1) +"\n")
User avatar
Gift
Posts: 769
Joined: Tue Aug 18, 2015 10:08 am
Location: Germany, Sauerland

Re: Hüllfläche eines Gebäudes

Post by Gift »

Code: Select all

# ungetestet
treffer = -1
subobj = a..SubObjects[0]
for counter, ding in enumerate(b.Shape.Faces):
	if subobj.isSame(ding):
            treffer = counter

Code: Select all

# ungetestet 
tmp = b.BTID
tmp[treffer] = ..
b.BTID = tmp
Chri1
Posts: 86
Joined: Wed Oct 17, 2018 9:00 am

Re: Hüllfläche eines Gebäudes

Post by Chri1 »

Danke, schaut viel besser aus.
#ungetestet: funktionieren alle
( Beim 1. mit subobj = a.SubObjects[0] statt subobj = a..SubObjects[0] )

LG
Chri
Chri1
Posts: 86
Joined: Wed Oct 17, 2018 9:00 am

Re: Hüllfläche eines Gebäudes

Post by Chri1 »

Hi
So, jetzt steh ich an: Ich möchte die Außenhülle von zusammengefassten Körpern.

Wenn ich 2 Part.box fusioniere und sel diese Fusion ist, liefert sel.shapes.Area alle Flächen, die die Außenhülle bilden. Mit einer Schleife sind diese Flächen erreichbar. Soweit ok, aber doch eine Frage:
Falls eine Fläche durch Teilung entstanden ist (Wegen Berührung/Überlappung der Grundkörper): Gibt es eine Info wer die die ursprüngliche Fläche war?
wer.JPG
wer.JPG (15.7 KiB) Viewed 433 times
Nun musste ich feststellen, dass sich meine eigenen Prismen (class Prisma) mit bool nicht vereinigen lassen, sondern nur mit "Vereinigt mehrere Formen"
Es werden zwar ebenfalls die Flächen geteilt, sel.shapes.Area liefert jedoch alle Flächen, auch die innenliegenden. Wenn man nun mit einer Schleife über sel.shapes.Area fährt: Wie kann man die innenliegenden identifizieren?

LG
Chri
User avatar
microelly2
Veteran
Posts: 4688
Joined: Tue Nov 12, 2013 4:06 pm
Contact:

Re: Hüllfläche eines Gebäudes

Post by microelly2 »

Chri1 wrote: Mon Nov 05, 2018 5:04 pm Nun musste ich feststellen, dass sich meine eigenen Prismen (class Prisma) mit bool nicht vereinigen lassen, sondern nur mit "Vereinigt mehrere Formen"
Wieso geht das nicht?
sind deine Prismen keine Solids?
User avatar
bernd
Veteran
Posts: 12851
Joined: Sun Sep 08, 2013 8:07 pm
Location: Zürich, Switzerland
Contact:

Re: Hüllfläche eines Gebäudes

Post by bernd »

das mit dem von wem stamme ich hab ist da problem, was in FreeCAD master nicht gelöst ist. Das weiss die fläche einfach nicht. Es gibt einige entwicklertestversionen die können das schin. Einige hier in dt forum arbeiten auch mit den versionen schon. Das problem hatte ich im zweiten topic post schon erwähnt und heisst topological naming.
Haben wir in FEM auch, nach verändern der geometrie, ist die last auf einer andern fläche ...
Chri1
Posts: 86
Joined: Wed Oct 17, 2018 9:00 am

Re: Hüllfläche eines Gebäudes

Post by Chri1 »

Hi
sind deine Prismen keine Solids?
Erzeugt hab ich ihn so:

Code: Select all

myObj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Prisma")
Prisma(myObj)
myObj.ViewObject.Proxy = 0
FreeCAD.ActiveDocument.recompute()
Wobei die Klasse:

Code: Select all

class Prisma:

  def __init__(self,obj):
    obj.Proxy = self
    obj.addProperty("App::PropertyFloat","Length").Length = 1000
    obj.addProperty("App::PropertyFloat","Width").Width = 1000
    obj.addProperty("App::PropertyFloat","Height").Height = 1000
    obj.addProperty("App::PropertyIntegerList","BTID").BTID =[0,0,0,0,0,0]

  def execute(self,obj):

# Eckpunkte
    e1 = FreeCAD.Vector(0,0,0)
    e2 = FreeCAD.Vector(obj.Length,0,0)
...
# Flächen
    f= Part.makePolygon([e1,e2,e3,e4,e1])
    f1 = Part.Face(f)
....
    shell = Part.makeShell([f1,f2,f3,f4,f5,f6])
    solid = Part.makeSolid(shell)
    obj.Shape = shell
Als Typ erhalte ich: <type 'FeaturePython'>

Jetzt habe ich noch probiert:
myObj = FreeCAD.ActiveDocument.addObject("Part::Box","Prisma") -> ergibt: <type 'PrimitivePy'>
Diese Objekte können bool, allerdings geht mein Attribut "BTID" verloren
Kann man da was machen? - Also so, dass bool möglich ist und das Attribut überlebt?

LG
Chri
Post Reply