Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Rund um AutoCAD
  3D-Flächen zu 3D-Solids

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  3D-Flächen zu 3D-Solids (447 mal gelesen)
Proxy
Ehrenmitglied
Stateless-DHCP v6-Paketfragmentierer


Sehen Sie sich das Profil von Proxy an!   Senden Sie eine Private Message an Proxy  Schreiben Sie einen Gästebucheintrag für Proxy

Beiträge: 1629
Registriert: 13.11.2003

Tastaturen, Mäuse,
Pladden, Monitore, ...

erstellt am: 11. Apr. 2004 02:24    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Kennt einer von euch eine Möglichkeit sehr komplexe jedoch in sich "geschlossenen" Körper bestehend aus Flächen in ein oder mehrere Solids zukonvertieren. Habe da ein so ein Gedankengang, dass alle Eckpunkte der sichtbaren Flächen ebenfalls die Eckpunkte der Zielsolids sein sollten. Oder ist es mittels Lisp/VBA überhaupt möglich ? Hab da etwas rumgecodet jedoch ist es am Auslesen der Eckpunkte der Flächen gescheitert.
Mathematisch müsste die Aufgabe gehen da es in reinem AutoCAD keine gekrümten Oberflächen existieren und sich somit weinigstens als Polyliniendreiecke um ein einzugebenden Wert entlang dem Normalenvektor der Ebene extrudieren lassen müsste. Diese so entstandene Umnege von Solids müsste sich nun am Ende von einem alles umschliessenden Hauptsolid verrechnen lassen um den Hohlkörper zuerzeugen. Dieser addiert mit dem Ursprungssolid entstanden aus den extrudierten Flächen müsste eigentlich einen perfekten Volumenkörper nachbilden.

Die Bildung von "herrausstehenden" Flächen ist ein etwas komplexeres Thema, jedoch sind die Daten die ich verrechne meistens in sich vollständig geschlossen, d.h. es gibt keine Lücke innerhalb der Flächen.

------------------
"Lisp?!?! Why the Hell did you pick the most arcane, obscure, and hopelessly-rooted-in-the-computer-science-department language in the world for an AutoCAD programming language?"  Read the whole story: The Autodesk File ca. 890 Seiten | 7500 KB PDF

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

scj
Mitglied
 


Sehen Sie sich das Profil von scj an!   Senden Sie eine Private Message an scj  Schreiben Sie einen Gästebucheintrag für scj

Beiträge: 554
Registriert: 09.08.2001

erstellt am: 14. Apr. 2004 10:45    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Proxy 10 Unities + Antwort hilfreich

Idee zur Rekonstruktion von Gesamtkörpern, die von einer Menge von 3D-faces im Raum begrenzt werden:

Erzeugung von Projektionskörpern
1. in Richtung z=0 (Projektionskörper von oben gesehen unter dem Netz)
2. in Richtung y=0 (Projektionskörper "von rechts"  zur Ebene y=0
3. in Richtung x=0 (PProjektionskörper "nach hinten" zur Ebene x=0

Weitere Projektionen aus anderen Ansichten sind möglich.
Diese Projektionskörper werden mit  dem Befehl "_interfere" miteinander
verschnitten.

Aus dem Vorgehen ist ersichtlich :
Der Körper liegt im ersten Oktanten; sie müssen nicht konvex sein.
Hinterschneidungen, d.h. Kanten, die in keiner Ansicht vollständig
sichtbar sind, können nicht berücksichtigt werden - sie werden von den Projektionskörpern jeweils "aufgeschluckt" (z.B. innere Blasen).

Bögen uns Splines gehen nicht, da die entstehenden Teilkörper
an Ebenen verschnitten werden.
Hier hilft aber unter Umständen ein 3DSOUT und anschließendes 3DSIN, da 3D-StudioMax Triangulationsflächen erzeugt.
Problematisch sind manchmal die in AutoCAD eigebauten Boole'schen
Operationen, da Vereinigungen und Differenzen von SOLIDS mit
Koplanaritäten oder nur geringen Abständen der Punkte schief gehen
können.

Beste Grüße aus der Rhön
Jochen www.black-cad.de

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Angelika Hädrich
Ehrenmitglied V.I.P. h.c.
Application Engineer



Sehen Sie sich das Profil von Angelika Hädrich an!   Senden Sie eine Private Message an Angelika Hädrich  Schreiben Sie einen Gästebucheintrag für Angelika Hädrich

Beiträge: 5123
Registriert: 12.07.2000

Der erreicht am meisten, der immer auch anders kann, als er vorhatte.

erstellt am: 14. Apr. 2004 11:37    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Proxy 10 Unities + Antwort hilfreich

Hi Proxi,

der Mechanical Desktop kann das, wenn die Flächenmodelle wasserdicht sind.

Gruss Angelika

------------------
Lieber Fehler riskieren als Initiative verhindern.
(Reinhard Mohn)

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Proxy
Ehrenmitglied
Stateless-DHCP v6-Paketfragmentierer


Sehen Sie sich das Profil von Proxy an!   Senden Sie eine Private Message an Proxy  Schreiben Sie einen Gästebucheintrag für Proxy

Beiträge: 1629
Registriert: 13.11.2003

Tastaturen, Mäuse,
Pladden, Monitore, ...

erstellt am: 20. Apr. 2004 20:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

hab da zwei sehr gute Lösungen gefunden:

Code:

;;    M2S  (Mesh-to-Solid)
;;    Creates an ACIS solid from an open 3d polygon mesh.
;;
;;    (c) Copyright 1998 Bill Gilliss. 
;;        All rights reserved... such as they are.
;;
;;    bill.gilliss@aya.yale.edu    gilliss@iglou.com
;;
;;      I wrote this to create sculptable ACIS terrain models
;;    for architectural site renderings. It could also be used
;;    to create thin shells from meshes, by subtracting a moved
;;    copy of the solid from the original solid. Let me know of
;;    other uses you find for it, or problems you encounter.
;;
;;      This program works by constructing a pair of triangular
;;    polylines on a flat plane directly beneath the vertices of
;;    each "square" in a MxN polygon mesh. It then extrudes each
;;    polyline into an ACIS solid as high as the highest corres-
;;    ponding vertex on the mesh, and slices off the top with a
;;    plane defined by the three points on the mesh. The result-
;;    ing solids are then unioned into a complete solid.
;;
;;      The solid will match the displayed mesh: if the mesh has
;;    been smoothed and SPLFRAME is set to 0, the solid will be
;;    smoothed. Otherwise, it will not be. The mesh itself is not
;;    changed at all.
;;
;;      Expect the unexpected if using a UCS radically different
;;    from the WCS.
;;
;;    Programmer's note:  The most efficient method of unioning
;;    I found was to union each row of Nx2 triangular seg-
;;    ments, then to union all the M rows. It took 1-1/2 times
;;    as long to union all the triangular segments at once, and
;;    over 2-1/2 times as long to union each segment to the pre-
;;    vious mass of unioned segments as soon as each segment was
;;    created. Suggestions welcomed.

(defun C:m2s (/ ent ename entlst M N MN SN SM ST smooth oldecho vtx d1
      low vtxcnt vtxmax bot bottom p1 p2 p3 p4 c1 c2 c3 c4 b1 b2
      b3 b4 r1 r2 r3 s1 s2 s3
    )

  ;;select the mesh
  (setq ent (entsel "Select a polygon mesh to solidify: "))
  (setq ename (car ent))
  (setq entlst (entget ename))

  (if (not (= (cdr (assoc 0 entlst)) "POLYLINE"))
    (progn
      (alert "That is not a polygon mesh.")
      (exit)
      (princ)
    )
  ) ;endif

  (if
    (not
      (or
(= (cdr (assoc 70 entlst)) 16) ;open 3d polygon mesh
(= (cdr (assoc 70 entlst)) 20) ;open 3d polygon mesh with spline-fit vertices
      ) ;or
    ) ;not
    (progn
      (alert "That is not an *open* polygon mesh.")
      (exit)
      (princ)
    ) ;progn
  ) ;endif

  ;; decide whether to use smoothed or unsmoothed vertices
  (setq M (cdr (assoc 71 entlst))) ;M vertices
  (setq N (cdr (assoc 72 entlst))) ;N vertices
  (setq SM (cdr (assoc 73 entlst))) ;smoothed M vertices
  (setq SN (cdr (assoc 74 entlst))) ;smoothed N vertices
  (setq ST (cdr (assoc 75 entlst))) ;surface type
  (if
    (or
      (= (getvar "splframe") 1) ;use MxN vertices when splframe = 1
      (= ST 0) ;or mesh has not been smoothed
    )
    (progn
      (setq smooth 0
    MN (* M N)
      )
    ) ;progn
    (progn
      (setq smooth 1) ;use SMxSN vertices when mesh is smoothed and SPLFRAME = 0
      (setq MN (* SM SN)
    M SM
    N SN
      )
    ) ;progn
  ) ;if
  (setq oldecho (getvar "cmdecho"))
  (setvar "cmdecho" 0)

  ;; determine lowest vertex
  (grtext -2 "Checking out the mesh...")
  (setq vtx ename)
  (setq vtx (entnext vtx))
  (setq d1 (entget vtx))
  (setq bottom (caddr (trans (cdr (assoc 10 d1)) 0 1)))
;translate to current UCS

  (repeat (1- MN) ;compare with each vertex's z coord
    (setq vtx (entnext vtx))
    (setq d1 (entget vtx))
    (setq low (caddr (trans (cdr (assoc 10 d1)) 0 1)))
    (setq bottom (min bottom low))
  ) ;repeat

  (setq bot (1+ bottom))
  (while (> bot bottom)
    (princ (strcat "\nLowest vertex is at elevation "
  (rtos bottom)
  " Enter elevation for bottom"
  )
    )
    (setq bot
  (getreal
    "\nof solid, which must be at or BELOW the lowest vertex: "
  )
    )
  )

  ;;Draw 2 triangular polylines for each mesh square
  (setq p1 ename)
  (if (= smooth 1)
    (setq p1 (entnext p1))
  ) ;skip first vertex of smoothed mesh - not true vertex
  (setq vtxcnt 1)
  (setq vtxmax (- MN N))
  (setq ssrow (ssadd)) ;create set of segments to be unioned at end of row
  (setq ssall (ssadd)) ;create set of rows to be unioned at end of program

  (grtext -2 "Creating first row...")
  (while (< vtxcnt vtxmax)

    (if (= 0 (rem vtxcnt N)) ;at end of each row...
      (progn
(grtext -2 "Unioning row...")
(command "union" ssrow "") ;union row
(setq row (entlast))
(ssadd row ssall) ;add unioned row to set of rows
(setq ssrow (ssadd)) ;reinitialize selection set of pieces
(setq p1 (entnext p1)) ;go to the next vertex
(setq vtxcnt (1+ vtxcnt))
(grtext -2 "Creating row...")
      ) ;progn
    ) ;if


    (setq p1 (entnext p1) ;first vertex of mesh square
  p2 (entnext p1) ;second vertex
  p3 p2
    )
    (repeat (1- n) ;walk along to 3rd (p+N) vertex
      (setq p3 (entnext p3))
    )
    (setq p4 (entnext p3)) ;4th vertex of mesh square

    (setq c1 (trans (cdr (assoc 10 (entget p1))) 0 1) ;top coordinates
  c2 (trans (cdr (assoc 10 (entget p2))) 0 1)
  c3 (trans (cdr (assoc 10 (entget p3))) 0 1)
  c4 (trans (cdr (assoc 10 (entget p4))) 0 1)
  b1 (list (car c1) (cadr c1) bot) ;bottom coordinates
  b2 (list (car c2) (cadr c2) bot)
  b3 (list (car c3) (cadr c3) bot)
  b4 (list (car c4) (cadr c4) bot)
    )
    (LOFT c1 c2 c3 b1 b2 b3) ;loft first triangle
    (LOFT c2 c3 c4 b2 b3 b4) ;loft second triangle

    (setq vtxcnt (1+ vtxcnt))
  ) ;while

  (grtext -2 "Unioning last row...")
  (command "union" ssrow "") ;union last row
  (setq row (entlast))
  (ssadd row ssall) ;add unioned row to set of rows
  (grtext -2 "Unioning all rows...")
  (command "union" ssall "") ;union everything

  (setvar "cmdecho" oldecho) ;cleanup
  (setq ssrow nil
ssall nil
  )

  (princ)

) ;defun

;;============== SUBROUTINES ====================
(defun *error* (msg)
  (if (/= msg "Function cancelled")
    (if (= msg "quit / exit abort")
      (princ)
      (progn  ;clean up variables so they don't go global
(princ (strcat "\nError: " msg))
(setq ent nil
      ename nil
      entlst nil
      M nil
      N nil
      MN nil
      SN nil
      SM nil
      ST nil
      smooth nil
      oldecho nil
      vtx nil
      d1 nil
      low nil
      vtxcnt nil
      vtxmax nil
      bot nil
      bottom nil
      p1 nil
      p2 nil
      p3 nil
      p4 nil
      c1 nil
      c2 nil
      c3 nil
      c4 nil
      b1 nil
      b2 nil
      b3 nil
      b4 nil
      r1 nil
      r2 nil
      r3 nil
      s1 nil
      s2 nil
      s3 nil
      e1 nil
      extr nil
      highest nil
      ssrow nil
      ssall nil
)
      )
    )
    (princ)
  )
) ;defun

(defun LOFT (r1 r2 r3 s1 s2 s3 / e1 extr highest)
  (command "pline" s1 s2 s3 "c")
  (setq highest (max (caddr r1) (caddr r2) (caddr r3)))
  (setq extr (- highest bot))
  (command "extrude" "L" "" extr "")
  (command "slice" "L" "" "3" r1 r2 r3 s1)
  (setq e1 (entlast))
  (ssadd e1 ssrow)
)


-------------------------------------------------------------------

Code:

; 3DFA2SOL.LSP
;              Theo L.A. Groenenberg
;              Leusden NL
;              acadvice@worldonline.nl
;              http://www.dra.nl/~acadvice
;
;              Converts 3Dfaces to solids.
;
;              I'm an architect in Long Island, New York.
;              I'm looking for a routine that automatically
;              fills an area with a solid, similar to the bhatch command.
;              There are commercial applications that do this such as m-color
;              but I do not want to spend $300 dollars.
;              I you know of any such routines that are more reasonable priced,
;              please let me know. Thank you.
;
;              George Pardo
;
;              Hi George, here's something you can work with.
;              Create REGIONs of all your areas using the BPOLY or
;              REGION commands.
;              Edit them if neccesary with UNION, SUBTRACT, etc.
;              Use the 3DSOUT command and select your REGIONs.
;              Erase the previous REGIONs.
;              Use the 3DSIN command and select add, meshes.
;              EXPLODE the MESHes. Now you are left with 3DFACEs.
;              Now use this routine.
;
;              Sounds complicated, but saves you $300.
;
;              Good luck & regards Theo.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun 3dfa2sol (/ aantal n naam face hoogte solist)
  (command "_undo" "_m")
  (prompt (strcat "\n" (itoa (sslength faceset)) " 3DFACEs found.\n"))
  (setq aantal (sslength faceset)
        n 0
  )
  (prompt "\nConverting 3DFACEs to SOLIDs.....")
  (repeat aantal
          (setq naam (ssname faceset n)
                n (+ n 1)
                face (entget naam)
                hoogte (/ (+ (caddr (cdr (assoc 10 face)))
                              (caddr (cdr (assoc 11 face)))
                              (caddr (cdr (assoc 12 face)))
                              (caddr (cdr (assoc 13 face)))
                          ) 4
                        )
          )
          (entdel naam)
          (setq solist (list (cons 0 "SOLID")
                              (assoc 8 face)
                              (cons 10 (list (car (cdr (assoc 10 face)))
                                            (cadr (cdr (assoc 10 face)))
                                            hoogte
                                      )
                              )
                              (cons 11 (list (car (cdr (assoc 11 face)))
                                            (cadr (cdr (assoc 11 face)))
                                            hoogte
                                      )
                              )
                              (cons 12 (list (car (cdr (assoc 13 face)))
                                            (cadr (cdr (assoc 13 face)))
                                            hoogte
                                      )
                              )
                              (cons 13 (list (car (cdr (assoc 12 face)))
                                            (cadr (cdr (assoc 12 face)))
                                            hoogte
                                      )
                              )
                              (cons 39 (* -1 hoogte))
                        )
          )
          (entmake solist)
  )
  (redraw)
  (alert "The command UNDO with the option BACK\n\nwill undo everything to the start of 3DFA2SOL.")
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:3dfa2sol (/ faceset)
  (setvar "cmdecho" 0)
  (setvar "splframe" 1)
  (prompt "\nSelect 3DFACEs.")
  (setq faceset (ssget '((0 . "3DFACE"))))
  (if faceset
      (3dfa2sol)
      (alert "No 3DFACEs found.")
  )
  (prompt "\nRegards Theo.")
  (princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

------------------
"Lisp?!?! Why the Hell did you pick the most arcane, obscure, and hopelessly-rooted-in-the-computer-science-department language in the world for an AutoCAD programming language?"  Read the whole story: The Autodesk File ca. 890 Seiten | 7500 KB PDF

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz