Vytisknout stránku | Zavřít okno

Výběrová množina přes VBA

Vytištěno z: CAD Fórum
Kategorie: Autodesk - stavebnictví, strojírenství, CAD/GIS
Název fóra: CAD programování
Popis fóra: Otázky programování - nadstavby a utility pro CAD a GIS aplikace Autodesk (VBA, AutoLISP, ARX/C++, .Net, JavaScript, Python, MEL...)
URL: https://www.cadforum.cz/forum/forum_posts.asp?TID=2261
Datum vytištění: 11.čvc.2026 v 01:15


Téma: Výběrová množina přes VBA
Odeslal: Radek Pícha
Předmět: Výběrová množina přes VBA
Datum odeslání: 07.bře.2006 v 06:41
Dobrý den,
potřebuji přidat entitu do výběrové množiny oSS2 a nedaří se mi to.
Vycházel jsem z lekcí na ../cadforum/tema.asp - http://www.cadforum.cz/cadforum/tema.asp
Zde je moje procedura:

'pokusy s tvorbou sSS2 jsou za ' protože nefungují
'lze vytvořit filtr tak, že vybere bloky se jménem "RADEKROZ"?

Sub VyberRadkyKusovniku()
    Dim oSS As AcadSelectionSet
    'Dim oSS2 As AcadSelectionSet
    Dim oBlok As AcadEntity
    Dim iFilterCode(0) As Integer
    Dim vFilterValue(0) As Variant
    Dim i As Integer
    Dim Dotaz As String
    'Dim ssobjs As AcadEntity
   
    'Errorhandler (vymaže případně již existující výběrovou množinu)
    On Error Resume Next
    Application.ActiveDocument.SelectionSets("Bloky").Delete
    Application.ActiveDocument.SelectionSets("Radky").Delete
    On Error GoTo 0
 
    'vytvoř výběrovou množinu nazvanou "Bloky"
    Set oSS = Application.ActiveDocument.SelectionSets.Add("Bloky")
    'Set oSS2 = Application.ActiveDocument.SelectionSets.Add("Radky")
    iFilterCode(0) = 0: vFilterValue(0) = "insert"
    'oSS.SelectOnScreen iFilterCode, vFilterValue 'pouze vybrané bloky
    oSS.Select acSelectionSetAll, , , iFilterCode, vFilterValue 'všechny bloky
    i = 0
    If oSS.Count Then
        For Each oBlok In oSS 'zpracovat všechny entity výběrové množiny "Bloky"
         &nbs p;  With oBlok
         &nbs p;      If UCase(.Name) = "RADEKROZ" Then
         &nbs p;          'oSS2.AddObject i, oBlok
         &nbs p;          'Set ssobjs(i) = oBlok
         &nbs p;          i = i + 1
         &nbs p;          End If
         &nbs p;      End With
         &nbs p;      Next oBlok
         &nbs p;      'oSS2.AddItems ssobjs

         &nbs p;      Dotaz = MsgBox("Ve výkrese je " + Str(i) + " řádků rozpisky." + Chr(13) + _
         &nbs p;          "Chceš je nyní exportovat?", 4)
         &nbs p;      If Dotaz = vbYes Then
         &nbs p;          MsgBox "Ještě to nemám, nyní bych chtěl exportovat a vymazat bloky z oSS2 ..."
         &nbs p;          End If
         &nbs p;  End If
End Sub



-------------
<font color=BLUE>Ing. Radek Pícha[/COLOR] (konstruktér)

http://www.itsbenda.cz" rel="nofollow - ITS BENDA s.r.o.



Odpovědi:
Odeslal: Radek Pícha
Datum odeslání: 07.bře.2006 v 16:50
Omlouvám se, zapoměl jsem napsat dotaz:
Jak lze přidat entitu oBlok do výběrové množiny oSS2?



-------------
<font color=BLUE>Ing. Radek Pícha[/COLOR] (konstruktér)

http://www.itsbenda.cz" rel="nofollow - ITS BENDA s.r.o.


Odeslal: Radek Pícha
Datum odeslání: 14.bře.2006 v 13:36
Opravdu nikdo neví, jak pracovat s výběrovými množinami ve VBA?
Věděl by někdo, jak napsat filtr, aby se vytvořila výběrová množina bloků s určitým názvem?

Když v:
oSS.Select acSelectionSetAll, , , iFilterCode, vFilterValue
použiju:
vFilterValue(0) = "insert"
Vloží se do
oSS všechny bloky.

Moc děkuji za odpověď.


-------------
<font color=BLUE>Ing. Radek Pícha[/COLOR] (konstruktér)

http://www.itsbenda.cz" rel="nofollow - ITS BENDA s.r.o.


Odeslal: Chop
Datum odeslání: 17.bře.2006 v 08:19

Zkuste vyzkoušet:

Sub VybirejVesele()

Dim pomset As AcadSelectionSet
Dim FiltrTyp(0) As Integer
Dim FiltrData(0) As Variant

For Each pomset In ThisDrawing.SelectionSets
    If pomset.Name = "ss1" Then
        pomset.Delete 'čistě pro jistotu, pokud po nějakém zhroucení ještě výběr ss1 existuje
        Exit For
    End If
Next pomset
    Set pomset = ThisDrawing.SelectionSets.Add("ss1") 'čistý výběr
   
    FiltrTyp(0) = 2 '<-dle DXF reference
    FiltrData(0) = "RADEKROZ" 'možné hodnoty se řídí dle DXF reference (viz. Helpy)
                             
    pomset.SelectOnScreen FiltrTyp, FiltrData
   
End Sub



Odeslal: Radek Pícha
Datum odeslání: 23.bře.2006 v 15:07
Velmi děkuji, stačilo nakopnout!
Nechápal jsem, co je "FilterCode". Příklad mi pomohl, již studuji skupinové kódy dxf z programátorské příručky.

-------------
<font color=BLUE>Ing. Radek Pícha[/COLOR] (konstruktér)

http://www.itsbenda.cz" rel="nofollow - ITS BENDA s.r.o.


Odeslal: Radek Pícha
Datum odeslání: 23.bře.2006 v 15:49
A jak zadám součin filtrů? Například, když chci vybrat všechny bloky, které se jmenují "RADEKROZ" a jsou vloženy v hladině "RAZITKO"?

    Set oSS = Application.ActiveDocument.SelectionSets.Add("Bloky")
    FiltrTyp(0) = 0
    FiltrData(0) = "insert"
    oSS.Select acSelectionSetAll, , , FiltrTyp, FiltrData 'všechny bloky

    Set oSS = Application.ActiveDocument.SelectionSets.Add("RADEKROZ")
    FiltrTyp(0) = 2
    FiltrData(0) = "RADEKROZ"
    oSS.Select acSelectionSetAll, , , FiltrTyp, FiltrData 'entity zvané "RADEKROZ"

    Set oSS = Application.ActiveDocument.SelectionSets.Add("RAZITKO")
    FiltrTyp(0) = 8
    FiltrData(0) = "RAZITKO"
    oSS.Select acSelectionSetAll, , , FiltrTyp, FiltrData 'entity v hladině "RAZITKO"

    Set oSS = Application.ActiveDocument.SelectionSets.Add("Bloky2")
    FiltrTyp(0) = ???
    FiltrData(0) = ???
    'všechny bloky "RADEKROZ" v hladině "RAZITKO"
    oSS.Select acSelectionSetAll, , , FiltrTyp, FiltrData



-------------
<font color=BLUE>Ing. Radek Pícha[/COLOR] (konstruktér)

http://www.itsbenda.cz" rel="nofollow - ITS BENDA s.r.o.


Odeslal: Chop
Datum odeslání: 27.bře.2006 v 05:45

Samozřejmě podmínky lze libovolně kombinovat, ale k vyhodnocení musí dojít najednou. Pak to má vypadat takhle:

Dim FiltrTyp(2) as integer ' podle počtu podmínkových "dvojic" od 0 tj. 0,1,2…
Dim FiltrData(2) as Variant

FiltrTyp(0)=0
FiltrData(0) = "insert"
FiltrTyp(1)=2
FiltrData(1) = "RADEKROZ"
FiltrTyp(2)=8
FiltrData(2) = "RAZITKO"

oSS.Select acSelectionSetAll, , , FiltrTyp, FiltrData



Odeslal: Radek Pícha
Datum odeslání: 28.bře.2006 v 13:30
Díky, funguje. Problém jsem měl právě v Dim ...(2)

-------------
<font color=BLUE>Ing. Radek Pícha[/COLOR] (konstruktér)

http://www.itsbenda.cz" rel="nofollow - ITS BENDA s.r.o.


Odeslal: Radek Pícha
Datum odeslání: 30.bře.2006 v 09:59
Jak můžu procházet po jednotlivých entitách výběrové množiny?

-------------
<font color=BLUE>Ing. Radek Pícha[/COLOR] (konstruktér)

http://www.itsbenda.cz" rel="nofollow - ITS BENDA s.r.o.


Odeslal: Chop
Datum odeslání: 30.bře.2006 v 10:58

Pokud máte z předchozích příkladů nadefinován výběr oSS, tak by to mělo fungovat takhle:

Dim oobj As Object
For Each oobj In oSS
  MsgBox oobj.ObjectName 'takhle projdete všechny objekty ve výběru a zjistíte jejich typ a podle typu se rozhodnete, co dál
Next oobj



Odeslal: Greenhorn
Datum odeslání: 30.bře.2006 v 19:19
Zdravim,

mam problem s určením mena entity resp. bloku

pre zistenie mena objektu použijem
ThisDrawing.Blocks.Item(i).Name

toto ide bez problemov

problem nastane keď chcem určiť meno entity pri výbere z množiny objektou
cez ent = ThisDrawing.ModelSpace.Item(j)
následne použijem meno = ent.Name

Pri použití .Name dostanem chybovú hlášku o tom že daný
objekt nepovoľuje túto možnosť

Možno je problém vo verzii autocadu (používam Autocad 2002)
Vie mi niekto poradiť ako určiť meno entity resp objektu
pri použití ModelSpace ?


Odeslal: Chop
Datum odeslání: 31.bře.2006 v 06:55

Blok skutečně má svoje jméno a tak je možno je načíst.

Ve výběrové množině ale nemusí být jen bloky a objekt AcadEntity nebo AcadObject jméno (Name) tudíž nepodporuje.

Musíte procházet množinu po entitě, zjistit její Object.Name a podle toho pak zpracovat např. jen bloky a těm již Name přečíst lze.

Dim oobj As Object
For Each oobj In ThisDrawing.ModelSpace
  MsgBox "Tato entita je typu: " & oobj.ObjectName
    If oobj.ObjectName = "AcDbBlockReference" Then
        Set blok = oobj
        MsgBox "Jméno bloku je: " & blok.Name
    End If
Next oobj



Odeslal: Greenhorn
Datum odeslání: 06.dub.2006 v 08:26
Ešte Jedna otázočka,

Autocad 2002 nepodporuje vlastnosť krivky "polyline.length"

Potreboval by som zistiť dĺžku krivky bez rozloženia objektu
na výkrese.

Skúšal som rozložiť objekt pomocou .explode ale neviem prísť
na spôsob určenia vlastnosti vráteného poľa objektou.


Odeslal: Chop
Datum odeslání: 12.dub.2006 v 08:26

2002 již nemám, nemohu ověřit. Skutečně Vám nefunguje ani toto?

Dim oobj As Object
Dim bloktest As AcadLWPolyline
For Each oobj In ThisDrawing.ModelSpace
  MsgBox "Tato entita je typu: " & oobj.ObjectName
    If oobj.ObjectName = "AcDbPolyline" Then
        Set bloktest = oobj
        MsgBox "Délka křivky je: " & bloktest.Length
    End If
Next oobj



Odeslal: Greenhorn
Datum odeslání: 19.dub.2006 v 14:46
Ďakujem za odpoveď, medzičasom som problém vyriešil trochu iným spôsobom
váš je o niečo elegantnejší tak keď bude trochu času vyskúšam.




Vytisknout stránku | Zavřít okno