• This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Leggi altro.

Coordinate blocco

OneWay

Utente Junior
Professione: Impiegato
Software: Autocad Access AutoIt
Regione: Lombardia
#1
Salve a tutti, sono nuovo nel forum e ho un problema:

Sto realizzando un semplice programmino in AutoIt che si interfaccia con Autocad, il problema è che se interrogo autocad sulle coordinate di un blocco, 'insertionpoint' mi ritorna una variabile vuota, so che è una variabile double che contiene X Y Z ma in AutoIt le matrici vengono gestite con [] e non () non so se è questo il problema, GetEntity mi risponde nella stessa maniera, vuota.

Esiste il modo di estrapolare X Y Z in una variabile non double.

Ringrazio e mi scuso per la forma forse un poco affrettata, ma l'ora e tarda e connetto sempre meno, qualsiasi suggerimento e ben accetto.

Saluti:p
 

Shape

Utente Senior
Professione: Disegnatore Carpenteria
Software: Autocad, VBA-AutoLisp, Tecnometal4D, GIMP
Regione: Friuli
#2
Salve a tutti, sono nuovo nel forum e ho un problema:

Sto realizzando un semplice programmino in AutoIt che si interfaccia con Autocad, il problema è che se interrogo autocad sulle coordinate di un blocco, 'insertionpoint' mi ritorna una variabile vuota, so che è una variabile double che contiene X Y Z ma in AutoIt le matrici vengono gestite con [] e non () non so se è questo il problema, GetEntity mi risponde nella stessa maniera, vuota.

Esiste il modo di estrapolare X Y Z in una variabile non double.

Ringrazio e mi scuso per la forma forse un poco affrettata, ma l'ora e tarda e connetto sempre meno, qualsiasi suggerimento e ben accetto.

Saluti:p
InsertionPoint

Variant (three-element array of doubles); read-write
A 3D WCS coordinate representing the insertion point.

In VBA la variabile che ti ritorna non è un Double ma un variant array 3 dimensioni, insertionpoint(0)=X insertionpoint(1)=Y insertionpoint(2)=Z

Il Double lo utilizzi solo se devi comporre la matrice

Buon lavoro
 
Ultima modifica:

OneWay

Utente Junior
Professione: Impiegato
Software: Autocad Access AutoIt
Regione: Lombardia
#3
Ti ringrazio, infatti in VBA non ho problemi a gestirlo ma in AutoIt non è la stessa cosa.

Comunque, non esiste il modo di gestire l'array 1-2-3 come una stringa unica, magari con un comando interno ad autocad che concatena l'array, o anche un modo di estrarre la singola variabile X, Y, Z come per XScaleFactor, YScaleFactor ecc.

Se conosci e usi AutoIt posso inserire il codice per comprendere meglio.

Ho provato ad usare anche GetEntity ma anche in questo caso mi restituisce la variabile insertpoint che 'sembra vuota', sembra, perchè in realtà non riesco a gestirla come array in AutiIt.

Dimmi tu, visto che in tre forum in cui ho fatto questa domanda sei l'unico che si sia azzardato a rispondermi.
 

Shape

Utente Senior
Professione: Disegnatore Carpenteria
Software: Autocad, VBA-AutoLisp, Tecnometal4D, GIMP
Regione: Friuli
#4
In che modo ti nterfacci con autocad ?

Scrivimi due righe per capire come funziona e vediamo se ne usciamo
 

OneWay

Utente Junior
Professione: Impiegato
Software: Autocad Access AutoIt
Regione: Lombardia
#5
Ti passo uno script in AutoIt il linguaggio che vorrei utilizzare.

code:
$AcadApp = ObjGet("","AutoCAD.Application")
Dim $SSet, $Ent
$AcadDoc = $AcadApp.ActiveDocument
WinActivate ($Acadapp.Caption,$AcadDoc.name)
$SSet = $AcadDoc.ActiveSelectionSet
$SSet.SelectOnScreen
For $Ent In $SSet
If $Ent.EntityName = "AcDbBlockReference" Then
MsgBox(0,"Specifiche Blocco","ScaleX: " & $Ent.XScaleFactor & @CR & _
"ScaleY: " & $Ent.YScaleFactor & @CR & _
"ScaleZ: " & $Ent.ZScaleFactor & @CR & _
"Unita mis: " & $Ent.insunits & @CR & _
"Nome: " & $Ent.name & @CR & _
"IDObj: " & $Ent.objectid & @CR & _
"NomeEff: " & $Ent.effectivename & @CR & _
"InsertP: " & $Ent.insertionpoint & @CR & _
"Layer: " & $Ent.layer & @CR & _
"Material: " & $Ent.material & @CR & _
"InsertP: " & $Ent.objectname)
Else
MsgBox (0,"","Hai mancato il blocco!" & @CR & "Riprova sarai più fortunato.")
EndIf
next

Prima di tutto occorre aprire un autocad ed inserire un blocco, dopodichè all'esecuzione dello script si seleziona il blocco e ti apparirà un box con le specifiche.

$Ent.insertionpoint come vedrai sarà vuoto, in AutoIt le matrici si gestiscono con le [] e non con (), ma visualizzando $Ent.insertionpoint[0], 1, 2 darà un errore.

Inizio a pensare che probabilmente non è possibile reperire quella info, anche se tutte le altre vengono visualizzate correttamente.

Ti ringrazio in anticipo :)
 

Shape

Utente Senior
Professione: Disegnatore Carpenteria
Software: Autocad, VBA-AutoLisp, Tecnometal4D, GIMP
Regione: Friuli
#6
Allora premetto che non conosco Autoit ma ho scaricato il prog e non sembra molto diverso dal vb...

prova a vedere con questo


Dim $myArray[10][20] ;element 0,0 to 9,19
$rows = UBound($myArray)
$cols = UBound($myArray, 2)
$dims = UBound($myArray, 0)

MsgBox(0, "The " & $dims & "-dimensional array has", _
$rows & " rows, " & $cols & " columns")

;Display $myArray's contents
$output = ""
For $r = 0 to UBound($myArray,1) - 1
$output = $output & @LF
For $c = 0 to UBound($myArray,2) - 1
$output = $output & $myArray[$r][$c] & " "
Next
Next
MsgBox(4096,"Array Contents", $output)


se gestisci insertionpoint come un array e provi a ripescarlo forse funziona
 
Ultima modifica:

OneWay

Utente Junior
Professione: Impiegato
Software: Autocad Access AutoIt
Regione: Lombardia
#7
Dunca, ho provato a mescolare le carte col codi che mi hai inviato ma non ho generato nossun dato, aimè.

code:
Dim $myArray[10][20] ;element 0,0 to 9,19
$rows = UBound($myArray)
$cols = UBound($myArray, 2)
$dims = UBound($myArray, 0)

MsgBox(0, "The " & $dims & "-dimensional array has", $rows & " rows, " & $cols & " columns")

;Display $myArray's contents
$output = ""
For $r = 0 to UBound($myArray,1) - 1
$output = $output & @LF
For $c = 0 to UBound($myArray,2) - 1
$output = $output & $myArray[$r][$c] & " "
Next
Next
MsgBox(4096,"Array Contents", $output)



$AcadApp = ObjGet("","AutoCAD.Application")
Dim $SSet, $Ent, $Ena

$AcadDoc = $AcadApp.ActiveDocument
WinActivate ($Acadapp.Caption,$AcadDoc.name)
$SSet = $AcadDoc.ActiveSelectionSet
$SSet.SelectOnScreen

For $Ent In $SSet
If $Ent.EntityName = "AcDbBlockReference" Then
MsgBox(0,"Specifiche Blocco","ScaleX: " & $Ent.XScaleFactor & @CR & _
"ScaleY: " & $Ent.YScaleFactor & @CR & _
"ScaleZ: " & $Ent.ZScaleFactor & @CR & _
"Unita mis: " & $Ent.insunits & @CR & _
"Nome: " & $Ent.name & @CR & _
"IDObj: " & $Ent.objectid & @CR & _
"NomeEff: " & $Ent.effectivename & @CR & _
"InsertP: " & $Ent.insertionpoint & @CR & _
"Layer: " & $Ent.layer & @CR & _
"Material: " & $Ent.material & @CR & _
"InsertP: " & $Ent.objectname)
Else
MsgBox (0,"","Hai mancato il blocco!" & @CR & "Riprova sarai più fortunato.")
EndIf
next



$myArray = $SSet
$output = ""
For $r = 0 to UBound($myArray,1) - 1
$output &= @LF
For $c = 0 to UBound($myArray,2) - 1
$output &= $myArray[$r][$c] & " "
Next
Next
MsgBox(4096,"Array Contents", $output)

Ho provato anche $myArray = $Ent.insertionpoint al posto di $myArray = $SSet ma il risultato non cambia, l'array risulta vuota.

Altra cosa, si puo elencare i nomi delle proprietà dell'oggetto, prelevandole dall'oggetto stesso, es:

XScaleFactor
insunits
layer

in modo da sapere prima il nome della proprietà cosa si può interrogare.

Ti ringrazio comunque, anche se mi sà che non ne caveremo un ragno dal buco.
 

Shape

Utente Senior
Professione: Disegnatore Carpenteria
Software: Autocad, VBA-AutoLisp, Tecnometal4D, GIMP
Regione: Friuli
#8
Ehh io qui mollo la presa perchè mi sto pure innervosendo....

Fammi sapere se risolvi...

Buona fortuna....

Un domanda stupida.... perchè AutoIt e non vb ? o ancor meglio VBA che puoi interlacciarlo anche con office eventualmente ?
 

OneWay

Utente Junior
Professione: Impiegato
Software: Autocad Access AutoIt
Regione: Lombardia
#9
Scusa se ti ho fatto innervosire non era mia intenzione.

Uso VBA da qualche anno e volevo qualcosa di più sfizioso, ho iniziato a masticare VBScript, molto interessante ma mi mancavano le interfacce, GUI se non erro, e sono approdato ad AutoIt che tra l'altro mi permette di generare degli eseguibili che non hanno bisogno di ocx e menate varie.

Ultima cosa, per il discorso di estrarre i nomi delle proprietà da un oggetto sai darmi una dritta?

Un saluto.
 

Shape

Utente Senior
Professione: Disegnatore Carpenteria
Software: Autocad, VBA-AutoLisp, Tecnometal4D, GIMP
Regione: Friuli
#10
forse così ce la fai....

Comando: (ENTGET(CAR(ENTSEL)))

Selezionare oggetto: ((-1 . <Nome entità: 7eda9a80>) (0 . "INSERT") (330 .
<Nome entità: 7efe3cf8>) (5 . "26480") (100 . "AcDbEntity") (67 . 0) (410 .
"Model") (8 . "0") (100 . "AcDbBlockReference") (66 . 1) (2 . "mar_pez") (10
55048.5 1758.52 0.0) (41 . 15.0) (42 . 15.0) (43 . 15.0) (50 . 0.0) (70 . 0)
(71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))

questi sono i codici DXF degli oggetti. Come vedi al codice 10 corrisponde il punto di inserimento del blocco...

Entity group codes by number
Group code Description

-5


APP: persistent reactor chain

-4


APP: conditional operator (used only with ssget)

-3


APP: extended data (XDATA) sentinel (fixed)

-2


APP: entity name reference (fixed)

-1


APP: entity name. This changes each time a drawing is opened. It is never saved. (fixed)

0


Text string indicating the entity type (fixed)

1


Primary text value for an entity

2


Name (attribute tag, block name, and so on)

3-4


Other textual or name values

5


Entity handle. Text string of up to 16 hexadecimal digits (fixed)

6


Linetype name (fixed)

7


Text style name (fixed)

8


Layer name (fixed)

9


DXF: variable name identifier (used only in HEADER section of the DXF file).

10


Primary point. This is the start point of a line or text entity, center of a circle, and so on.
DXF: X value of the primary point (followed by Y and Z value codes 20 and 30)
APP: 3D point (list of three reals)

11-18


Other points.
DXF: X value of other points (followed by Y value codes 21-28 and Z value codes 31-38)
APP: 3D point (list of three reals)

20, 30


DXF: Y and Z values of the primary point

21-28, 31-37


DXF: Y and Z values of other points

38


DXF: entity's elevation if nonzero.

39


Entity's thickness if nonzero (fixed)

40-48


Floating-point values (text height, scale factors, and so on)

48


Linetype scale. Floating-point scalar value. Default value is defined for all entity types.

49


Repeated floating-point value. Multiple 49 groups may appear in one entity for variable-length tables (such as the dash lengths in the LTYPE table). A 7x group always appears before the first 49 group to specify the table length.

50-58


Angles (output in degrees to DXF files and radians through AutoLISP and ARX applications).

60


Entity visibility. Integer value. Absence or 0 indicates visibility; 1 indicates invisibility.

62


Color number (fixed)

66


"Entities follow" flag (fixed)

67


Space--that is, model or paper space (fixed)

68


APP: identifies whether viewport is on but fully off screen; is not active or is off.

69


APP: viewport identification number.

70-78


Integer values, such as repeat counts, flag bits, or modes

90-99


32-bit integer values

100


Subclass data marker (with derived class name as a string). Required for all objects and entity classes that are derived from another concrete class to segregate data defined by different classes in the inheritance chain for the same object.
This is in addition to the requirement for DXF names for each distinct concrete class derived from ARX (see "Subclass Markers").

102


Control string, followed by "{<arbitrary name>" or "}". Similar to the xdata 1002 group code, except that when the string begins with "{", it can be followed by an arbitrary string whose interpretation is up to the application. The only other allowable control string is "}" as a group terminator. As noted before, AutoCAD does not interpret these strings except during drawing audit operations; they are for application use.

105


DIMVAR symbol table entry object handle

210


Extrusion direction (fixed).
DXF: X value of extrusion direction
APP: 3D extrusion direction vector

220, 230


DXF: Y and Z values of the extrusion direction

280-289


8-bit integer values

300-309


Arbitrary text strings

310-319


Arbitrary binary chunks with same representation and limits as 1004 group codes: hexadecimal strings of up to 254 characters represent data chunks of up to 127 bytes.

320-329


Arbitrary object handles. Handle values that are taken "as is." They are not translated during INSERT and XREF operations.

330-339


Soft-pointer handle. Arbitrary soft pointers to other objects within same DXF file or drawing. Translated during INSERT and XREF operations.

340-349


Hard-pointer handle. Arbitrary hard pointers to other objects within same DXF file or drawing. Translated during INSERT and XREF operations.

350-359


Soft-owner handle. Arbitrary soft ownership links to other objects within same DXF file or drawing. Translated during INSERT and XREF operations.

360-369


Hard-owner handle. Arbitrary hard ownership links to other objects within same DXF file or drawing. Translated during INSERT and XREF operations.

999


DXF: The 999 group code indicates that the line following it is a comment string. DXFOUT does not include such groups in a DXF output file, but DXFIN honors them and ignores the comments. You can use the 999 group to include comments in a DXF file that you've edited.

1000


ASCII string (up to 255 bytes long) in extended data.

1001


Registered application name (ASCII string up to 31 bytes long) for extended data.

1002


Extended data control string ("{"or "}").

1003


Extended data layer name.

1004


Chunk of bytes (up to 127 bytes long) in extended data.

1005


Entity handle in extended data. Text string of up to 16 hexadecimal digits

1010


A point in extended data
DXF: X value (followed by 1020 and 1030 groups)
APP: 3D point

1020, 1030


DXF: Y and Z values of a point

1011


A 3D world space position in extended data
DXF: X value (followed by 1021 and 1031 groups)
APP: 3D point

1021, 1031


DXF: Y and Z values of a World space position

1012


A 3D world space displacement in extended data
DXF: X value (followed by 1022 and 1032 groups)
APP: 3D vector

1022, 1032


DXF: Y and Z values of a World space displacement

1013


A 3D world space direction in extended data.
DXF: X value (followed by 1022 and 1032 groups)
APP: 3D vector

1023, 1033


DXF: Y and Z values of a World space direction

1040


Extended data floating-point value.

1041


Extended data distance value.

1042


Extended data scale factor.

1070


Extended data 16-bit signed integer.

1071


Extended data 32-bit signed long.
 

OneWay

Utente Junior
Professione: Impiegato
Software: Autocad Access AutoIt
Regione: Lombardia
#11
Uuhh che botta, per fortuna che ti eri innervosito :)

Mi piacerebbe chiederti dove cavolo hai trovato quel comando, micidiale, hai riaperto la voglia di riprendere un altro progetto che avevo in mente, cmq.

hai fatto 30, ti prego fai 31...

(ENTGET(CAR(ENTSEL))) > D:\XXX.txt dxf ccp cococo.
Dimmi che si può fare e magari anche come, con non ci starebbe male.

Reindirizzare l'output in un file o se esiste del cod. VBA che preleva i dati che appaiono a video

Troppo... magari prima un p'o' di camomilla cosi ti rilassi. ;)
 

Shape

Utente Senior
Professione: Disegnatore Carpenteria
Software: Autocad, VBA-AutoLisp, Tecnometal4D, GIMP
Regione: Friuli
#12
Ora la butto li.. ma perche non utilizzi autoit per lanciare una macro vba in autocad che crea il file e poi utilizzi quello per fare il resto ?
 

OneWay

Utente Junior
Professione: Impiegato
Software: Autocad Access AutoIt
Regione: Lombardia
#13
E si, hai ragione, mi stavo adagiando troppo, però se riuscivo a strapparti anche quest'ultima info ero 'quasi' a posto.

Francamente stavo pensando anche io, più che a VBA a VBS, anche se manca di stile:

AutoIt che genera un VBScript che a sua volta genera un TXT che viene prelevato da AutoIt.

Ok ci provo, dovrei anche riuscirci, spero.

Per il momento ti saluto e ti ringrazio, spero di risentirti per darti la buona notizia.

Ciao e grazie.
 

Shape

Utente Senior
Professione: Disegnatore Carpenteria
Software: Autocad, VBA-AutoLisp, Tecnometal4D, GIMP
Regione: Friuli
#15
(defun c:Esportx ()
(setq NomeFile "c:\creafile.txt")
(setq FR (open Nomefile "a"))
(Setq Lista (entget (car (ENTSEL))))
(write-line (vl-princ-to-string lista) FR)
(close FR)
)

Grazie a Rrpor66 ho trovato il modo di salvare il risultato della funzione (entget (car (ENTSEL))) nel file come volevi tu.
 
Ultima modifica:

OneWay

Utente Junior
Professione: Impiegato
Software: Autocad Access AutoIt
Regione: Lombardia
#16
Ciao, ero impegnato a capire come funziona l'autolisp e alla fine avevo sfornato questo:

(entget(car(entsel)))
(setq x (cdr (assoc 2 entList)))
(if (= x "SK")
(
(setq f(open "D:\\xgiga.txt" "w"))
(write-line (rtos(cadr(assoc 10 entList)) 2) f)
(write-line (rtos(caddr(assoc 10 entList)) 2) f)
(close f)
)
"no."
)

Sembrava quasi funzionare, poi ho chiuso e riaperto autocad e come per magia non riesco più ad estrarre il valore della lista 2 (assoc 2 entList)) che è sempre (2 . SK)
che è poi il nome del blocco.
Sono quasi in panico, un codice se non lo modifichi dovrebbe reagire sempre nello stesso modo o no?

Bon, una bella tisana per me e con calma provo il tuo codice.

Secondo te cosa non va' nel mio codice.
 

OneWay

Utente Junior
Professione: Impiegato
Software: Autocad Access AutoIt
Regione: Lombardia
#17
Oh non so cosa rispondere carico lsp eseguo comando esportx seleziono l'oggetto e lui mi risponde NIL! credo voglia dire nullo.

Uso autocad 2008 nel caso servisse.

Continuerò a provare, cavolo deve funzionare.
 

Shape

Utente Senior
Professione: Disegnatore Carpenteria
Software: Autocad, VBA-AutoLisp, Tecnometal4D, GIMP
Regione: Friuli
#18
autolisp non è il mio pane quotidiano... me la cavo meglio con VBA...Rrpor66 ne sa mollllto... mada a lui un msg in pvt e quando ha tempo ti risponde

ma poi scusa

se il codice che ti ho mandato io ti salva correttamente tutta la lista

pioi sai che

(10 55048.5 1758.52 0.0) sono le coordinate

usa autoit per manipolare la stringa e trasformi i valori in x y z
 
Ultima modifica:

OneWay

Utente Junior
Professione: Impiegato
Software: Autocad Access AutoIt
Regione: Lombardia
#19
Scusate la mia assenza non vi ho dimenticati, (problemi a casa, figlio con otite, precedenza assoluta).

Dunque, ho studiato, ho mischiato mescolato, ho aggiunto due cubetti di ghiaccio ed è risultato questo:

(Setq Lista (entget (car (ENTSEL))))
(Setq XX (rtos(cadr(assoc 10 Lista)) 2))
(Setq YY (rtos(caddr(assoc 10 Lista)) 2))
(setq SK (cdr(assoc 2 Lista)))
(setq NomeFile "d:/XXXX.txt")
(setq FR (open Nomefile "w"))
(if (= SK "SK")
((write-line YY FR)
(write-line XX FR))
"No")
(close FR)

Il risultato è un file con due righe ti testo X e Y, mi manca solo una cosa, nel caso non riesca ad selezionare nulla mi genera un errore:

Selezionare oggetto: ; errore: tipo di argomento errato: lentityp nil

Devo capire come intercettarlo, lo studio è ancora lungo.

In ogni caso devo ringraziarti per l'aiuto e il tempo che mi hai concesso.

Se e quando ci riuscirò lo aggiungerò a questo post, potrebbe servire a qualcun altro.

Terrò presente Rrport66, grazie
Bye