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
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 »

Du musst dein eigenes FusionFeature basteln. Das darf nur Features verschmelzt, die auf dein Prisma basieren. Die Methode execute muss dann auch das neue BTID berechnen. Wenn du dich auf Fusion und Prismen beschränkst, könntest du versuchen den Mittelunkt von der BoundBox als Vergleich zunehmen. Das TN-Problem bleibt aber weiterhin bestehen, wenn zwei Flächen zu einer verschmelzen. Von welcher Fläche soll dann die BTID kommen?

Ein Beispiel mit Farben:

Code: Select all

import FreeCAD as App
import Part

doc = App.newDocument('BoxTest')
box = []

b = doc.addObject('Part::Box','Box')
box.append(b)
doc.recompute()
box[0].ViewObject.DiffuseColor = [(0.9,1.,0.), (0.8,1.,0.), (0.7,1.,0.), (0.6,1.,0.), (0.5,1.,0.), (0.4,1.,0.)]
b = doc.addObject('Part::Box','Box')
box.append(b)
doc.recompute()
box[1].Placement = App.Placement(App.Vector(5,5,5),App.Rotation(App.Vector(0,0,1),0))
box[1].ViewObject.DiffuseColor = [(0.9,0.,1.), (0.8,0.,1.), (0.7,0.,1.), (0.6,0.,1.), (0.5,0.,1.), (0.4,0.,1.)]

box[0].ViewObject.Visibility = False
box[1].ViewObject.Visibility = False
fusion = doc.addObject('Part::Fuse','Fusion')
fusion.Base = box[0]
fusion.Tool = box[1]
doc.recompute()

for id1, face1 in enumerate(fusion.Shape.Faces):
    for b in box:
        for id2, face2 in enumerate(b.Shape.Faces):
            if face1.BoundBox.Center == face2.BoundBox.Center:
                print  str(fusion.ViewObject.DiffuseColor[id1]) + ' <=> ' + str(b.ViewObject.DiffuseColor[id2])
edit: Hmm, mir fallen noch mehr Szenarien ein wo der Trick mit der BoundBox nicht aufgeht. :?
Chri1
Posts: 86
Joined: Wed Oct 17, 2018 9:00 am

Re: Hüllfläche eines Gebäudes

Post by Chri1 »

Hi
Zur Hüllfläche:
Draft.makeFacbinder liefert genau das, was ich will. (Glaub ich zumindest momentan)
makeFacebinder verlangt als Eingabe eine Selection - damit kämpfe ich noch:
Wenn z.B ein Fusion ausgewählt ist (egal ob bool oder nicht-bool):

Code: Select all

selobj = FreeCAD.Gui.Selection.getSelection()
b = selobj[0]
Gui.Selection.clearSelection()
faceSelect = "Face3" 
Gui.Selection.addSelection(b,faceSelect) 
s = Gui.Selection.getSelectionEx()
Draft.makeFacebinder(s) 
Dieser Code liefert nur eine Fläche
Und Versuche wie:

Code: Select all

for ding in b.Shape.Faces:
      Gui.Selection.addSelection(ding,faceSelect)
ergeben Fehlermeldungen.

Wenn das dann geknackt ist, kommt das TN-Problem:
Glaube, dass es so lösbar wäre: Schleife über alle Facebinder-Flächen und darin Schleife über alle PrismenFlächen: intersection() -wenn es eine Fläche > 0 ergibt, hat man die richtige ID.
OK, irgendwie so wird das schon zu knacken sein, kommt mir jedoch trotzdem seltsam vor: Wenn ich es richtig verstanden habe, ist in OpenCascad das Problem gelöst. Sozusagen auf tieferer Ebene. Diese Python-Versuche sind ja eigentlich blos Krückenlösungen.
Weiß man ca., wenn die neue FreeCAD -Version rauskommt und ob das dann nicht ohnehin gelöst ist?

Ich danke Euch jedenfalls für eure Unterstützung

LG
Chri
freecad-heini-1
Veteran
Posts: 7791
Joined: Tue Jan 07, 2014 11:10 am
Contact:

Re: Hüllfläche eines Gebäudes

Post by freecad-heini-1 »

Chri1 wrote: Mon Nov 12, 2018 11:11 am Hi
Zur Hüllfläche:
Draft.makeFacbinder liefert genau das, was ich will. (Glaub ich zumindest momentan)
makeFacebinder verlangt als Eingabe eine Selection - damit kämpfe ich noch:
Wenn z.B ein Fusion ausgewählt ist (egal ob bool oder nicht-bool):

Code: Select all

selobj = FreeCAD.Gui.Selection.getSelection()
b = selobj[0]
Gui.Selection.clearSelection()
faceSelect = "Face3" 
Gui.Selection.addSelection(b,faceSelect) 
s = Gui.Selection.getSelectionEx()
Draft.makeFacebinder(s) 
Dieser Code liefert nur eine Fläche
Und Versuche wie:

Code: Select all

for ding in b.Shape.Faces:
      Gui.Selection.addSelection(ding,faceSelect)
ergeben Fehlermeldungen.

Wenn das dann geknackt ist, kommt das TN-Problem:
Glaube, dass es so lösbar wäre: Schleife über alle Facebinder-Flächen und darin Schleife über alle PrismenFlächen: intersection() -wenn es eine Fläche > 0 ergibt, hat man die richtige ID.
OK, irgendwie so wird das schon zu knacken sein, kommt mir jedoch trotzdem seltsam vor: Wenn ich es richtig verstanden habe, ist in OpenCascad das Problem gelöst. Sozusagen auf tieferer Ebene. Diese Python-Versuche sind ja eigentlich blos Krückenlösungen.
Weiß man ca., wenn die neue FreeCAD -Version rauskommt und ob das dann nicht ohnehin gelöst ist?

Ich danke Euch jedenfalls für eure Unterstützung

LG
Chri
Kennst Du aus der Lattice2 Workbench das Tool Sublink?
Damit kopiere ich Flächen, aber auch Kanten und Punkte.
Chri1
Posts: 86
Joined: Wed Oct 17, 2018 9:00 am

Re: Hüllfläche eines Gebäudes

Post by Chri1 »

Hi
freecad-heini-1 wrote: Mon Nov 12, 2018 12:00 pm Kennst Du aus der Lattice2 Workbench das Tool Sublink?
Damit kopiere ich Flächen, aber auch Kanten und Punkte.
Kannte ich nicht, hab mirs angeschaut, weiß aber momentan nicht, wie es mir weiter hilft.

Habe nun das "Entkernen" gelöst:
Ausgehend von einem vorhandenen Nicht-bool-Fusion-Objekt (Fusion zerteilt in die erforderlichen Teilflächen):
  • Ich erzeuge eine Liste aller Flächen, die das Fusion Objekt hat.
  • Ich erzeuge für alle im Fusion zusammengefassten Objekte Part-Objekte, die um eine Spur kleiner sind (Damit sie die Hüllfläche nicht berühren)
  • Und nun schaue ich, ob es gemeinsame Flächen gibt: Wenn ja, ist es eine Innenfläche und wird entfernt
    (Damit ich "common" verwenden kann, habe ich aus "meinen" Prismen Part-Solids erzeugt)

Code: Select all

def saeubern(sol):   #sol ist ein Teilkörper des Fusion
   i = 0
   while i < len(f):  
      gem = sol.common(f[i]).Area   #In f sind alle Flächen
      if (gem != 0):
         del f[i]
         print "Weg damit"
      else:
         i += 1
#-----------------------
b = FreeCAD.Gui.Selection.getSelection()[0] #        FusionOBJEKT MUSS GEWÄHLT SEIN
f = b.Shape.Faces    

for TK in b.OutList:           # Schleife über alle Teilkörper:
   sol = Part.makeSolid(TK.Shape).makeOffsetShape(-0.01,0)
   #Part.show(sol)
   saeubern(sol)

Gui.Selection.clearSelection()
for ding in f:
   Part.show(ding)
Das Ganze scheint soweit zu funktionieren, ist aber wahrscheinlich recht umständlich gemacht. ?

Werde mich nun dem TP-Problem widmen (So ungefähr nach der selben Methode wie zuvor: Jede Fläche der Hülle berührt eine Fläche der Fusion-Teilkörper, dadurch bekomme ich die ID)

Wenn das funkt, was ich dann mit der ID mache, weiß ich noch nicht ganz:
Vielleicht versuchen, eigene Flächenklasse zu machen, die eine ID-Property hat, und die vorhandenen Hüllflächen in diese Klasse umwandeln und die ID übertragen.



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

Re: Hüllfläche eines Gebäudes

Post by Chri1 »

So, hier die Lösung für das TP-Problem: Die einzelnenHüllflächen erkennen, von wem sie abstammen:

Code: Select all

def touch(fk0, i):
   print i
   j = 0
   for hfi in f:
     print hfi,
     pp = hfi.makeOffset2D(-0.01).Vertexes[0].Point
     if fk0.isInside(pp,0,True):
         print "ID",  #Treffer. Hier kommt dann irgend eine Aktion
     print ""
#-----------------------

for TK in b.OutList:
   i = 0
   while i < len(TK.Shape.Faces):  
      touch(TK.Shape.Faces[i],i)
      i += 1
Wie bei Mehrfachtreffern umgangen werden soll (Siehe Bild - Überschneidende Basiskörper), verschiebe ich auf später.

LG
Chri
Attachments
Unbenannt.JPG
Unbenannt.JPG (4.92 KiB) Viewed 401 times
Post Reply