CADsite forum

AutoCAD => VBA => Topic gestart door: marcelmaas op zo 24 05 2009, 23:07:31

Titel: alle lagen uitzetten (opgelost)
Bericht door: marcelmaas op zo 24 05 2009, 23:07:31
Hi,

Ik ben op zoek naar een commando binnen vba om alle lagen uit te zetten.
Kan iemand mij iets op weg helpen.?


groeten Marcel..
Titel: Re:alle lagen uitzetten
Bericht door: HofCAD op ma 25 05 2009, 10:56:47
Beste Marcel,

Sub LayersOff()
Dim objLayer As AcadLayer
For Each objLayer In ThisDrawing.Layers
objLayer.LayerOn = False
Next
End Sub

Sub LayersOn()
Dim objLayer As AcadLayer
For Each objLayer In ThisDrawing.Layers
objLayer.LayerOn = True
Next
End Sub


Met vriendelijke groet, HofCAD CSI.
Titel: Re:alle lagen uitzetten
Bericht door: marcelmaas op ma 25 05 2009, 11:20:03
Beste Hofcad,

Kun jij mij uitleggen wat er gebeurd bij:
i = i + 1
Ik snap dat er steeds 1 bij i opgeteld word, maar waarom is dat in deze routine nodig ?


groeten Marcel..
Titel: Re:alle lagen uitzetten
Bericht door: HofCAD op ma 25 05 2009, 11:50:10
Beste Marcel,

Sorry, i = i + 1 is niet nodig.
De fout is ontstaan uit slordig  kopiĆ«ren.

Met vriendelijke groet, HofCAD CSI.
Titel: Re:alle lagen uitzetten
Bericht door: marcelmaas op ma 25 05 2009, 11:59:42
Beste Hofcad,

Maakt niet uit, maar dan had ik het goed gezien.

Ik ben aan het proberen om mijn lisp routine leidingen_marcel waarbij jij mij ook geholpen hebt:
http://www.cadsite.be/smf/index.php?topic=3396.0
ook in vba te maken.

Waarschijnlijk heb ik ook hiervoor je hulp nog wel een keer nodig.

groeten Marcel..
Titel: Re:alle lagen uitzetten
Bericht door: marcelmaas op ma 25 05 2009, 20:03:24
Hi,

Ik ben nu zover dat ik alle lagen  kan ontdooien, alle lagen kan unlocken en alle lagen uitzet.

Maar nu moet ik nog bepaalde lagen op slot zetten, en bepaalde lagen weer aan.

Weet iemand hoe ik dat kan doen?

groeten Marcel..
Titel: Re:alle lagen uitzetten
Bericht door: HofCAD op di 26 05 2009, 10:28:12
Beste Marcel,

Hierbij een VBA versie van http://www.cadsite.be/smf/index.php?topic=3396.0
Misschien kan het beter en zit er misschien een fout in, dus testen.
Sub Leiding()
Dim objLayer As AcadLayer
Dim sLayers1 As String
Dim sLayers2 As String
sLayers1 = "0,HH_R_AANVOER,HH_R_RETOUR,hulplijntje,hulplijntje klein,HH_R_LEIDING,HH_R_HULPLIJNTJE_OPP,xref vermogens"
sLayers2 = "HH_R_AANSLUIT,HH_R_LEIDING,hulplijntje,xref vermogens"
Dim vLayers As Variant
For Each objLayer In ThisDrawing.Layers
objLayer.LayerOn = False
objLayer.Lock = False
If objLayer.Name Like "*|*" Then
objLayer.Freeze = False
objLayer.LayerOn = True
End If
Next
vLayers = Split(sLayers1, ",")
For Each objLayer In ThisDrawing.Layers
For Each sLayName In vLayers
       If (objLayer.Name Like sLayName) Then
           objLayer.LayerOn = True
           Exit For
       End If
   Next
Next objLayer
vLayers = Split(sLayers2, ",")
For Each objLayer In ThisDrawing.Layers
For Each sLayName In vLayers
       If (objLayer.Name Like sLayName) Then
           objLayer.Lock = True
           Exit For
       End If
   Next
Next objLayer
End Sub


Met vriendelijke groet, HofCAD CSI.
Titel: Re:alle lagen uitzetten
Bericht door: marcelmaas op di 26 05 2009, 11:36:19
Hi Hofcad,

Het werkt voor een gedeelte wel.
Alleen worden er geen lagen ontdooit vooraf, dus alle lagen die je bevroren hebt staan, die blijven bevroren.
Ook staan de lagen "HH_R_AANSLUIT" en "HH_R_LEIDING" wel op slot, alleen pas na een regen ziet het er in de tekening ook zo uit.
Ik kan ook voor de regen niks op die lagen verwijderen, maar het ziet er uit als of ze niet op slot staan.!


groeten Marcel..

Titel: Re:alle lagen uitzetten
Bericht door: HofCAD op di 26 05 2009, 12:02:05
Citaat van: marcelmaas op di 26 05 2009, 11:36:19
Hi Hofcad,

Het werkt voor een gedeelte wel.
Alleen worden er geen lagen ontdooit vooraf, dus alle lagen die je bevroren hebt staan, die blijven bevroren.
Ook staan de lagen "HH_R_AANSLUIT" en "HH_R_LEIDING" wel op slot, alleen pas na een regen ziet het er in de tekening ook zo uit.
Ik kan ook voor de regen niks op die lagen verwijderen, maar het ziet er uit als of ze niet op slot staan.!


groeten Marcel..



Beste Marcel,

Ik heb geschreven dat het een VBA versie van een Lisp programma is,
en in het Lisp programma worden ook alleen de lagen van de Xref's
ontdooid.

Met vriendelijke groet, HofCAD CSI.
Titel: Re:alle lagen uitzetten
Bericht door: marcelmaas op di 26 05 2009, 12:11:07
Beste Hofcad,

Als ik de lisp routine gebruik worden toch echt alle lagen ontdooit.
En dat komt volgens mij door deze regel in het programma:
(command "_-LAYER" "_T" "*|*" "_ON" "*|*" "")

Is het mogelijk om ook zoiets te doen met vba ?

groeten Marcel..
Titel: Re:alle lagen uitzetten
Bericht door: HofCAD op di 26 05 2009, 13:58:39
Citaat van: marcelmaas op di 26 05 2009, 12:11:07
Beste Hofcad,

Als ik de lisp routine gebruik worden toch echt alle lagen ontdooit.
En dat komt volgens mij door deze regel in het programma:
(command "_-LAYER" "_T" "*|*" "_ON" "*|*" "")

Is het mogelijk om ook zoiets te doen met vba ?

groeten Marcel..

Beste Marcel,

In de regel (command "_-LAYER" "_T" "*|*" "_ON" "*|*" "")
staat een sterretje(*) voor en achter het pipingsymbol(|).
Dat betekent dat alleen namen met een pipingsymbol ontdooit
en aangezet worden.
Je bewering "worden toch echt alle lagen ontdooit." is dus niet waar,
probeer het maar eens uit.
Paste  de regel maar eens op de commando regel in een tekening met Xref's
waarbij de lagen van de Xref's zijn bevroren en ook de andere lagen.
Zie ook http://www.cadsite.be/smf/index.php?topic=3342.0, daar heb je
nog na de uitleg gezegd: Bedankt voor de info.
Als je alle lagen wilt ontdooien en aanzetten, dan gaat het als volgt:
For Each objLayer In ThisDrawing.Layers
objLayer.Freeze = False
objLayer.LayerOn = True
'objLayer.Lock = False
Next


Met vriendelijke groet, HofCAD CSI.
Titel: Re:alle lagen uitzetten
Bericht door: marcelmaas op di 26 05 2009, 14:36:47
Beste Hofcad,

Ik heb bij het lisp programma nooit geprobeerd om lagen te bevriezen waarin een xref staat.
Dit omdat ikzelf bijna nooit geen lagen bevroren heb staan.
Maar als ik nu lagen bevries waarin een xref staat, en dan het lisp programma gebruik, dan blijven de lagen bevroren.
Hij ontdooit inderdaad alleen de lagen waarin het pipingsymbol staat.
Ik dacht dat die regel juist bedoelt was om de xref lagen weer te laten verschijnen ?

Ik zou eigenlijk alle lagen willen ontdooien, alle lagen uitzetten, alle lagen willen unlocken en daarna sommige lagen weer aan, en sommige lagen weer locken.

Maar het probleem met dit lisp programma was dacht ik dat we dan de xrefs niet meer terug getoverd kregen, ook niet na een regen!!

Misschien is dat met vba wel hetzelfde probleem ?

Misschien dat jij weet of we dit kunnen oplossen ?

groeten Marcel..
Titel: Re:alle lagen uitzetten
Bericht door: HofCAD op di 26 05 2009, 15:53:03
Citaat van: marcelmaas op di 26 05 2009, 14:36:47
Beste Hofcad,

Ik heb bij het lisp programma nooit geprobeerd om lagen te bevriezen waarin een xref staat.
Dit omdat ikzelf bijna nooit geen lagen bevroren heb staan.
Maar als ik nu lagen bevries waarin een xref staat, en dan het lisp programma gebruik, dan blijven de lagen bevroren.
Hij ontdooit inderdaad alleen de lagen waarin het pipingsymbol staat.
Ik dacht dat die regel juist bedoelt was om de xref lagen weer te laten verschijnen ?

Ik zou eigenlijk alle lagen willen ontdooien, alle lagen uitzetten, alle lagen willen unlocken en daarna sommige lagen weer aan, en sommige lagen weer locken.

Maar het probleem met dit lisp programma was dacht ik dat we dan de xrefs niet meer terug getoverd kregen, ook niet na een regen!!

Misschien is dat met vba wel hetzelfde probleem ?

Misschien dat jij weet of we dit kunnen oplossen ?

groeten Marcel..

Beste Marcel,

Ik vind dit erg raar:
Ik heb bij het lisp programma nooit geprobeerd om lagen te bevriezen waarin een xref staat.
gezien je vragen en commentaar  http://www.cadsite.be/smf/index.php?topic=3396.0
en http://www.cadsite.be/smf/index.php?topic=3342.0
In http://www.cadsite.be/smf/index.php?topic=3342.0 heb je bijv. geschreven:
Maar het zit hem echt in die xrefs, want ik als ik in de 0 laag iets teken dan wordt dat wel zichtbaar na het starten van de routine.

Maar je bedoelt dus nu waarschijnlijk:
Sub Leiding2()
Dim objLayer As AcadLayer
Dim sLayers1 As String
Dim sLayers2 As String
sLayers1 = "0,HH_R_AANVOER,HH_R_RETOUR,hulplijntje,hulplijntje klein,HH_R_LEIDING,HH_R_HULPLIJNTJE_OPP,xref vermogens"
sLayers2 = "HH_R_AANSLUIT,HH_R_LEIDING,hulplijntje,xref vermogens"
Dim vLayers As Variant
For Each objLayer In ThisDrawing.Layers
'Alle lagen ontdooien, uitzetten en van slot af
If (ThisDrawing.ActiveLayer.Name <> objLayer.Name) Then objLayer.Freeze = False
objLayer.LayerOn = False
objLayer.Lock = False
Next
vLayers = Split(sLayers1, ",")
For Each objLayer In ThisDrawing.Layers
For Each sLayName In vLayers
        If (objLayer.Name Like sLayName) Then
            objLayer.LayerOn = True
            Exit For
        End If
    Next
Next objLayer
vLayers = Split(sLayers2, ",")
For Each objLayer In ThisDrawing.Layers
For Each sLayName In vLayers
        If (objLayer.Name Like sLayName) Then
            objLayer.Lock = True
            Exit For
        End If
    Next
Next objLayer
End Sub


Met vriendelijke groet, HofCAD CSI.
Titel: Re:alle lagen uitzetten
Bericht door: marcelmaas op di 26 05 2009, 16:26:32
Beste Hofcad,

Sorry als ik misschien dingen door elkaar haal.
Maar met jou laatste code werkt het lagen ontdooien goed. (dus dat is goed)
Waar het probleem zit is dat bij het uitzetten van de lagen je ook de lagen uitzet waarin de xrefs zitten.
Het is namelijk zo dat je die lagen in de code weer terug aanzet, en dan zouden de xrefs weer zichtbaar moeten worden.
En dat is nu precies het probleem, dat doen ze dus niet.
Als ik zelf even iets teken op een laag van een xref, en daarna mijn programma start dan word alles wat ik dus net op die laag van een xref heb getekend wel weergegeven, maar de xref zelf niet. (ook niet na een "regen")

Ik hoop dat je nu snapt wat ik bedoel ?

ps. ik heb de lagen wat overzichtelijker hernoemd.
zie hier:
sLayers1 = "0,HH_R_AANVOER,HH_R_RETOUR,HULPLIJNTJE_OPP,HH_R_LEIDING,XREF_VERMOGENS"
sLayers2 = "0,HH_R_AANSLUIT,HH_R_LEIDING,HULPLIJNTJE_OPP,XREF_VERMOGENS"

groeten Marcel..
Titel: Re:alle lagen uitzetten
Bericht door: HofCAD op di 26 05 2009, 17:59:33
Beste Marcel,

Als ik in een tekening de Xref's op Layer1 heb ingevoegd en ik heb alle lagen uit
en gelockt staan en alle lagen behalve de aktieve laag staan bevroren,
dan is bij mij als ik sub Leiding3 gebruik het resultaat:
-Alle lagen zijn ontdooid.
-De lagen 0,HH_R_AANVOER,HH_R_RETOUR,HULPLIJNTJE_OPP,HH_R_LEIDING,XREF_VERMOGENS
staan aan en ook de lagen uit de Xref's(*|*) staan aan.
De lagen Layer1, HH_R_AANSLUIT (en evt. Defpoints) staan uit.
-De lagen 0,HH_R_AANSLUIT,HH_R_LEIDING,HULPLIJNTJE_OPP,XREF_VERMOGENS zijn gelockt
-De Xref's op Layer1 zijn zichtbaar, maar wat getekend is op Layer1 is onzichtbaar.
Sub Leiding3()
Dim objLayer As AcadLayer
Dim sLayers1 As String
Dim sLayers2 As String
sLayers1 = "0,HH_R_AANVOER,HH_R_RETOUR,HULPLIJNTJE_OPP,HH_R_LEIDING,XREF_VERMOGENS"
sLayers2 = "0,HH_R_AANSLUIT,HH_R_LEIDING,HULPLIJNTJE_OPP,XREF_VERMOGENS"
Dim vLayers As Variant
For Each objLayer In ThisDrawing.Layers
'Alle lagen ontdooien, uitzetten en van slot af
If (ThisDrawing.ActiveLayer.Name <> objLayer.Name) Then objLayer.Freeze = False
objLayer.LayerOn = False
objLayer.Lock = False
Next
'Lagen die door Xref's gemaakt worden(*|*) aan zetten
For Each objLayer In ThisDrawing.Layers
If objLayer.Name Like "*|*" Then
objLayer.LayerOn = True
End If
Next
' 6 speciale lagen aanzetten
vLayers = Split(sLayers1, ",")
For Each objLayer In ThisDrawing.Layers
For Each sLayName In vLayers
       If (objLayer.Name Like sLayName) Then
           objLayer.LayerOn = True
           Exit For
       End If
   Next
Next objLayer
' 5 speciale lagen locken
vLayers = Split(sLayers2, ",")
For Each objLayer In ThisDrawing.Layers
For Each sLayName In vLayers
       If (objLayer.Name Like sLayName) Then
           objLayer.Lock = True
           Exit For
       End If
   Next
Next objLayer
ThisDrawing.Regen acAllViewports
'ThisDrawing.Regen acActiveViewport
End Sub

Het vreemde is dus, dat bij mij de Xref's in AutoCAD 2008 wel zichtbaar zijn en dat er meestal
geen REGEN nodig is voor weergave.
Verder zeg je o.a.: Als ik zelf even iets teken op een laag van een xref, en daarna mijn programma start
dan word alles wat ik dus net op die laag van een xref heb getekend wel weergegeven,
maar de xref zelf niet. (ook niet na een "regen").
Als je de laag waarop de Xref is ingevoegd bedoeld, dan is mijn bevinding precies het omgekeerde.

Met vriendelijke groet, HofCAD CSI.

Titel: Re:alle lagen uitzetten
Bericht door: marcelmaas op di 26 05 2009, 19:03:39
Beste Hofcad,

Sub leiding3 () werkt bij mij perfect.
Nu werkt het ook zonder REGEN.

Ik vind alleen dat het zonder REGEN qua snelheid wat tegenvalt, maar misschien ben ik nu wel weer aan't zeuren.  :)

Het werkt in ieder geval goed, en altijd nog veel sneller dan als je alle lagen handmatig moet gaan instellen.

Heel erg bedankt weer voor de hulp..!!!  :vreegoe: :vreegoe: :vreegoe:

groeten Marcel..