CADsite forum

AutoCAD => Autolisp => Topic gestart door: Maikel op wo 21 03 2007, 09:02:43

Titel: Xref gegevens lezen
Bericht door: Maikel op wo 21 03 2007, 09:02:43
Goedemorgen allemaal,

Alles goed. Ik zit met een vraag. Is het mogelijk om vanuit een Xref gegevens te lezen met behulp van een lisp. Om zo bijvoorbeeld de hatch van een bepaalde wand te weten toekomen.

Alvast bedankt voor jullie reacties

Maikel
Titel: Re: Xref gegevens lezen
Bericht door: Reimer op wo 21 03 2007, 19:47:28
met het commando XLIST kun je gegevens uit een xref opvragen. Dit is vaak heel beperkt en de naam van een hatchpattern kun je volgens mij niet zien. Je zou met NCOPY een object (b.v. de hatch) uit de xref naar de tekening kunnen copieren. Je kunt nu nagaan om welk hatchpattern het gaat (list/properties)

Reimer
Titel: Re: Xref gegevens lezen
Bericht door: Maikel op ma 26 03 2007, 16:57:32
Bedankt, hier kan ik wel wat mee :wink:

Mazzel Maikel
Titel: Re: Xref gegevens lezen
Bericht door: HofCAD op ma 02 04 2007, 20:07:11
Citaat van: Maikel op wo 21 03 2007, 09:02:43
Goedemorgen allemaal,

Alles goed. Ik zit met een vraag. Is het mogelijk om vanuit een Xref gegevens te lezen met behulp van een lisp. Om zo bijvoorbeeld de hatch van een bepaalde wand te weten toekomen.

Alvast bedankt voor jullie reacties

Maikel

Beste Maikel,

De gegevens van een hatch uitlezen, daar kan ik je nu niet mee helpen. :cry: :oops:
Maar heb je voor andere tekenelementen in je XREF dit al geprobeert:
(entget (car (nentsel)))

Met vriendelijke groet,
HofCAD CSI
Titel: Re: Xref gegevens lezen
Bericht door: Maikel op di 03 04 2007, 08:08:57
Goedemorgen allemaal,

Ik ben momenteel bezig met het schrijven van een lisp ik heb momenteel het volgende:


(defun Muurtype ( /  )

;The next while loop checks for null or invalid selection.
  (while (or
    (not (setq ePick (nentsel "\nSelect the type of wall: ")))
    (< (length ePick) 3)
    );end or
    (progn  (princ "\nObject was invalid or was not selected."))
  );end while

(GetList)
)
;;;----------------------------------------------------------------------------------
(defun GetList ( / iNest eList   )
  (setq iNest (length (last ePick)))

;The next if statement handles block within blocks. iNest = 1 means no nesting. Since (nentsel) goes all the
;way to the root AutoCAD object we have to traverse back up to the top level of the nesting to get a block name.
  (if (= iNest 1)
    (setq eList (entget (car ePick)))
    (setq eList (entget (nth (- iNest 2) (last ePick)))) 
  );end if

;Check Layername (hatch)
  (setq sLayer (last (assoc 8 eList))
  ); end setq
 
); End GetList


Volgens gaat dit wel werken. Dit is mijn eerst lisp dus ik hoor graag wat jullie ervan vinden.

Met vriendelijke groet,

Maikel
Titel: Re: Xref gegevens lezen
Bericht door: HofCAD op di 03 04 2007, 16:38:53
Citaat van: Maikel op di 03 04 2007, 08:08:57
Goedemorgen allemaal,
Ik ben momenteel bezig met het schrijven van een lisp ik heb momenteel het volgende:
Met vriendelijke groet,
Maikel

Beste Maikel,

Als het alleen om de laagnaam van een object binnen een
block of xref gaat, dan kun je dat ook zo:

(defun c:hala()
(setq e (assoc 8 (entget (car (nentsel)))))
(princ (strcat "\nDe laag van het geselecteerde object is " (cdr e)))
(princ)
)


Met vriendelijke groet,
HofCAD CSI
Titel: Re: Xref gegevens lezen
Bericht door: Maikel op di 03 04 2007, 17:24:40
beste HofCAD

Geldt dit ook wanneer de hatch in de xref staat.

Met vriendelijke groet,

Maikel
Titel: Re: Xref gegevens lezen
Bericht door: HofCAD op di 03 04 2007, 18:22:11
Citaat van: Maikel op di 03 04 2007, 17:24:40
beste HofCAD

Geldt dit ook wanneer de hatch in de xref staat.

Met vriendelijke groet,

Maikel

Beste Maikel,

Sorry, jammer genoeg niet.

Met vriendelijke groet,
HofCAD CSI

PS Men krijgt de lijndefinitie van een lijn van de arcering?
Titel: Re: Xref gegevens lezen
Bericht door: HofCAD op wo 04 04 2007, 15:27:22
Citaat van: Maikel op di 03 04 2007, 08:08:57
Goedemorgen allemaal,
Ik ben momenteel bezig met het schrijven van een lisp ik heb momenteel het volgende:

(defun Muurtype ( /  )
.........
.........
;Check Layername (hatch)
  (setq sLayer (last (assoc 8 eList))
  ); end setq
 
); End GetList

Volgens gaat dit wel werken. Dit is mijn eerst lisp dus ik hoor graag wat jullie ervan vinden.
Met vriendelijke groet,
Maikel

Beste Maikel,

Je zal toch met XLIST of met -XLIST moeten werken,
of met het programma Muurtype.
Op drie plaatsen heb ik het programma aangepast.
Namelijk (defun Muurtype ( /  ) in (defun c:Muurtype ( / epick)
en (setq sLayer (last (assoc 8 eList)) in (setq sLayer (cdr (assoc 8 eList))
en de toevoeging
(princ (strcat "\nThe layer is: " slayer))
(terpri)
Je kan nu na het laden, het programma opstarten met het
commmando MUURTYPE of met (c:muurtype).

Met vriendelijke groet,
HofCAD CSI


(defun c:Muurtype ( / epick)

;The next while loop checks for null or invalid selection.
  (while (or
    (not (setq ePick (nentsel "\nSelect the type of wall: ")))
    (< (length ePick) 3)
    );end or
    (progn  (princ "\nObject was invalid or was not selected."))
  );end while

(GetList)
)
;;;----------------------------------------------------------------------------------
(defun GetList ( / iNest eList slayer)
  (setq iNest (length (last ePick)))

;The next if statement handles block within blocks. iNest = 1 means no nesting. Since (nentsel) goes all the
;way to the root AutoCAD object we have to traverse back up to the top level of the nesting to get a block name.
  (if (= iNest 1)
    (setq eList (entget (car ePick)))
    (setq eList (entget (nth (- iNest 2) (last ePick)))) 
  );end if

;Check Layername (hatch)
  (setq sLayer (cdr (assoc 8 eList))
  ); end setq
  (princ (strcat "\nThe layer is: " slayer))
  (terpri)
 
); End GetList


PS Je programma code komt mij zo bekend voor.
Titel: Re: Xref gegevens lezen
Bericht door: Maikel op wo 04 04 2007, 15:56:43
Goedemiddag,

De reden dat ik de cdr had gewijzigd naar last omdat de layer meer gegevens heeft dan ik wil.

De sLayer krijgt bijvoorbeeld als waarde: 43260269-x13l000 kalkzandsteen

Ik heb het inmiddels al uitgeprobeerd met de cdr te wijzigen maar dat werkt niet. Het woord kalkzandsteen is voor mij van belang. Heeft iemand misschien een idee zodat ik alleen kalkzandsteen heb als gegeven van sLayer krijg.

Alvast bedankt,

Maikel
Titel: Re: Xref gegevens lezen
Bericht door: HofCAD op wo 04 04 2007, 16:27:04
Citaat van: Maikel op wo 04 04 2007, 15:56:43
Goedemiddag,

De reden dat ik de cdr had gewijzigd naar last omdat de layer meer gegevens heeft dan ik wil.

De sLayer krijgt bijvoorbeeld als waarde: 43260269-x13l000 kalkzandsteen

Ik heb het inmiddels al uitgeprobeerd met de cdr te wijzigen maar dat werkt niet. Het woord kalkzandsteen is voor mij van belang. Heeft iemand misschien een idee zodat ik alleen kalkzandsteen heb als gegeven van sLayer krijg.

Alvast bedankt,

Maikel

Beste Maikel,

Wil je 'kalkzandsteen' of wil je '000 kalkzandsteen'?
Indien je slechts 'kalkzandsteen' wil hebben,
staat er altijd een getal met een spatie voor de beschrijving?
Indien er altijd  een spatie staat, dan is het volgende programma handig.

(defun string->list (f_string / f_ls f_str f_len f_loop f_cur)
;converts string to a list using spaces as deliminators
  (setq   f_ls nil
          f_str ""
  )
  (setq f_loop 0)
  (repeat (strlen f_string)
    (progn
      (setq f_loop (1+ f_loop))
      (setq f_cur (substr f_string f_loop 1))
      (if (= (ascii f_cur) 32)
(if (/= f_str "")
  (progn (setq f_ls (append f_ls (list f_str)))
(setq f_str "")
  )
)
(setq f_str (strcat f_str f_cur))
      )
    )
  )
  (if (/= f_str "")
    (setq f_ls (append f_ls (list f_str)))
  )
  f_ls
)

Daarmee kun je als
(setq slayer "43260269-x13l000 kalkzandsteen")
is, dit veranderen met
(car (cdr (string->list slayer)))
naar "kalkzandsteen"
De uitvoeropdracht wordt van
(princ (strcat "\nThe layer is: " slayer))
(terpri)
verandert naar
(princ (strcat "\nThe layer is: " (car (cdr (string->list slayer)))))
(terpri)

Indien het aantal karakters wat voor de beschrijving 'kalkzandsteen' staat altijd even lang is
(de tekeningnaam+pipingsymbol+nnn+spatie) ,
dan kan men ook de standaard AutoLisp function (substr string start [length]) gebruiken.
De uitvoeropdracht wordt dan
(princ (strcat "\nThe layer is: " (substr slayer 18)))
(terpri)


Met vriendelijke groet,
HofCAD CSI
Titel: Re: Xref gegevens lezen
Bericht door: Maikel op do 12 04 2007, 13:09:19
Het is gelukt. :mrgreen: :vreegoe:

HofCAD, Bedankt

Maikel