Diskuzní fórum a databáze tipů a utilit pro AutoCAD, Inventor, Revit a další produkty Autodesk - od firmy Arkance Systems [www.cadforum.cz]
CZ | SK | EN | DE
Přihlášení
či registrace
   právě nás čte: 5910 
eLearning školení Základy Autodesk Revit
RSS kanál - CAD tipy RSS tipy
RSS diskuze

Diskuze Diskuzní fórum, poradna

 

NápovědaCAD diskuze, rady, výměna zkušeností

 
CAD Fórum - Homepage Veřejné diskuzní fórum k CAD aplikacím - ptejte se na libovolné otázky týkající se oboru CAx, podělte se o vaše znalosti a zkušenosti s programy AutoCAD, Inventor, Revit, Fusion 360, 3ds Max a s dalšími CAD aplikacemi. Zaregistrujte se nebo se přihlašte a zašlete váš příspěvek do odpovídajícího fóra. Viz další informace o CAD Fóru. Nechcete se registrovat? Zeptejte se v naší Facebook poradně.
Fórum nenahrazuje technický support firmy Arkance Systems (CAD Studio) - přímá podpora pro zákazníky funguje na helpdesk.cadstudio.cz
  FAQ FAQ  Prohledat fórum   Události   Registrovat Registrovat  Přihlásit Přihlásit

Téma uzavřenoVýběrová množina přes VBA

 Odpovědět Odpovědět archiv
Autor
Radek Pícha Zobrazit panel
Diskutér
Diskutér

Přihlášen: 04.říj.2004
Lokalita: Czech Republic
Používám:
Inventor
Stav: Offline
Bodů: 66
Přímý odkaz na tuto zprávu Téma: Výběrová množina přes VBA
    Zasláno: 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 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)

ITS BENDA s.r.o.
Zpět nahoru
Radek Pícha Zobrazit panel
Diskutér
Diskutér

Přihlášen: 04.říj.2004
Lokalita: Czech Republic
Používám:
Inventor
Stav: Offline
Bodů: 66
Přímý odkaz na tuto zprávu Zasláno: 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)

ITS BENDA s.r.o.
Zpět nahoru
Radek Pícha Zobrazit panel
Diskutér
Diskutér

Přihlášen: 04.říj.2004
Lokalita: Czech Republic
Používám:
Inventor
Stav: Offline
Bodů: 66
Přímý odkaz na tuto zprávu Zasláno: 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)

ITS BENDA s.r.o.
Zpět nahoru
Chop Zobrazit panel
Diskutér
Diskutér

Přihlášen: 13.srp.2005
Lokalita: Czech Republic
Stav: Offline
Bodů: 64
Přímý odkaz na tuto zprávu Zasláno: 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

Zpět nahoru
Radek Pícha Zobrazit panel
Diskutér
Diskutér

Přihlášen: 04.říj.2004
Lokalita: Czech Republic
Používám:
Inventor
Stav: Offline
Bodů: 66
Přímý odkaz na tuto zprávu Zasláno: 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)

ITS BENDA s.r.o.
Zpět nahoru
Radek Pícha Zobrazit panel
Diskutér
Diskutér

Přihlášen: 04.říj.2004
Lokalita: Czech Republic
Používám:
Inventor
Stav: Offline
Bodů: 66
Přímý odkaz na tuto zprávu Zasláno: 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)

ITS BENDA s.r.o.
Zpět nahoru
Chop Zobrazit panel
Diskutér
Diskutér

Přihlášen: 13.srp.2005
Lokalita: Czech Republic
Stav: Offline
Bodů: 64
Přímý odkaz na tuto zprávu Zasláno: 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

Zpět nahoru
Radek Pícha Zobrazit panel
Diskutér
Diskutér

Přihlášen: 04.říj.2004
Lokalita: Czech Republic
Používám:
Inventor
Stav: Offline
Bodů: 66
Přímý odkaz na tuto zprávu Zasláno: 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)

ITS BENDA s.r.o.
Zpět nahoru
Radek Pícha Zobrazit panel
Diskutér
Diskutér

Přihlášen: 04.říj.2004
Lokalita: Czech Republic
Používám:
Inventor
Stav: Offline
Bodů: 66
Přímý odkaz na tuto zprávu Zasláno: 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)

ITS BENDA s.r.o.
Zpět nahoru
Chop Zobrazit panel
Diskutér
Diskutér

Přihlášen: 13.srp.2005
Lokalita: Czech Republic
Stav: Offline
Bodů: 64
Přímý odkaz na tuto zprávu Zasláno: 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

Zpět nahoru
Greenhorn Zobrazit panel
Nováček
Nováček

Přihlášen: 28.bře.2006
Stav: Offline
Bodů: 6
Přímý odkaz na tuto zprávu Zasláno: 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 ?
Zpět nahoru
Chop Zobrazit panel
Diskutér
Diskutér

Přihlášen: 13.srp.2005
Lokalita: Czech Republic
Stav: Offline
Bodů: 64
Přímý odkaz na tuto zprávu Zasláno: 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

Zpět nahoru
Greenhorn Zobrazit panel
Nováček
Nováček

Přihlášen: 28.bře.2006
Stav: Offline
Bodů: 6
Přímý odkaz na tuto zprávu Zasláno: 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.
Zpět nahoru
Chop Zobrazit panel
Diskutér
Diskutér

Přihlášen: 13.srp.2005
Lokalita: Czech Republic
Stav: Offline
Bodů: 64
Přímý odkaz na tuto zprávu Zasláno: 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

Zpět nahoru
Greenhorn Zobrazit panel
Nováček
Nováček

Přihlášen: 28.bře.2006
Stav: Offline
Bodů: 6
Přímý odkaz na tuto zprávu Zasláno: 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.

Zpět nahoru

Pro technickou podporu CAD
kontaktujte Helpdesk

Příbuzné CAD tipy:
Tip 3060:VIPTrik na rychlý výběr předchozí výběrové množiny v Revitu.
Tip 1395:Jak snadno zneviditelnit všechny normalizované součástky v sestavě?
Tip 8288:Vytvoření výběrové množiny z výsledků NAJDI.
Tip 7670:Najdi a vyber bloky s daným atributem.
Tip 3485:Rychlý výběr více objektů v Revitu.
Tip 10616:Uložené výběrové množiny pro snazší výběr objektů v Navisworks.


 Odpovědět Odpovědět

Přejít na fórum Oprávnění fóra Zobrazit panel



Stránka byla vygenerována za 1,352 sekund.