• このフォーラムは、www.cad3d.it/forum1 - イタリアのデザインコミュニティの機械翻訳です。いくつかの用語は正しく翻訳されていません。

選択ブロックとテキストの変換属性

bolo

Guest
ho qualche rudimento di vba per office, è la prima volta che utilizzo vba per autocad.

il mio obbiettivo è per circa un centinaio di file .dwg:

1. selezionare dei blocchi
2. esplodere gli attributi e trasformarli in testo(comando "explode attributes to text" contenuto negli express tool

per passare tutti i 100 dwg ho trovato una routine, per il resto mi trovo in difficoltà, se qualcuno mi consiglia qualche comando mi sarebbe molto utile.

grazie!!!
 
Last edited:
ma quel foglio excel serve per stampare no?
quindi dovrei modificare il codice per far quello che mi serve a me?
o mi son peros qualcosa?

grazie cmq per la risposta ;)
 
col pulsante giallo (seleziona file) selezioni tutti i dwg da processare e vengono inseriti nella colonna a.

nella colonna d inserisci, uno per riga, i comandi che deve eseguire autocad e poi posizionati nella cella immediatamente al di sotto dell'ultimo comando impartito.

pulsante blu (crea file script)


vedi un esempio in questa discussione.

facci sapere.
 
riguardo al problema di elaborare più files diversi l'avrei risolto mediante un .dvb trovato qui (è il penultimo...) che passa in rassegna tanti dwg e li elabora...

il problema mio è ora selezionare determinati blocchi filtrandoti magari per nome blocco, ed estrarre gli attributi trasformandoli in testo (comando "explode attributes to text" contenuto negli express tool)

anche utilizzando il foglio excel non saprei come fare... :confused:
 
riguardo al problema di elaborare più files diversi l'avrei risolto mediante un .dvb trovato qui (è il penultimo...) che passa in rassegna tanti dwg e li elabora...

il problema mio è ora selezionare determinati blocchi filtrandoti magari per nome blocco, ed estrarre gli attributi trasformandoli in testo (comando "explode attributes to text" contenuto negli express tool)

anche utilizzando il foglio excel non saprei come fare... :confused:


if not isnull(thisdrawing.selectionsets.item("element2")) then
set sset2 = thisdrawing.selectionsets.item("element2")
sset2.delete
end if


set sset2 = thisdrawing.selectionsets.add("element2")
dim filtertype(1) as integer
dim filterdata(1) as variant
filtertype(0) = 0
filterdata(0) = "insert"
filtertype(1) = 2
filterdata(1) = "nome_blocco"

sset2.select acselectionsetall, , , filtertype, filterdata

e fin qui crei una selezione con i blocchi di quel disegno con quel nome.

ora se tu sei certo di aver a disposizione gli express... la cosa è semplice con il comndo "sendcommand" puoi passare alla riga di comando i comandi .


thisdrawing.sendcommand ("burst" & vbcr & "p" & vbcr & vbcr)


dove "p" indica precedente, visto che la selezione precedente aveva già gli oggetti filtrati.

altro metodo... un po' più laborioso è quello di creare un array con i valori deegli attributi e memorizzare la loro posizione xy, per poi utilizzare questo array per riscrivere testo nelle stesse posizioni con le stesse proprietà. qui la cosa si fa un po' più complicata ma fattibile.
 
mitico!!!

troppo gentile davvero...

adesso guardo con calma e poi riferirò se l'obbiettivo è stato raggiunto o meno!!!!

buona giornata intanto!
 
mi da errore alla prima riga...

if not isnull(thisdrawing.selectionsets.item("element2")) then

dice "chiave non trovata"... mi chiedevo per l'appunto "element2" cos'è?

lo scopo del primo paragrafo di codice e deselezionare eventuali selezioni presenti?
 
mi da errore alla prima riga...

if not isnull(thisdrawing.selectionsets.item("element2")) then

dice "chiave non trovata"... mi chiedevo per l'appunto "element2" cos'è?

lo scopo del primo paragrafo di codice e deselezionare eventuali selezioni presenti?

scusa le definizioni le avevo omesse

dim sset2 as acadselectionset
dim element2 as object

si questa lo scopo del primo paragrafo è proprio quello di verificare se ci sono oggetti nel sset2 ed eventualmente lo svuota.
 
alla prima riga mi da sempre lo stesso errore... ho provato anche a levare le virgolette, e in tal caso mi dice "tipo non corrispondente"...

mi scuso se faccio domande idiote... ma non so proprio che pesci pigliare... :rolleyes:
 
alla prima riga mi da sempre lo stesso errore... ho provato anche a levare le virgolette, e in tal caso mi dice "tipo non corrispondente"...

mi scuso se faccio domande idiote... ma non so proprio che pesci pigliare... :rolleyes:

inserisci il codice così vedo se riesco a risolvere
 
mi da errore alla prima riga...

if not isnull(thisdrawing.selectionsets.item("element2")) then

dice "chiave non trovata"... mi chiedevo per l'appunto "element2" cos'è?

lo scopo del primo paragrafo di codice e deselezionare eventuali selezioni presenti?

oltre alle dichiarazioni:

dim sset2 as acadselectionset
dim element2 as object
aggingi:

on error resume next

if not isnull(thisdrawing.selectionsets.item("element2")) then
......
...
..
.

ciao
 
al primo giro funziona, apre e salva correttamente il dwg!!!
al secondo mi esce questo errore:

errore di run-time '-21474148 (80010108)':
errore di automazione
l'oggetto invocato si è disconnesso dai client corrispondenti.

paura... :eek:
 
al primo giro funziona, apre e salva correttamente il dwg!!!
al secondo mi esce questo errore:

errore di run-time '-21474148 (80010108)':
errore di automazione
l'oggetto invocato si è disconnesso dai client corrispondenti.

paura... :eek:

allora... così è difficile capire se non posti il codice, ma secondo me la selezione non viene svuotata alla chiusura del file e vai a carcare di pescare un oggetto che fisicamente non c'è più.

cmq quell'errore li purtroppo quando si utilizza vba esce spesso e non sempre per un motivo solo... ed è difficile da rintracciare.

se posti il codice magari ci posso dare un'occhiata... ma se mi metti due ricghe al colpo è difficile capire... cmq un on error resume next va semrpe been, ma baipassi solo dei problemi che effettivamente ci sono...
 
... cmq un on error resume next va semrpe been, ma baipassi solo dei problemi che effettivamente ci sono...


esatto.....

al posto di

"if not isnull(thisdrawing.selectionsets.item("element2")) then"

si potrebbe fare:

dim y as integer
dim setname as string

setname = "element2"

for y = 0 to thisdrawing.selectionsets.count - 1
if thisdrawing.selectionsets.item(y).name = setname then
thisdrawing.selectionsets.item(y).delete
exit for
end if
next y

set sset2 = thisdrawing.selectionsets.add("element2")
.....
....
...
..

qualche riga di codice in piu' ma molto efficace

cosi' facendo (volento) si potrebbe eliminare l' on error resume next

ovviamente bisogna aver sotto mano l'intero codice per verificare che non vi siano altre "inesattezze"
:smile:
 
grandissimo!!!

funziona alla perfezione... se a qualcuno può interessare posto il codice o il file del codice direttamente!!!

grazie a tutti!!!

:finger:
 
per chi fosse interessato dallo spunto di bolo ho creato la procedura degli express "explode attribute to text" in vba... praticamente fa la stessa cosa, ma non serve avere gli express caricati per farla funzionare.

permette però di visualizzare o meno gli attributi invisili una volta convertiti in testo.

public sub explode_att_text()
dim sset2 as acadselectionset
dim blocco as acadblockreference
dim sset3 as acadselectionset
dim attributo as acadentity
dim vlabel(0 to 100) as variant
dim vtext(0 to 100) as variant

dim kwordlist as string
kwordlist = "s n"
thisdrawing.utility.initializeuserinput 1, kwordlist

thisdrawing.utility.prompt vblf & vblf

dim returnstring as string
returnstring = thisdrawing.utility.getkeyword("visualizzare attributi nascosti? (s)(n): ")

on error resume next

if not isnull(thisdrawing.selectionsets.item("blocco")) then
set sset2 = thisdrawiang.selectionsets.item("blocco")
sset2.delete
end if

set sset2 = thisdrawing.selectionsets.add("blocco")

dim filtertype(0) as integer
dim filterdata(0) as variant

filtertype(0) = 0
filterdata(0) = "insert"
' filtertype(1) = 2
' filterdata(1) = "numvan"

sset2.select acselectionsetall, , , filtertype, filterdata

for each blocco in sset2
if blocco.hasattributes then
dim array1 as variant
array1 = blocco.getattributes
for i = lbound(array1) to ubound(array1)
vlabel(i) = array1(i).tagstring
vtext(i) = array1(i).textstring
debug.print (vtext(i))
next i

blocco.explode
blocco.delete


on error resume next

if not isnull(thisdrawing.selectionsets.item("attributo")) then
set sset3 = thisdrawiang.selectionsets.item("attributo")
sset3.delete
end if

set sset3 = thisdrawing.selectionsets.add("attributo")

dim filtertype1(0) as integer
dim filterdata1(0) as variant

filtertype1(0) = 0
filterdata1(0) = "attdef"

sset3.select acselectionsetall, , , filtertype1, filterdata1

if returnstring = "" then returnstring = "s"

for each attributo in sset3

if ucase(returnstring) = "n" then
if attributo.invisible = true then attributo.delete
end if
for i = lbound(array1) to ubound(array1)
if attributo.tagstring = vlabel(i) then
attributo.tagstring = vtext(i)
end if
next i

next attributo

end if
sset3.delete
next blocco
sset2.delete
end sub
 

Forum statistics

Threads
46,674
Messages
380,976
Members
2
Latest member
loop80
このフォーラムは、www.cad3d.it/forum1 - イタリアのデザインコミュニティの機械翻訳です。いくつかの用語は正しく翻訳されていません。

Members online

No members online now.
Back
Top