FastFiber

punten van polyline opvragen en opslaan.

Gestart door Wilfred, wo 18 01 2006, 13:49:21

Vorige topic - Volgende topic

Wilfred

Ik ben bezig om een lisp te schrijven waar ik wanden mee kan teken. Dit doe ik m.b.v. een polyline.
Nu wil ik graag alle punten van deze polyline opslaan als variabelen. De punten op een polyline hebben als waarde assoc 10. Als ik assoc 10 filter uit mijn polyline dan krijg ik allen de eerste assoc 10. Maar ik wil ze allemaal. Ik heb wel de eerste en de laatste d'r uit weten te krijgen maar dus tussen liggende nog niet. De aantallen hiertussen is altijd variabel. Misschien kan iemand mij helpen. Ik heb mijn routine hieronder staan:

;PuntHB = beginpunt hartlijn
;PuntHE = eindpunt hartlijn
;SSH = selectieset hartlijn
;SSHL = lijn Links naast hartlijn
;SSHR = lijn Recht selectieset hartlijn
;PuntHBL = beginpunt lijn links naast hartlijn
;PuntHBR = beginpunt lijn rechts naast hartlijn
;PuntHEL = Eindpunt lijn links naast hartlijn
;PuntHER = Eindpunt lijn rechts naast hartlijn
;LIJNL = selectie lijn links van hartlijn
;LIJNR = selectie lijn rechts van hartlijn
;HPAT = hatch patroon komt vanuit JK-bib.mns en is daar ingesteld
;(H/L)KLEUR = LaagKleur komt vanuit JK-bib.mns en is daar ingesteld
;(H/L)LAAG = Laag komt vanuit JK-bib.mns en is daar ingesteld

(defun C:Wand ( / )

;onderstaande setq's zijn tijdelijk, deze moeten allemaal uit het JK-BIB.mns komen
(setq HPAT "baksteen")
(setq HLAAG "21A")
(setq HKLEUR "243")

(setq LLAAG "21L")
(setq LKLEUR "3")

(setq WDIKTE "100")
 
(setq PLINEWID (getvar "plinewid"))
   (command "plinewid" WDIKTE)
      

(command "-layer" "m" LLAAG  "C" LKLEUR "" "")
(princ "\nSelecteer een polyline die moet worden omgezet naar een wand")
(setq SSH (ssget))   
(setq HARTLIJN (entget (entlast)))

(setq HTCUT (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr HARTLIJN))))))))))))))) ; eerste pair = eindpunt van de polyline
(setq PUNTHE (cdr (assoc 10 HTCUT))) ;filtert de coordinaten van het eindpunt
(setq PUNTHB (cdr (assoc 10 (cdr (cdr (cdr (cdr (reverse HTCUT)))))))) ;keert waardes harlijn in omgkeerde volgorde en Filtert de coordinaten van het beginpunt[/font]

(command "offset" "50" SSH "-1000,-1000" ^C) ;-100 = offset ene zijde van hartlijn
(setq SSHL (ssget "l"))
(setq LIJNL (entget (entlast)))
(setq HTCUTL (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr LIJNL))))))))))))))) ; eerste pair = eindpunt van de polyline
(setq PUNTHEL (cdr (assoc 10 HTCUTL))) ;filtert de coordinaten van het eindpunt
(setq PUNTHBL (cdr (assoc 10 (cdr (cdr (cdr (cdr (reverse HTCUTL)))))))) ;keert waardes harlijn in omgkeerde volgorde en Filtert de coordinaten van het beginpunt


(command "offset" "50" SSH "999999,999999" ^C) ;-100 = offset andere zijde van hartlijn
(setq SSHR (ssget "l"))
(setq LIJNR (entget (entlast)))
(setq HTCUTR (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr LIJNR))))))))))))))) ; eerste pair = eindpunt van de polyline
(setq PUNTHER (cdr (assoc 10 HTCUTR))) ;filtert de coordinaten van het eindpunt
(setq PUNTHBR (cdr (assoc 10 (cdr (cdr (cdr (cdr (reverse HTCUTR)))))))) ;keert waardes harlijn in omgkeerde volgorde en Filtert de coordinaten van het beginpunt

(command "erase" SSH "") ;verwijderd harlijn
 
;einden van de linker en rechter lijn verbinden d.m.v. een polyline
(command "pline" PUNTHBL PUNTHBR ^C)
(setq KOP1 (ssget "l"))
(command "pline" PUNTHEL PUNTHER ^C)
(setq KOP2 (ssget "l"))
 
;Alle 4 polylijnen met elkaar verbinden
(command "pedit" KOP1 "J" SSHR KOP2 SSHL "" "")
(setq SSWAND (ssget "l")) ;Wand omlijningselectie
(pedit SSWAND "W" "0" "" "")
 
;arceren van de wand
(command "-layer" "m" HLAAG  "C" HKLEUR "" "")
(command "-bhatch" "p" HPAT "1" "0" "s" SSWAND "" "")

)
 

HofCAD

#1
Citaat van: Wilfred op wo 18 01 2006, 13:49:21
Ik ben bezig om een lisp te schrijven waar ik wanden mee kan teken. Dit doe ik m.b.v. een polyline.
Nu wil ik graag alle punten van deze polyline opslaan als variabelen. De punten op een polyline hebben als waarde assoc 10. Als ik assoc 10 filter uit mijn polyline dan krijg ik allen de eerste assoc 10. Maar ik wil ze allemaal. Ik heb wel de eerste en de laatste d'r uit weten te krijgen maar dus tussen liggende nog niet. De aantallen hiertussen is altijd variabel. Misschien kan iemand mij helpen. Ik heb mijn routine hieronder staan:


------------- ~\\|//~ ------------
------------- (o)-(o) -------------
--------ooO---(_)---Ooo--------


Beste Wilfred,

In een reactie op het onderstaande item ' Bematen via autolisp' van  Benny,
heb ik  twee programma's geschreven BMREC en RECBM.
http://www.cadsite.be/smf/index.php/topic,896.0.html
In het programma RECBM staat de subroutine @vert, die van een polyline en van een lwpolyline
een gevraagd hoekpunt kan bepalen.

   
(defun @dxf (code elist)
    (cdr (assoc code elist))
  )
(defun @vert (e v / name en ev i vl zn)
    (setq name (@dxf 0 (entget e)))
    (if (= name "POLYLINE")
      (progn
(setq en e)
(repeat v
  (setq en (entnext en))
)
(setq p! (cdr (assoc 10 (entget en))))
      )
    )
    (if (= name "LWPOLYLINE")
      (progn
(setq ev (entget e)
      i 0
      zn (cdr (assoc 38 ev))
      vl (list '(0 0 0))
)
(while (/= (nth i ev) nil)
  (if (= (car (nth i ev)) 10)
    (setq
      vl (append
   vl
   (list
     (list 10 (cadr (nth i ev)) (caddr (nth i ev)) zn)
   )
)
    )
  )
  (setq i (1+ i))
)
(setq p! (cdr (nth v vl)))
      )
    )
    (setq p! p!)
  )


Als de poylijn-entiteit e is, dan kan men bijv. met (@vert e 7) het zevende hoekpunt bepalen,
als het hoekpunt niet bestaat krijgt men nil.
Door de routine @vert in een while loop te zetten, kan men dus alle hoekpunten vinden.
Hopelijk is het bovenstaande precies wat je zoekt.

Hoogachtend HofCAD CSI
ACADcadabra

yoin