Benvenuti nella nostra community - Visita anche il blog

Benvenuto ospite! Login Registrati

Benvenuto/a ospite! . Per leggere i contenuti del forum non è richiesta la registrazione ma se vuoi interagire con noi ponendo domande ed avendo una risposta ai tuoi problemi devi registrarti. La registrazione è gratuita e puoi farla cliccando su Registrati in alto a destra, oppure entrando con i tuoi account social.


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
VBscript applicati a nanoCAD
#1
Salve a tutti,
    di recente ho scoperto nanoCAD come alternativa gratuita a AutoCAD. Attialmente abbiamo 2 licenze di LT ma questo non permette di far girare macro.
Mi sono trovato quindi a tradurre una macro da VBA a VBscript e devo dire che mi sono bloccato con un problema su metodi che restituivano un array, ma ho trovato per fortuna una soluzione.
Credo quindi di essere divantato abbastanza esperto per poter dare una mano.
Inizierei con il classico esempio con cui si iniziano tutte le lezioni di un linguaggio di programmazione:

Hello World!
  1. Tovate un editor di testo io mi trovo bene con Notepad++ (ovviamente gratuito)
  2. create un nuovo file e incollateci il codice seguente:

    Codice:
    'Variabili
    Dim insPoint(2)                'Array di Double
    Dim textObj                'Oggetto AcadText

    insPoint(0) = 100            'Coordinata X
    insPoint(1) = 100            'Coordinata Y
    insPoint(2) = 0                'Coordinata Z

    'Creo il'oggetto testo AddText Method (ActiveX)
    'RetVal = object.AddText(TextString, InsertionPoint, Height)
    Set textObj = ThisDrawing.ModelSpace.AddText ("Hello Wolrd!", insPoint, 50)


  3. Salvate il fle per esempio con il nome HelloWorld.vbs
  4. Aprite nanoCAD ed un nuovo disegno
  5. Andate in Strumenti->Script->Visual Basic Script e selezionate il file vbs salvato
E... sorpresa sorpresa vi troverete un testo alla posizione 100,100 con scritto dentr Hello Wolrd!

Volete cambiare il colore della scritta? Aggiungete textObj.color = acMagenta in fondo la codice
Likes Received: 1 in 1 posts
Likes Given: 0
Cita messaggio
Thanks given by: Fabrizio Pieri
#2
Grazie del contributo.
Sarebbe bellissimo se tu continuassi con altri post come questo.
Questa sezione del forum ha un grande bisogno di persone come te.
CONOSCIAMOCI MEGLIO!
------------------------------
Segui anche il mio blog:
https://www.openoikos.com/

ed anche il nostro canale Telegram (consigliatissimo):
https://telegram.me/openoikos
Cita messaggio
Thanks given by:
#3
Bene allora disegniamo qualcosa!
Disegnamo una faccia

Codice:
'Variabili
Dim pnt_1(2)                'Array di Double
Dim pnt_2(2)                'Array di Double
Dim raggio                    'Integer
Dim lineObj                    'Oggetto linea
Dim circObj                    'Oggetto cerchio
Dim poliObj                    'Oggetto polilinea
Dim arc_Obj                    'Oggetto arco
Dim Start_Ang                'Angolo inizio arco
Dim End___Ang                'Angolo fine arco
Dim punti(17)                'Array da 0 a 17 di 9 tris di coordinate xyz per la polilinea

Const pigreco = 3.141592653    'PiGreco

'*** Disegnamo il naso ***
pnt_1(0) = 200                'Coordinata X
pnt_1(1) = 200                'Coordinata Y
pnt_1(2) = 0                'Coordinata Z
pnt_2(0) = 200                'Coordinata X
pnt_2(1) = 300                'Coordinata Y
pnt_2(2) = 0                'Coordinata Z
'Creo l'oggetto lineObj con AddLine Method (ActiveX)
'RetVal = object.AddLine(StartPoint, EndPoint)
Set lineObj = ThisDrawing.ModelSpace.AddLine(pnt_1, pnt_2)

'*** Disegnamo la faccia ***
pnt_1(0) = 200                'Coordinata X
pnt_1(1) = 250                'Coordinata Y
pnt_1(2) = 0                'Coordinata Z
raggio = 250                'Raggio circonferenza
'Creo l'oggetto circObj con ddCircle Method (ActiveX)
'RetVal = object.AddCircle(Center, Radius)
Set lineObj = ThisDrawing.ModelSpace.AddCircle(pnt_1, raggio)

'*** Disegnamo la bocca ***
'Gli angoli vanno scritti in radianti quindi vanno convertiti /180*pigreco
Start_Ang = 200 / 180 * pigreco
End___Ang = 340 / 180 * pigreco
raggio = 150
'Creo l'oggetto AddArc Method (ActiveX)
'RetVal = object.AddArc(Center, Radius, StartAngle, EndAngle)
Set arc_Obj = ThisDrawing.ModelSpace.AddArc(pnt_1, raggio, Start_Ang, End___Ang)

'*** Disegnamo l'occhio sinistro ***
punti(0) = 60:   punti(1) = 360:  punti(2) = 0
punti(3) = 90:   punti(4) = 375:  punti(5) = 0
punti(6) = 130:  punti(7) = 375:  punti(8) = 0
punti(9) = 160:  punti(10) = 360: punti(11) = 0
punti(12) = 130: punti(13) = 345: punti(14) = 0
punti(15) = 90:  punti(16) = 345: punti(17) = 0
'Creo l'oggetto poliObj con AddPolyline Method (ActiveX)
'RetVal = object.AddPolyline(VerticesList)
Set poliObj = ThisDrawing.ModelSpace.AddPolyline(punti)
'Chiudo la polilinea
poliObj.Closed = True

'*** Ora facciamo l'occhio destro specchiando il precedente ***
Dim mir_poli_Obj            'Oggetto cerchio
'Creo l'oggetto mir_poli_Obj con Mirror Method (ActiveX)
'RetVal = object.Mirror(Point1, Point2)
Set mir_poli_Obj = poliObj.Mirror(pnt_1, pnt_2)

Questo esempio disegna:
  1. una linea che sarà il naso
  2. un cerchio che sarà la faccia
  3. un arco che sarà la bocca
  4. una polilinea che sarà l'occhio sinistro
  5. la stessa polilinea verrà chiusa per completare la sagoma
  6. poi una chicca con un mirror faccio l'occhio destro specchiano l'occhio sinistro
Alla prossima
Cita messaggio
Thanks given by: Fabrizio Pieri
#4
Vediamo l'oggetto AutoCAD Application->Document 
   
fornisce l'accesso a tutti gli oggetti grafici e la maggior parte degli oggetti AutoCAD non grafici
L'accesso agli oggetti grafici (linee, cerchi, archi e così via) viene fornito tramite le collezioni ModelSpace e PaperSpace e l'accesso agli oggetti non grafici (livelli, tipi di linea, stili di testo e così via) viene fornito tramite raccolte con nome simile.

Cosa vuol dire tutto questo?
Per esempio vogliamo fare una lista di tutti i Layer nel disegno?
Codice:
'Variabili
Dim c
Dim telaio
Dim layerObj

ThisDrawing.Utility.Prompt "Disegno corremte: " & ThisDrawing.Name
c = 1
For each telaio in  ThisDrawing.Layers
    ThisDrawing.Utility.Prompt c & "  Layer=" & telaio.Name & "  Colore=" & telaio.Color & "  TipoLinea=" & telaio.Linetype
    c = c + 1
Next

'Creiamo un nuovo Layer
Set layerObj = ThisDrawing.Layers.Add("Nuovo_Layer")
'Colore magenta
layerObj.Color = acMagenta
'Tipo  linea continua
layerObj.Linetype = "Continuous"

'Impostiamo il nuovo Layer come il corrente
ThisDrawing.ActiveLayer = layerObj
Potendo quindi conoscere le info layer per layer volendo si possono modificare 
o aggiungerne uno come l'esempio sopra
Cita messaggio
Thanks given by:
#5
Qui invece possiamo scorrere tutte le "Entità" dello spazio modello siano esse linee polilinee cerchi archi ellissi blocchi quote etc...

Codice:
'Variabili
Dim c
Dim EntObj

For c = 0 To ThisDrawing.ModelSpace.Count - 1
    Set EntObj = ThisDrawing.ModelSpace.Item(c)
    ThisDrawing.Utility.Prompt "Entita' " & c & " e' un " & EntObj.ObjectName & "sul layer " & EntObj.Layer
Next

E vediamo su che layer sono, ovviamente possiamo conoscere altre info (proprietà) in base all'oggetto per esempio un 
oggetto linea avrà:
  1. punto di inizio EntObj.StartPoint
  2. punto finale EntObj.EndPoint
  3. lunghezza EntObj.Length
se abbimo un oggetto cerchio avrà:
  1. centro EntObj.Center
  2. diametro EntObj.Diameter
  3. circonferenza EntObj.Circumference
  4. area EntObj.Area
per un oggetto polilinea avrà:
  1. Assieme delle coordinate EntObj.Coordinates 
  2. lunghezza EntObj.Length
  3. area EntObj.Area
  4. informazione se chiusa o aperta con EntObj.Closed
E quindi cosi come si possono avere queste info si possono anche modificare
Una nota aggiuntiva su EntObj.Coordinates (nel caso sia una polilina od oggetto affine), possiamo sapere quante sono con Ubound(EntObj.Coordinates) ma attezione se restituisce un valore che è 5 indica che sono 2 tris di coordinate xyz cioè:
  • EntObj.Coordinates(0) sara la x1
  • EntObj.Coordinates(1) sara la y1
  • EntObj.Coordinates(2) sara la z1
  • EntObj.Coordinates(3) sara la x2
  • EntObj.Coordinates(4) sara la y2
  • EntObj.Coordinates(5) sara la z2
da tenere sempre a mente che in linguaggio di programmazione si parte a contare da 0 quindi da 0 a 5 ci sono 6 valori
Cita messaggio
Thanks given by:




Utenti che stanno guardando questa discussione:
1 Ospite(i)