Lisp selecteren objecten in blocks "nested items" [OPGELOST door Roy_043]

Gestart door AdenRob, di 01 05 2012, 14:17:51

Vorige topic - Volgende topic

AdenRob

Beste AutoCad gebruikers,

Wij zijn de laatste maanden onszelf aan het verdiepen in Lips. Echter lopen wij tegen een, bij ons veel voorkomend, probleem aan.
Wij willen graag een lisp schrijven die ook naar objecten IN blocks kijkt.

VOORBEELD:
Wij zouden graag ALLE lijnen in de kleur rood willen selecteren. Dus ook de rode lijnen in blocks en blocks in blocks etc.

Kan iemand ons helpen om dit in een Lisp te verwerken :?: Zodat wij een selectie (setq) kunnen maken om hiervan vervolgens de eigenschappen te veranderen. Dit laatste valt (voor nu nog) buiten de vraagstelling.

Alvaste bedankt!

roy_043

Wat jullie willen gaat het gemakkelijkst met de vl* functies. Zie bijgevoegd voorbeeld. De functie GetAllRedLines retourneert een lijst met objecten. Deze lijst kun je m.b.v. mapcar of foreach doorlopen.

roy_043

Oops: ik was (vl-load-com) vergeten. Bijgevoegd de verbeterde versie.

AdenRob

Citaat van: roy_043 op wo 02 05 2012, 08:33:53
Oops: ik was (vl-load-com) vergeten. Bijgevoegd de verbeterde versie.

Best Roy,

Bedankt voor de hulp! :vreegoe:
Helaas zijn wij nog niet zo bekend met VL* functies. Maar als dit de manier is om alle, in dit voorbeeld, rode lijnen te selecteren dan zullen we ons hier in moeten gaan verdiepen.
Als we het goed begrijpen dan kunnen we VL* functies combineren met Lisp functies?
Heb je misschien een voorbeeld waarin een lijst wordt doorlopen met mapcar of foreach?

Groeten AdenRob

EddyBeerke

In de help staan voorbeelden voor het gebruik ervan!
Civil3d 2022, Blender 3.4 gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/


AdenRob

Citaat van: roy_043 op wo 02 05 2012, 16:33:40
http://www.autolisp-tutorial.mapcar.net/listen4.htm
http://www.autolisp-tutorial.mapcar.net/listen6.html

@Roy: Het lukt ons helaas niet om jouw handleiding om te zetten naar een praktijk voorbeeld.

De afgelopen week hebben wij ons verder verdiept in het werken met Lisp en VL* functies.
Helaas zijn we er nog niet helemaal uit hoe we een lisp kunnen schrijven die doet wat wij willen.  Of beter gezegd; Hoe wij de lisp van roy_043 kunnen combineren met andere commando's.

In de bijlage hebben we onze voorbeeld DWG en LISP toegevoegd. Hierin is het de bedoeling dat alle objecten die rood zijn (dus ook de bylayer objecten welke in een laag met de kleur rood staan), d.m.v. één handeling allemaal een lineweight krijgen van 2mm.

De bijgevoegde lisp doet al gedeeltelijk wat wij willen. Echter werkt deze niet voor objecten in blocks en voor de objecten bylayer die toch rood zijn. We zouden deze dus graag willen combineren met de lisp van roy_043.

Wie kan ons hier verder mee kunnen helpen?

roy_043

@AdenRob

De test dwg zit vreemd in elkaar.
De eigenschappen van de losse elementen komen niet overeen met die van de elementen in de blocks. Ondanks de sterke suggestie dat dit wel zo is. Er is bij de geneste elementen sprake van color and lineweight ByBlock.

Wat is jullie bedoeling?
Voorbeeld:
Een block reference heeft color ByLayer en staat op de laag "test laag". Deze laag is rood, dus volgens de omschrijving moet deze block reference lineweight 200 krijgen. Maar in dit block zit een lijn met de kleur geel. Deze lijn heeft lineweight ByBlock en krijgt daarmee gewenst/ongewenst ook lineweight 200.

Ad en Rob, maken jullie het niet veel moeilijker dan nodig is?

AdenRob

Beste Roy,

We hebben naar aanleiding van jouw (terechte kritische) reactie, goed nagedacht en de volgende conclusie getrokken. Het bijgevoegde voorbeeld met de vraagstelling is  inderdaad niet helemaal eenduidig.

Hieronder onze aangepaste vraagstelling.

Wij willen dat de Lisp het volgende kan;
ALLE objecten zoals (P-)lines, arc’s, circles, teksten, blocks inclusief ALLE objecten in blocks die wij een kleur gegeven hebben (dus niet “by layer”), zoals in ons voorbeeld rood, dienen een lineweight te krijgen van 2,0mm.

Weet jij misschien hoe wij onze Lisp hierop aan kunnen passen?

roy_043

... Dus ongeacht welke "gegeven" kleur (1, 2, ..., ByBlock) wordt het lineweight van de objecten 2.0mm. Alleen objecten met een kleur ByLayer worden niet aangepast en behouden hun huidige lineweight. Begrijp ik het zo goed?

AdenRob

Citaat van: roy_043 op do 10 05 2012, 15:27:12
... Dus ongeacht welke "gegeven" kleur (1, 2, ..., ByBlock) wordt het lineweight van de objecten 2.0mm. Alleen objecten met een kleur ByLayer worden niet aangepast en behouden hun huidige lineweight. Begrijp ik het zo goed?

Je begrijpt het gedeeltelijk goed. In principe is het de bedoeling dat alle objecten welke de "gegeven" kleur rood (color 1) hebben allemaal een lineweight van 2,0mm krijgen. Met de kleur ByLayer hoeft niks gedaan te worden.

Uiteraard is het later de bedoeling dat we alle kleuren die wij gebruiken gaan koppellen aan een bepaalde lijndikte. Maar als het nu vast voor de kleur rood werkt dan hebben we een mooi voorbeeld om mee verder te werken. Dus uiteindelijk zal het straks zo zijn dat de kleur ByLayer geen lineweight heeft en de rest van alle gebruikte kleuren wel.

Alvast bedankt!

roy_043

Zie bijlage.
Er zijn twee voorbeeldfuncties:
C1_To_W200
ChangeMultiple

AdenRob

Citaat van: roy_043 op do 10 05 2012, 18:25:00
Zie bijlage.
Er zijn twee voorbeeldfuncties:
C1_To_W200
ChangeMultiple

Roy geweldig !!!  :vreegoe: :vreegoe: :vreegoe:
De Lisp werkt perfect voor hetgeen wat we gevraagd hebben!  :D

In verband met voortschrijdend inzicht, zou het beter zijn ALLE objecten in blocken (en blocken in blocken) in te stellen op het volgende;
De color instellen op byblock, (maar wel NA EERST het doorlopen van JOUW geweldige lisp).
De linetype instellen op byblock MITS deze staat ingesteld op  bylayer.
De lineweight instellen op byblock MITS deze op bylayer staat. (zodat jouw de toegekende lineweight middels jouw lisp gehandhaafd blijft.)

Op deze manier kan men een dwg, geheel of gedeeltelijk, zwart als ook eenvoudig in een kleur plotten, zonder een woud aan verschillende ctb's, met behoud van de juiste lijndiktes en volgens het principe WYSIWYG!

Onze vervolg vraag is, kan jij hierop deze lisp aanpassen? Onze kennis is hiervoor helaas nog te beperkt. Wij zijn al lang op zoek naar deze werkmethode en wij hopen dat we hiermee vele mede cadgebruikers op een idee gebracht hebben!

roy_043

@AdenRob:

Bijgevoegd een aangepaste versie van de lisp.

Wat jullie misschien niet weten over blocks:
- Ook de losse objecten in model space en paper space staan in een block.
- Maatvoeringen bevatten anonieme blocks.
- Er zijn nog andere anonieme blocks, zo bevat elk table object een anoniem block.
In mijn voorbeeldtekening heb ik 1 block, "App" (2 wanden in een T-vorm), zelf gemaakt. Maar toch bevat deze tekening de volgende blocks:
  "*Model_Space"
  "*Paper_Space"
  "*Paper_Space0"
  "App"
  "*D2"
  "*D3"
In de huidige opzet bewerkt de lisp alle objecten in alle blocks (incl alle MS- en PS-blocks en incl. alle anonieme blocks).
Het is de vraag of jullie dat willen.

Volgens mij is dit de volgende schrede op het pad van jullie inzicht:
http://ww3.cad.de/foren/ubb/uploads/marc.scherer/ProStb.pdf (Engelse tekst).

AdenRob

#14
Beste Roy,

Wat een geweldige Lisp  :vreegoe: :vreegoe: :vreegoe:

Chapeau!!!

In het persoonlijke bericht hadden we aangegeven dat we de Lisp nog uitvoerig zouden testen. Hierbij onze reactie.

De Lisp doet precies wat wij willen. :D Echter geeft de Lisp nog wel de volgende foutmelding: “; error: Automation Error. Object was erased”. Deze foutmelding komt voor als er maatvoering in de tekening aanwezig is. Zie bijgevoegde voorbeeldtekening.

Wanneer we de Lisp testen in de “Visual Lisp Editor” dan krijgen wij dezelfde melding. De Lisp blijft dan vervolgens in z’n loop hangen. Wanneer we de Visual Lisp editor af willen sluiten (om uit de loop te komen) dan krijgen we deze melding; “Reset break loop to close IDE?”.
De Lisp verbouwd echter wel de maatvoering op de juiste manier. Is er een mogelijkheid om deze foutmelding te voorkomen?

Ook lopen wij tegen het probleem aan dat de lisp in de meeste tekeningen voor 99% werkt. Een aantal lijnen in blocks worden niet juist verbouwd. De kleur van deze lijnen wordt niet ByBlock.
Wanneer we de tekening in zijn geheel kopiëren en plakken in een "leeg blad" oftewel drawing 1, dan is dit probleem opgelost. Betekent dit dat onze tekening niet helemaal schoon is, of er een setting anders ingesteld dient te worden?

Ps we weten inderdaad niet dat losse objecten in blocks staan. Op wat voor manier kan men deze “anonieme” blocks zien? Wel weten we als er b.v. gemaatvoerd is in een dwg er vele tijdelijke blocks gemaakt worden, maar deze kunnen eenvoudig verwijderd worden met purge.

PPs het verschil tussen stb en ctb hebben we in het verleden  al een uitvoerig tegen het licht gehouden. Wij blijven, (voorlopig, zeg nooit nooit) bij ctb vanwege het principe van WYSIWYG.

Groeten AdenRob