CADsite forum

AutoCAD => VBA => Topic gestart door: marcelmaas op di 09 02 2010, 16:08:57

Titel: lagen bevriezen in viewports (opgelost)
Bericht door: marcelmaas op di 09 02 2010, 16:08:57
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..
Titel: Re:lagen bevriezen in viewports
Bericht door: JMD op di 09 02 2010, 16:37:15
Dag Mrcel,

je zult denk ik even beter moeten omschrijven wat je wilt...
Gaat het altijd om dezelfde lagen, enz.

Groet JMD
Titel: Re:lagen bevriezen in viewports
Bericht door: cetacad op di 09 02 2010, 17:16:48
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
Titel: Re:lagen bevriezen in viewports
Bericht door: roy_043 op di 09 02 2010, 17:45:33
@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 "" "") ...
Titel: Re:lagen bevriezen in viewports
Bericht door: marcelmaas op di 09 02 2010, 17:50:37
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..
Titel: Re:lagen bevriezen in viewports
Bericht door: marcelmaas op di 09 02 2010, 18:53:29
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..
Titel: Re:lagen bevriezen in viewports
Bericht door: roy_043 op di 09 02 2010, 19:53:19
@marcelmaas: Om verwarring te voorkomen: post jouw code.
Titel: Re:lagen bevriezen in viewports
Bericht door: marcelmaas op di 09 02 2010, 19:57:28
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
Titel: Re:lagen bevriezen in viewports
Bericht door: roy_043 op di 09 02 2010, 20:36:09
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?
Titel: Re:lagen bevriezen in viewports
Bericht door: marcelmaas op di 09 02 2010, 20:57:59
Mijn prompts zijn:

?/color/Ltype/Lweight/Freeze/Thaw/Reset/Newfrz/Vpvisdflt

groeten Marcel..
Titel: Re:lagen bevriezen in viewports
Bericht door: roy_043 op di 09 02 2010, 21:09:03
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.
Titel: Re:lagen bevriezen in viewports
Bericht door: marcelmaas op di 09 02 2010, 21:39:23
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..
Titel: Re:lagen bevriezen in viewports
Bericht door: roy_043 op di 09 02 2010, 22:29:49
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")))) "" "")
)
Titel: Re:lagen bevriezen in viewports
Bericht door: marcelmaas op di 09 02 2010, 22:53:20
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..
Titel: Re:lagen bevriezen in viewports
Bericht door: roy_043 op di 09 02 2010, 23:16:19
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" ""
    ""
  )
)

Titel: Re:lagen bevriezen in viewports
Bericht door: marcelmaas op wo 10 02 2010, 00:08:39
Nou werkt hij zoals ik wilde, superrrrrr.
Bedankt voor de snelle hulp Roy_043 !!!

Groeten Marcel...
Titel: Re:lagen bevriezen in viewports
Bericht door: marcelmaas op zo 28 02 2010, 14:41:51
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" ""
   ""
 )
)
Titel: Re:lagen bevriezen in viewports
Bericht door: roy_043 op zo 28 02 2010, 18:09:01
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!
Titel: Re:lagen bevriezen in viewports
Bericht door: marcelmaas op zo 28 02 2010, 20:54:16
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)


Titel: Re:lagen bevriezen in viewports
Bericht door: roy_043 op zo 28 02 2010, 21:53:19
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:

Volgens mij zoek jij deze lisp (zie code hieronder):

(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 "" "")
    )
  )
)
Titel: Re:lagen bevriezen in viewports
Bericht door: marcelmaas op zo 28 02 2010, 23:35:50
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..
Titel: Re:lagen bevriezen in viewports
Bericht door: marcelmaas op ma 01 03 2010, 07:15:39
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..
Titel: Re:lagen bevriezen in viewports (opgelost)
Bericht door: sschevers op vr 09 04 2010, 09:03:33
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
Titel: Re:lagen bevriezen in viewports (opgelost)
Bericht door: marcelmaas op vr 09 04 2010, 10:49:29
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..
Titel: Re:lagen bevriezen in viewports (opgelost)
Bericht door: sschevers op vr 09 04 2010, 10:56:18
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