Autor |
Najít Téma Možnosti tématu
|
johny
TOP uživatel
Přihlášen: 24.led.2006
Lokalita: ČR (JM)
Používám: C3D 2024
Stav: Offline
Bodů: 1741
|
Téma: Vložení dyn.bliku s parametrem Zasláno: 18.pro.2006 v 13:35 |
Zdravím,
hledám nějakou funkci, nebo nějaký způsob, jak vložit do výkresu dynamický blok s definovaným parametrem (viditelnost, délka lineárního protažení, bod apod.).. Asi nejlepsi by bylo kdyby se u tech parameteru někde zapla vlastnost "zeptej se při vložení"... a pak to fungovalo podobně jako u atributu... Vim, že něco takoveho jde přes palety, ale potřeboval bych to z přikazoveho řadku, abych to mohl změnit programkem....
dik.
|
 |
Chop
Diskutér
Přihlášen: 13.srp.2005
Lokalita: Czech Republic
Stav: Offline
Bodů: 64
|
Zasláno: 20.pro.2006 v 14:10 |
Je to podobné jako přístup k atributům bloku. Vyzkoušejte toto makro. Využívá staženého bloku z katalogu Cad Fóra "Horizontální_formáty.dwg" (děkuji autorovi). Tento blok má pouze možnost změny typu ráměčku (visibility) a pokud je vložen "obyčejně", tak se vloží jako A4. Tohle jej vloží jako "A0" …
Sub Dynblk() Dim vklbod As Variant Dim novyblk As AcadBlockReference vklbod = ThisDrawing.Utility.GetPoint(, "Vyberte místo pro umístění bloku") Set novyblk = ThisDrawing.ModelSpace.InsertBlock(vklbod, "Horizontální_formáty. dwg", 1, 1, 1, 0) If novyblk.IsDynamicBlock Then Dim vlastnostinovehoblk As Variant Dim viditelnost As AcadDynamicBlockReferenceProperty vlastnostinovehoblk = novyblk.GetDynamicBlockProperties For j = LBound(vlastnostinovehoblk) To UBound(vlastnostinovehoblk) 'prolezeme všechny vlastnosti Select Case vlastnostinovehoblk(j).PropertyName Case "Visibility" vlastnostinovehoblk(j).Value = "A0" 'tady je nastavení příslušné vlastnosti End Select Next j End If novyblk.Update End Sub
|
Civil 2007
|
 |
johny
TOP uživatel
Přihlášen: 24.led.2006
Lokalita: ČR (JM)
Používám: C3D 2024
Stav: Offline
Bodů: 1741
|
Zasláno: 20.pro.2006 v 15:43 |
Diky, ale pri spusteni me to dela nejakou chybu... Bohuzel Visual Basicu nerozumim, svy programky delam v AutoLispu. Jde vubec podobna funkce udelat v AutoLisu? J
|
 |
Chop
Diskutér
Přihlášen: 13.srp.2005
Lokalita: Czech Republic
Stav: Offline
Bodů: 64
|
Zasláno: 20.pro.2006 v 19:15 |
Potřeboval bych detailnější popis chyby. Makro jsem zkoušel a fungovalo jinak bych jej sem neumístil. Tak mne napadá jestli máte stažený blok
a umístěný do adresáře, kde jej může ACAD najít…
|
Civil 2007
|
 |
johny
TOP uživatel
Přihlášen: 24.led.2006
Lokalita: ČR (JM)
Používám: C3D 2024
Stav: Offline
Bodů: 1741
|
Zasláno: 21.pro.2006 v 14:39 |
Asi byl orpavdu problem v jinem umisten.. ted uz to funguje.. Mohl bych vás jeste poprosit o úpravu (predpoládám, že snadnou) abych tu funkci mohl vyuzit jen volanim z prikazove radky resp. přímo z autolispu.. např ve formatu... -vbarun dynblk JmenoBloku JmenoParametru HodnotaParametru. Děkuji moc.
|
 |
Chop
Diskutér
Přihlášen: 13.srp.2005
Lokalita: Czech Republic
Stav: Offline
Bodů: 64
|
Zasláno: 22.pro.2006 v 08:31 |
Teď nemám k dispozici CAD, takže to nemohu přesně ověřit (ověřím až v lednu), ale mělo by snad zabrat tohle:
Sub Dynblk(JmenoBloku as String, JmenoParametru as String, HodnotaParametru as String) Dim vklbod As Variant Dim novyblk As AcadBlockReference vklbod = ThisDrawing.Utility.GetPoint(, "Vyberte místo pro umístění bloku") Set novyblk = ThisDrawing.ModelSpace.InsertBlock(vklbod, JmenoBloku, 1, 1, 1, 0) If novyblk.IsDynamicBlock Then Dim vlastnostinovehoblk As Variant Dim viditelnost As AcadDynamicBlockReferenceProperty vlastnostinovehoblk = novyblk.GetDynamicBlockProperties For j = LBound(vlastnostinovehoblk) To UBound(vlastnostinovehoblk) 'prolezeme všechny vlastnosti Select Case vlastnostinovehoblk(j).PropertyName Case JmenoParametru vlastnostinovehoblk(j).Value = HodnotaParametru End Select Next j End If novyblk.Update End Sub
Volání pro náš příklad by mělo být:
-vbarun DynBlk "Horizontální_formáty. dwg","Visibility","A0"
ale jak říkám nejsem si zcela jist a ověřím později. Vyzkoušejte.
Ještě by to chtělo asi ošetřit na vznik chyb při volání příkazu když vlastnost neexistuje, nebo je špatně zadána apod. Později…
|
Civil 2007
|
 |
Chop
Diskutér
Přihlášen: 13.srp.2005
Lokalita: Czech Republic
Stav: Offline
Bodů: 64
|
Zasláno: 02.led.2007 v 09:08 |
Dobrý den, omlouvám se všem, kteří to již zkoušeli a zjistili, že výše uvedené makro není funkční. Bohužel volání procedury s parametry funguje uvnitř VBA, ale ne z příkazového řádku.
Zde je upravené makro, které mění požadované vlastnosti (není ošetřeno na chyby v zadání):
Sub Dynblk() Dim vklbod As Variant Dim novyblk As AcadBlockReference JmenoBloku = ThisDrawing.Utility.GetString(False, "Zadejte jméno vkládaného bloku: ") JmenoParametru = ThisDrawing.Utility.GetString(False, "Zadejte jméno měněného parametru: ") HodnotaParametru = ThisDrawing.Utility.GetString(False, "Zadejte hodnotu parametru: ") vklbod = ThisDrawing.Utility.GetPoint(, "Vyberte místo pro umístění bloku") Set novyblk = ThisDrawing.ModelSpace.InsertBlock(vklbod, JmenoBloku, 1, 1, 1, 0) If novyblk.IsDynamicBlock Then Dim vlastnostinovehoblk As Variant Dim viditelnost As AcadDynamicBlockReferenceProperty vlastnostinovehoblk = novyblk.GetDynamicBlockProperties For j = LBound(vlastnostinovehoblk) To UBound(vlastnostinovehoblk) 'prolezeme všechny vlastnosti Select Case vlastnostinovehoblk(j).PropertyName Case JmenoParametru vlastnostinovehoblk(j).Value = HodnotaParametru End Select Next j End If novyblk.Update End Sub
Po jeho spuštění z příkazového řádku -vbarun DynBlk
se postupně dotáže na hodnoty. Zadání najednou není zatím možné.
Spustit z Lispu lze např.:
(defun c:TVBA () (vl-vbarun "DynBlk") )
ale předání parametrů mezi Lispem a VBA není možné (alespoň nevím jak). Příkaz vl-vbarun umožní spustit pouze makro bez parametrů a ani lisp neumožňuje definovat fukce spustitelné z příkazového řádku s parametry tj. Defun c:DynBlk (JmBloku JmParametru HodnotaParametru)
Takže buď vše bude napsáno ve VBA a nebo v Lispu. Asi je třeba se rozhodnout hned na začátku. 
|
Civil 2007
|
 |
johny
TOP uživatel
Přihlášen: 24.led.2006
Lokalita: ČR (JM)
Používám: C3D 2024
Stav: Offline
Bodů: 1741
|
Zasláno: 02.led.2007 v 11:03 |
Zdravím, děkuji za ochotu, v vánocích jsem se na to díval a dle vašeho vzoru a nápovědy jsem si to upravil do tvaru, který jsem potřeboval. Na problém předávání parametrů jsem narazil a vyřešil stejně jako vy.
Tedy:
Sub Dynblk() Dim Vklbod As Variant Dim Novyblk As AcadBlockReference Dim Jmeno As String Dim bodX As Double Dim bodY As Double Dim Meritko As Double Dim HVyska As String Dim DVyska As String Dim Otoceni As Double Jmeno = ThisDrawing.Utility.GetString(False, "Jméno bloku: ") Vklbod = ThisDrawing.Utility.GetPoint(, "Umístění bloku: ") Meritko = ThisDrawing.Utility.GetReal("Měřítko bloku: ") Otoceni = ThisDrawing.Utility.GetReal("Natočení bloku: ") bodX = ThisDrawing.Utility.GetReal("Bod X:") bodY = ThisDrawing.Utility.GetReal("Bod Y:") HVyska = ThisDrawing.Utility.GetString(True, "Horní výška: ") DVyska = ThisDrawing.Utility.GetString(True, "Dolní výška: ") Set Novyblk = ThisDrawing.ModelSpace.InsertBlock(Vklbod, Jmeno, Meritko, Meritko, Meritko, Otoceni) If Novyblk.IsDynamicBlock Then Dim VlastnostiNovehoBlk As Variant Dim AtributyNovehoBlk As Variant Dim J As Integer Dim I As Integer VlastnostiNovehoBlk = Novyblk.GetDynamicBlockProperties For J = LBound(VlastnostiNovehoBlk) To UBound(VlastnostiNovehoBlk) 'prolezeme všechny vlastnosti Select Case VlastnostiNovehoBlk(J).PropertyName Case "Poloha X" VlastnostiNovehoBlk(J).Value = bodX Case "Poloha Y" VlastnostiNovehoBlk(J).Value = bodY End Select Next J AtributyNovehoBlk = Novyblk.GetAttributes For I = LBound(AtributyNovehoBlk) To UBound(AtributyNovehoBlk) 'prolezeme všechny vlastnosti Select Case AtributyNovehoBlk(I).TagString Case "Horní výška" AtributyNovehoBlk(I).TextString = HVyska Case "Dolní výška" AtributyNovehoBlk(I).TextString = DVyska Case "PRVYSKA" AtributyNovehoBlk(I).TextString = HVyska End Select Next I End If Novyblk.Update End Sub
Volání z lispu mám vyřešené přes příkaz command:
(command "-vbarun" "Dynblk" dBlok B1 VyskaText uhel dX dY (rtos V1 2 Presnost) (rtos V2 2 Presnost))
Jinak je trochu problém s obecným zadáním typu parametru, páč hodnotu nelze vždy přečíst getstring..(předpokládám že neexistuje něco jako getvariant). Chtělo by to asi vždy vyhodnotit jaký parametr to je (asi česky i anglicky) a dle toho zvolit ctecí funkci..
Každopádně moc děkuju za vzor, velmi mě pomohl. Jinak si myslím, že podobná funkce autocadu celkem chybí. J.
|
 |
Chop
Diskutér
Přihlášen: 13.srp.2005
Lokalita: Czech Republic
Stav: Offline
Bodů: 64
|
Zasláno: 02.led.2007 v 11:48 |
johny napsal(a):
Jinak je trochu problém s obecným zadáním typu parametru, páč hodnotu nelze vždy přečíst getstring |
Trochu to upřesněte. Který parametr to dělá a při jakých hodnotách? (Příklad?)
Jinak ten Command je v podstatě "simulace" psaní v příkazovém řádku tj. to co musí normálně napsat uživatel - je to korektní postup, ale nevím, zda se to dá považovat za předání parametrů funkci (když funkce nebude mít implementováno čtení tj. vyžadování parametrů, tak je nenačte).
Opačně při "předání" parametrů z VBA do Lispu obdobně lze použít SendCommand
Důležité je, že to takhle alespoň funguje a tedy lze s jistými omezeními kombinovat oba programovací přístupy. 
|
Civil 2007
|
 |
johny
TOP uživatel
Přihlášen: 24.led.2006
Lokalita: ČR (JM)
Používám: C3D 2024
Stav: Offline
Bodů: 1741
|
Zasláno: 02.led.2007 v 13:06 |
No myslel jsem to asi tak, ze zadávání parametru polohy vyžaduje číslo (getreal), viditelnosti znaky (getstring) nebo překlopení číslo 0/1 (getinteger) a tak... Ale neměl jsem ambici dělat zcela obecnou funkci na měnění parametrů a atributů dyn. bloků - což by bylo jistě jiný kafčo... různé počty různých parametrů a atributů...
Jinak Command... vím, že to tak funguje a právě tak toho využívám. Nevím jestli to je úplně "košer", ale přesně jak říkáte - funguje to.
|
 |
johny
TOP uživatel
Přihlášen: 24.led.2006
Lokalita: ČR (JM)
Používám: C3D 2024
Stav: Offline
Bodů: 1741
|
Zasláno: 09.led.2007 v 19:25 |
Zdravim,
mam problem pri vkladani tech dynamickych bloku. Na obrazcich jsou stejne situace, pouze se zmenenym meritkem. Pokud je meritko 1, pak funguje vse bez problemu. Pokud jej ale zmenim (tady 0.7), pak me ten blok vloží sice se správnými vlastnostmi (tj. bod vlozeni, otoceni i meritko) ale puvodne dynamicky blok vlozi jako normalni (If Novyblk.IsDynamicBlock vrati False). Ale zase pokud bod vlozeni je relativne blizky 0,0 tak funguji i ruzna meritka (zkousel jsem 1000,1000 a fungoval, ale 50000,50000 uz ne...).
Prosim muzete me nekdo poradit co delam spatne?? Predpokladam, ze kdyz dynamicky blok vlozi jako normalni, tak je to asi nejaka chyba... Nemate nekdo s tim zkusenosti.. kdy to se tak stava??
diky moc.
 
|
 |
Chop
Diskutér
Přihlášen: 13.srp.2005
Lokalita: Czech Republic
Stav: Offline
Bodů: 64
|
Zasláno: 16.led.2007 v 06:22 |
Musím potvrdit podivné převody dynamických bloků na normální, ale u mne to dělá až když zmenším měřítko velmi výrazně tj. v properties je scale zobrazováno jako 0 - to bych si tipoval na zaokrouhlovací chybu.
Pokud zmenším měřítko z 1 na 0.1, tak se přestanou zobrazovat grafické symboly např. pro visibility, ale blok zůstane dynamický tj. v properties lze příslušné vlastnosti nastavit, ale opětné zvětšení bloku nevede k zobrazení grafických symbolů - už je nikdy nelze zobrazit. Přitom zmenšení z 1 na např. 0.125 je ok.
Při otevření úplně čistého souboru a pak okamžitě při pokusu vložit dynamický blok sekvencí:
Set Novyblk = ThisDrawing.ModelSpace.InsertBlock(Vklbod, "Horizontální_formáty. dwg", 1#, 1#, 1#, 0)
je vyvolána Run-time chyba -2145386445 (80200033) Filler error. K chybě nedojde, když již ve výkrese nějaké bloky jsou! Pokud takto vkládám obyčejný blok, tak to funguje, dynamický ne!
Jak je vidět, tak dynamické bloky ještě mají své mouchy, nebo se mýlím?
|
Civil 2007
|
 |