FastFiber

blockname als variabele

Gestart door Martin, di 21 09 2004, 21:48:38

Vorige topic - Volgende topic

Martin

Ik ben aan mijn eerste lisp-programma begonnen.
Het zal wel lang duren, maar dat is denkik de enige manier om het te leren.

Nu zoek ik het volgende commando.
Via een lisp selecteer ik eerst een window en in dit window staan karakters.
Nu moeten deze karakters de "naam" worden van blocks die ik aan wil maken.

Hoe kan ik via lisp iets selecteren en dit gebruiken
als "blockname"?

groet, martin

bart

nieuw de inhoud van 1 tekststring als blocknaam gebruiken is goed te doen

maar een aantal strings tot 1 naam omvormen dat lijkt me nog al een klus (tenzij de naam volstrekt willekeurig mag zijn)
Domme vragen bestaan niet.
Domme antwoorden wel.

m.vr. groet Bart

Joop

Bart schreef:
Citeermaar een aantal strings tot 1 naam omvormen dat lijkt me nog al een klus (tenzij de naam volstrekt willekeurig mag zijn)

Als je de tekst regels in de goede volgorde selecteerd  heb je een lijst van die inhoud van die regels die je met de LISP opdracht "strcat" tot een (1) zin (lees naam) kunt omvormen.

Selecteer je de tekst met een window dan heb je een "willekeurige" lijst.
Deze kun je sorteren op bijvoorbeeld de x-coordinaat.
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

Anonymous

Citaat van: bartnieuw de inhoud van 1 tekststring als blocknaam gebruiken is goed te doen

maar een aantal strings tot 1 naam omvormen dat lijkt me nog al een klus (tenzij de naam volstrekt willekeurig mag zijn)



Het is één tekststring van max. 4 karakters; dit is dus goed te doen, maar hoe?

Joop

Aangezien je wilt leren programmeren met LISP het volgende:
Maak vanuit de Visual Lisp Console een selectie van een block.
(setq MijnBlok (ssget))
Dubbelkik daarna op de variabelenaam MijnBlok.
De naam wordt oranje. Klik nu met je rechter muisknop hierop en kies Inspect.
Er verschijnt een inspectievenster. Dubbelklik op entity naam en er verschijnt weer een inspectie venster metr meer gegevens.
Klik weer op entity naam en kies inspect raw data.
Nu krijg je (een deel van) de dxf data van het gekozen blok, waaronder ook de naam.
Met behulp van assoc en entmod, entupd e.d. kun je nu de naam veranderen.

DUS: je maakt een blok aan met een standaard naam en vervangt dan de naam door jouw, uit tekst geconstrueerde, naam.
OF je werkt met de command instructie van lisp. Hiertoe moet je eerst goed opschrijven wat het commando "-wblock" precies doet, net als in een script.
Dit lijkt misschien eenvoudiger maar de kans op bugs is veel groter.
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

Anonymous

bedankt, maar ik wacht wel totdat er wat meer lessen op deze catsite staan.
groetjes, Martin

Joop

Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

Anonymous

kan niet wachten.
ik zoek zoiets als
(setq a (getstring (278,315  236,303)))
(command "-block" "a" "337.5,300" "w" "0,553.5" "337.5,300" "")

waarbij a de naam block is, deze haalt hij uit het window van de opgegeve coordinaten.
maar hoe selecteer ik eigenlijk een string? dat kon ik nog niet
in de lessen vinden.

Joop

(setq a (ssget "_W" '(0 553.5) '(337.5,300)  '(( 0 . "TEXT"))))
(setq a (cdr (assoc 1 (entget (ssname a 0)))))


Let erop dat je het juiste aantal haakjes openen en sluiten hebt.
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

Anonymous

hij loopt vast bij insertion point. wat is fout?

(defun c:tttt ( / a pt0 pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 pt9 pt10 pt11 pt12)
(setq a (ssget "_W" '(279 323) '(337.5 300)  '(( 0 . "TEXT"))))
(setq a (cdr (assoc 1 (entget (ssname a 0)))))
(setq pt0 278)
   (setq pt1 315)
   (setq pt2 615)
   (setq pt3 62)
   (setq pt4 236)
   (setq pt5 303)
   (setq pt6 573)
   (setq pt7 337.5)
   (setq pt8 300)
   (setq pt9 279)
   (setq pt10 323)
   (setq pt11 (list pt7 pt8))
   (setq pt12 (list pt9 pt10))
 (command "-block" a (pt11) w (pt12) (pt11) "")
)

Joop

(defun c:tttt (/ ;a pt0 pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 pt9 pt10 pt11 pt12
     )
 (setq a (ssget "_W" '(279 323) '(337.5 300) '((0 . "TEXT"))))
 (setq a (cdr (assoc 1 (entget (ssname a 0)))))
 (setq pt0 278)
 (setq pt1 315)
 (setq pt2 615)
 (setq pt3 62)
 (setq pt4 236)
 (setq pt5 303)
 (setq pt6 573)
 (setq pt7 337.5)
 (setq pt8 300)
 (setq pt9 279)
 (setq pt10 323)
 (setq pt11 (list pt7 pt8))
 (setq pt12 (list pt9 pt10))
 (command "-block" a pt11 "w" pt12 pt11 "")
) ;_ end of defun
;|«Visual LISP© Format Options»
(100 2 40 2 T "end of " 80 9 0 0 nil T T nil T)
;*** DO NOT add text below the comment! ***|;


In de "command" regel moet je alle aanwijzingen voor het commando (zoals selecteren m.b.v. een window) tussen aanhalingstekens zetten, dus: niet w maar "w".
Als je een variabele gebruikt op de command line dan moet je deze (meestal) tussen haakjes zetten.

:!: Maar niet in AutoLisp! :!:
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

Joop

PS
:wink:
Je moet de punt-komma voor de variabelen weer even weghalen.
Dit heb ik gedaan om de code te kunnen debuggen.
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

Anonymous

YES !!!!!!!   THANKS !!!
Nu moet ik dit tig keer herhalen op verschillende coordinaten.
Dus een loop met een teller.
Waar kan ik basis/principe instrukties vinden over loops?
groetjes,Martin

Joop

Zoals altijd in de help functie van Visual LISP

Ik raad je aan om de coordinaten in een lijst te stoppen en dan met de while en de nth functie de zaken af te handelen.
Denk er wel aan dat de index van het eerste element in een lijst 0 is.

:?: Vraagje:
Liggen deze coordinaten vast of moet je die elke keer bepalen?
In het laatste geval kun je beter de coordinaten kiezen met de muis, want dan ben je vlugger klaar en kun je de functie herhalend opbouwen rondom de getpoint functie. :roll:
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

Anonymous

Geen idee hoe je dan nth moet toepassen.
herhaalt de while functie zich automatisch of moet je op het eind terugverwijzen naar begin while functie.

ergens zag ik :
) ;_ end of while

maar als hij niks meer vindt, stopt hij toch vanzelf?

vraag 2.
   (setq txtlst2 (acad_strlsort txtlst))
dit commande vond ik ergens in een lisp. Als ik dit gebruik sorteer hij
op tekst / eerste karakter niet op nummervolgorde. Kan dit wel?
bijv. 1, 2, 3, 15, 16, 22 sorteert hij op 1, 15, 16, 2, 22, 3

FastFiber