Hi,
Ik wil een routine maken die verschillende lagen in de actieve viewport bevriest.
Heeft iemand een idee hoe ik hiermee begin?
Alvast bedankt voor de moeite.!!!
groeten Marcel..
Dag Mrcel,
je zult denk ik even beter moeten omschrijven wat je wilt...
Gaat het altijd om dezelfde lagen, enz.
Groet JMD
Indien je altijd dezelfde lagen uit wilt zetten of lagen die beginnen met dezelfde letters kun je het onderstaande toepassen.
Ik heb hier een voorbeeld gegeven van een laagnaam waarvan de eerste 3 letters DIM of de eerste letters 5 TEKST zijn.
(DEFUN C:LAYER-VP-FREEZE ()
(princ "\nSelecteer te wijzigen viewport ......: ")
(setq L (car(entsel)))
(setq laag (tblnext "layer" T))
(while (/= laag nil)
(setq laagnaam (cdr (assoc 2 laag)))
(if (OR
(= (substr (strcase laagnaam) 1 3) "DIM")
(= (substr (strcase laagnaam) 1 5) "TEKST")
)(progn
(COMMAND "vplayer" "f" laagnaam "s" L "" "")
);progn
);if
(setq laag (tblnext "layer"))
);while
);defun
@cetacad het is natuurlijk geen vba... Maar als je het toch in lisp doet: dit werkt volgens mij ook qua commando:
... (COMMAND "vplayer" "f" "dim*,tekst*" "s" L "" "") ...
Het zijn inderdaad elke keer wel dezelfde lagen die ik wil uitzetten in de viewport.
Alleen hebben we 2 soorten layout tabladen, en in beide moeten er verschillende lagen aan en uit staan.
Dus met deze lisp kan ik misschien al wel een eind komen.
Ik had het eigenlijk in VBA willen doen, maar ik zal eens kijken of dit werkt.
Alvast bedankt.
groeten Marcel..
Iets gaat er nog niet goed, ik krijg deze melding in mijn command regel:
Select objects: Enter an option
[?/Color/Ltype/LWeight/Freeze/Thaw/Reset/Newfrz/Vpvisdflt]:
Command: nil
Doe ik iets niet goed, of ligt het aan de code?
groeten Marcel..
@marcelmaas: Om verwarring te voorkomen: post jouw code.
Okay hier is mijn code:
(DEFUN C:Layer-VP-Freeze ()
(princ "\nSelecteer te wijzigen viewport ......: ")
(setq L (car(entsel)))
(setq laag (tblnext "layer" T))
(while (/= laag nil)
(setq laagnaam (cdr (assoc 2 laag)))
(if (OR
(= (substr (strcase laagnaam) 1 3) "KOP")
(= (substr (strcase laagnaam) 1 3) "AAN")
)(progn
(COMMAND "vplayer" "f" laagnaam "s" L "" "")
);progn
);if
(setq laag (tblnext "layer"))
);while
);defun
OK: je gebruikt dus de code van cetacad. Bij mij werkt deze code (net als bij cetacad dus). Het kan zijn dat de volgorde van de prompts het probleem veroorzaakt. Als ik het commando VPLAYER gebruik dan zijn dit de prompts:
: vplayer
List/Freeze/Thaw/Reset/New frozen layers/Default visibility settings : f
Select the layer(s) to freeze: dezeLaagBestaatNiet
All/Select/<Current>: s
Select a viewport :
Entities in set: 1
Select a viewport :
List/Freeze/Thaw/Reset/New frozen layers/Default visibility settings :
Dit komt overeen met de lisp-code.
Wat zijn bij jouw de prompts voor VPLAYER?
Mijn prompts zijn:
?/color/Ltype/Lweight/Freeze/Thaw/Reset/Newfrz/Vpvisdflt
groeten Marcel..
Ik bedoel dus: als je "handmatig" het commando VPLAYER gebruikt wat zijn dan de opeenvolgende prompts. Zie de 8 gele regels in mijn vorige post.
Ik heb het probleem al gevonden, de lagen bestonden niet, omdat ik de verkeerde tekening geopend had naardat mijn autocad was vastgelopen.
Nu werkt het zoals jij zij.
Is het misschien mogelijk om niet een viewport te hoeven aanklikken maar dat het gewoon werkt voor de layout tab die actief is?
Misschien te ingewikkeld, maar is voor ons wel makkelijker.
In ieder geval alvast bedankt voor deze hulp.
Marcel..
Vreemd, het programma loopt volgens mij niet vast op niet bestaande lagen. Dat heeft cetacad namelijk goed geregeld! :vreegoe:
Hier een aangepaste versie van zijn programma (Layer-VP-Freeze) en hoe ik het zou doen (ALT-VP-F). Beide programmaatjes selecteren nu alle viewports op de actieve tab.
(defun c:Layer-VP-Freeze ( / ss laag laagnaam)
(setvar "cmdecho" 0)
(setq ss (ssget "_X" (list '(0 . "VIEWPORT") (cons 410 (getvar "ctab")))))
(while (setq laag (tblnext "layer" (not laag))) ; bij eerste keer is (not laag) gelijk aan T
(setq laagnaam (cdr (assoc 2 laag)))
(if
(or
(= (substr (strcase laagnaam) 1 3) "KOP")
(= (substr (strcase laagnaam) 1 3) "AAN")
)
(command "_.vplayer" "_freeze" laagnaam "_select" ss "" "")
)
)
)
(defun c:Alt-VP-F ()
(setvar "cmdecho" 0)
(command "_.vplayer" "_freeze" "kop*,aan*" "_select" (ssget "_X" (list '(0 . "VIEWPORT") (cons 410 (getvar "ctab")))) "" "")
)
Okay nu hoef ik inderdaad geen viewport te selecteren, dat is fijner!
Maar op deze manier bevriest hij eerst alle lagen geloof ik, waardoor ik ook mijn xref's en nog veel meer kwijt ben.
Wat eigenlijk fijn zou zijn is, dat eerst alle lagen ontdooit worden, en dat ik daarna de code die we nu hebben kan gebruiken om de lagen te bevriezen die ik niet wil zien.
Zo kan ik dan een paar apparte lisp routines maken voor onze verschillende tabbladen.
Dat zou helemaal super zijn.!!!
Groeten Marcel..
Citaat van: marcelmaas op di 09 02 2010, 22:53:20Maar op deze manier bevriest hij eerst alle lagen geloof ik, waardoor ik ook mijn xref's en nog veel meer kwijt ben.
Nee, dat gebeurt volgens mij niet. Kan het zijn dat de xrefs op een laag kop* of aan* staan? Probeer het probleem beter te analyseren en beter te omschrijven. Dus niet "ik geloof ..."
Aangepaste code:
(defun c:Layer-VP-Freeze ( / ss laag laagnaam)
(setvar "cmdecho" 0)
(setq ss (ssget "_X" (list '(0 . "VIEWPORT") (cons 410 (getvar "ctab")))))
(command "_.vplayer" "_thaw" "*" "_select" ss "" "")
(while (setq laag (tblnext "layer" (not laag))) ; bij eerste keer is (not laag) gelijk aan T
(setq laagnaam (cdr (assoc 2 laag)))
(if
(or
(= (substr (strcase laagnaam) 1 3) "KOP")
(= (substr (strcase laagnaam) 1 3) "AAN")
)
(command "_.vplayer" "_freeze" laagnaam "_select" ss "" "")
)
)
)
(defun c:Alt-VP-F ()
(setvar "cmdecho" 0)
(command
"_.vplayer"
"_thaw" "*" "_select" (ssget "_X" (list '(0 . "VIEWPORT") (cons 410 (getvar "ctab")))) ""
"_freeze" "kop*,aan*" "_select" "_previous" ""
""
)
)
Nou werkt hij zoals ik wilde, superrrrrr.
Bedankt voor de snelle hulp Roy_043 !!!
Groeten Marcel...
Hi,
Ik zit nog met een probleem aangaande deze lisp routine.
De routine bevriest de lagen in de viewport, maar als er in een laag een blok staat, dan bevriest hij die laag niet.
Dat telt ook voor Mtext, die laag bevriest hij ook niet!
Heeft iemand een idee hoe dit komt?
Dit is mijn code:
(defun c:Layer-VP-Freeze-Leidingwerk ( / ss laag laagnaam)
(setvar "cmdecho" 0)
(setq ss (ssget "_X" (list '(0 . "VIEWPORT") (cons 410 (getvar "ctab")))))
(command "_.vplayer" "_thaw" "*" "_select" ss "" "")
(while (setq laag (tblnext "layer" (not laag))) ; bij eerste keer is (not laag) gelijk aan T
(setq laagnaam (cdr (assoc 2 laag)))
(if
(or
(= (substr (strcase laagnaam) 1 13) "HCKP_AANSLUIT")
(= (substr (strcase laagnaam) 1 11) "HCKP_KOPPEL")
(= (substr (strcase laagnaam) 1 9) "HCKP_CODE")
(= (substr (strcase laagnaam) 1 10) "HCKP_KOPER")
(= (substr (strcase laagnaam) 1 12) "HCKP_LEIDING")
(= (substr (strcase laagnaam) 1 10) "HCKP_TEKST")
(= (substr (strcase laagnaam) 1 17) "HCKP_TEKST_TOTAAL")
(= (substr (strcase laagnaam) 1 13) "HH_R_AANSLUIT")
(= (substr (strcase laagnaam) 1 11) "HH_R_KOPPEL")
(= (substr (strcase laagnaam) 1 9) "HH_R_CODE")
(= (substr (strcase laagnaam) 1 10) "HH_R_KOPER")
(= (substr (strcase laagnaam) 1 12) "HH_R_LEIDING")
(= (substr (strcase laagnaam) 1 10) "HH_R_TEKST")
(= (substr (strcase laagnaam) 1 9) "HHR_TEKST")
(= (substr (strcase laagnaam) 1 17) "HH_R_TEKST_TOTAAL")
(= (substr (strcase laagnaam) 1 16) "HHR_TEKST_totaal")
(= (substr (strcase laagnaam) 1 17) "HH_R_TEKST_totaal")
(= (substr (strcase laagnaam) 1 22) "HCKP_PANEELNUMMERTEKST")
(= (substr (strcase laagnaam) 1 7) "HH_R_PLAFOND")
)
(command "_.vplayer" "_freeze" laagnaam "_select" ss "" "")
)
)
)
(defun c:Alt-VP-F ()
(setvar "cmdecho" 0)
(command
"_.vplayer"
"_thaw" "*" "_select" (ssget "_X" (list '(0 . "VIEWPORT") (cons 410 (getvar "ctab")))) ""
"_freeze" "kop*,aan*" "_select" "_previous" ""
""
)
)
Jouw aangepaste lisp werkt in principe. De code bevat wel een aantal onnodige regels. En ook wat onzin. Ik raad jou het volgende aan:
1.
Sorteer de regels met laagnamen alfabetisch op laagnaam. Hierdoor krijg je meer overzicht.
2.
Verwijder alle doublures.
3.
Als je eerst test op "HCKP_TEKST" dan is het vanzelfsprekend overbodig om daarna te testen op "HCKP_TEKST_TOTAAL"
4.
(strcase...) zet de laagnaam om in alleen hoofdletters. Het is dus onzin om daarna te vergelijken met een tekst met kleine letters.
5.
Voer nu zelf een uitgebreidere test uit. Plaats blocks en mtexten op een aantal lagen. Je zult net als ik kunnen vaststellen dat de aanwezigheid van deze elementen het bevriezen van de lagen niet verhindert. Ga vervolgens na waarom je in een bepaald geval een probleem ondervindt. Kan het zijn dat het begin van de betreffende laagnaam niet correspondeert met een regel in de lisp...?
Succes!
Hi,
Ik heb ze op alfabetische volgorde gezet, is inderdaad duidelijker en netter. :vreegoe:
Jij zei:
Verwijder alle doublures. (Bedoel je verwijder alle dubbele?)
Jij zei:
Als je eerst test op "HCKP_TEKST" dan is het vanzelfsprekend overbodig om daarna te testen op "HCKP_TEKST_TOTAAL"
Dit zijn 2 verschillende lagen, en HCKP_TEKST moet bevroren worden, en HCKP_TEKST_TOTAAL dus niet.
Dus ik snap niet helemaal wat je hiermee bedoeld?
Jij zei:
(strcase...) zet de laagnaam om in alleen hoofdletters.
Ik zou dat weg willen laten maar dan werkt het niet goed, waarschijnlijk haal ik dan teveel of te weinig weg.
Zou ik dit weg kunnen halen?: (strcase laagnaam)
De antwoorden op jouw vragen
1.
Ja.
2.
HCKP_TEKST_TOTAAL moet niet bevroren worden??? Dat is vreemd. Op 2 plaatsen geef je aan dat deze laag wel bevroren moet worden.
(= (substr (strcase laagnaam) 1 10) "HCKP_TEKST")
(= (substr (strcase laagnaam) 1 17) "HCKP_TEKST_TOTAAL")
Conclusie: jij snapt de werking van de lisp niet. Zie hieronder.
3.
Als je hoofdletterongevoelig wilt controleren dan moet je bijv.:
(= (substr (strcase laagnaam) 1 10) "HCKP_TEKST")
Vervangen door:
(= (substr laagnaam 1 10) "HCKP_TEKST")
Een korte omschrijving van de werking van de huidige lisp:
- Selecteer alle viewports op de huidige tab
- Ontdooi alle lagen in deze viewports
- Loop alle lagen in de tekening af
- Neem een deel van de naam van elke laag en zet dit om in alleen hoofdletters
- Vergelijk dit deel met een bepaald tekstsegment
- Klopt de vergelijking bevries dan de betreffende laag in de geselecteerde viewports
- Klopt de vergelijking niet voer dan de volgende vergelijking uit, enz.
Volgens mij zoek jij deze lisp (zie code hieronder):
- Selecteer alle viewports op de huidige tab
- Ontdooi alle lagen in deze viewports
- Loop alle lagen in de tekening af
- Vergelijk de volledige laagnaam (hoofdlettergevoelig) met een bepaald tekstsegment
- Klopt de vergelijking bevries dan de betreffende laag in de geselecteerde viewports
- Klopt de vergelijking niet voer dan de volgende vergelijking uit, enz.
(defun c:Layer-VP-Freeze ( / ss laag laagnaam)
(setvar "cmdecho" 0)
(setq ss (ssget "_X" (list '(0 . "VIEWPORT") (cons 410 (getvar "ctab")))))
(command "_.vplayer" "_thaw" "*" "_select" ss "" "")
(while (setq laag (tblnext "layer" (not laag))) ; bij eerste keer is (not laag) gelijk aan T
(setq laagnaam (cdr (assoc 2 laag)))
(if
(or
(= laagnaam "Kop")
(= laagnaam "Aan")
)
(command "_.vplayer" "_freeze" laagnaam "_select" ss "" "")
)
)
)
Ja je hebt gelijk over de code die hier boven genoemd stond, alleen ben ik hier met drie code's bezig voor verschillende layouts.
Ik zat net in een van de layouts waarin wel HCKP_TEKST_TOTAAL zichtbaar moet zijn, en HCKP_TEKST niet!
Vandaar onze miscommunicatie, sorry.
Ik wil inderdaad liever hoofdletter ongevoelig controleren, dus ga ik die andere code proberen.
Ik ga ervan uit dat het dan goed komt.
Alvast bedankt..!!!
groeten Marcel..
Hi Roy,
Met jou laatste code lukt het inderdaad wel om lettergevoelig te selecteren, dat werkt voor ons een stuk makkelijker.
Verder werkt de code zo perfect.
Bedankt voor de hulp.
Groeten Marcel..
Mocht je toch nog geinteresserd zijn in de vba code zie bijgaande links
http://www.contractcaddgroup.com/articles/vport.htm (http://www.contractcaddgroup.com/articles/vport.htm) Code for freezing layer(s) in a PaperSpace Viewport (mview)
http://www.contractcaddgroup.com/articles/pvLayerOn.htm (http://www.contractcaddgroup.com/articles/pvLayerOn.htm)THAW a layer in a PaperSpace ViewPort!
stephan
Bedankt voor die linkjes.
Omdat volgend jaar VBA niet meer in autocad zou werken, ben ik benieuwd of er iemand dit al met VB.Net zou kunnen?
Ikzelf nog niet in ieder geval, en moet me daar eigenlijk mee bezig gaan houden, zoals waarschijnlijk heel veel andere met mij ook.
Dus heeft er iemand iets in VB.Net voor die code, of misschien interessante websites gezien waar je veel kunt lezen over VB.Net?
groeten Marcel..
Marcel,
check de volgende sites:
http://discussion.autodesk.com/forums/forum.jspa?forumID=152 (http://discussion.autodesk.com/forums/forum.jspa?forumID=152) autocad discussie forum
http://through-the-interface.typepad.com/through_the_interface/ (http://through-the-interface.typepad.com/through_the_interface/) blog van Kean Wamsley
http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%20.NET%20Developer's%20Guide/index.html (http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%20.NET%20Developer's%20Guide/index.html) Devellopers guide 2010
http://docs.autodesk.com/ACD/2011/ENU/filesMDG/WS1a9193826455f5ff2566ffd511ff6f8c7ca-4875.htm (http://docs.autodesk.com/ACD/2011/ENU/filesMDG/WS1a9193826455f5ff2566ffd511ff6f8c7ca-4875.htm) Devolppers guide 2011
punt is wel dat veel voorbeelden en code samples in C# zijn. Misschien een idee om je daar in te gaan verdiepen.
Anders even googlen op c# to vb.net
greetz stephan