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.
|
|