| LucakitNuovo Utente
 
 
 
                Regione: Piemonte
 Prov.: Torino
 Cittā: Torino
 
 
   17 Messaggi
 | 
                    
                      |  Inserito il - 27/10/2010 :  02:19:05       
 |  
           	| Ciao! Ho ritenuto meglio aprire una nuova discussione perchč credo che questo argomento meriti la giusta evidenza, dato che sul web la documentazione č scarsissima...
 
 Spiego in breve, per chi inizia a leggere la mia storia solo da questa discussione, il mio obiettivo.
 Durante la compilazione del mio codice č risultato necessario interagire a mano con le operazioni del codice stesso: a un certo punto della macro avrei bisogno di poter modificare dei dettagli del disegno, in quantitā indefinita e in modo diverso da una volta all'altra (ma senza usare un'eccessiva gamma di comandi...diciamo quelli di base). Infine, dopo queste operazioni "ad-hoc", la macro termina di nuovo in automatico con salvataggi e stampe (quindi torno a non avere il controllo di essa fino alla fine).
 
 Pertanto, dopo tanto sbattere la testa, sono giunto alla soluzione che riporto qua sotto, ad uso di chi si trova nel mio stesso mal di testa!
 
 E' previsto un DO...LOOP UNTIL che comprende una SELECT di tutti i comandi di cui posso aver  bisogno; tra i comandi, ho messo quello per cui faccio proseguire la macro di nuovo in maniera autonoma (per me č il SAVE). Il tutto comprende la gestione del tasto ESC, nel caso di errore da parte dell'utente nelle operazioni, e la possibilitā di annullare le ultime operazioni svolte.
 
 NOTA IMPORTANTE: nel mio caso, era fondamentale cambiare le coordinate di alcuni punti perchč io lavoro in un sistema di riferimento diverso dal WCS mentre alcuni comandi lavorano solo in quest'ultimo; pertanto, per chi non č nel mio caso, č necessario eliminare le parti di codice che riportano " - ThisDrawing.ActiveUCS.origin(n)" e "CVar(punto_taldeitali)"!
 
 
 Difetti da sistemare nel tempo:
 - far comparire l'anteprima delle modifiche che stanno per essere fatte (quello che succede con i comandi di autocad nel momento in cui "si prendono le misure" della modifica)
 - introdurre il comando per MODIFICARE LA POSIZIONE DEI PUNTI DI UNA SPLINE........LUCIO, QUI MI APPELLO A TE SE HAI UN'IDEA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![:(][:(][:(][:(]
 - comando "Redo" per ripristinare le azioni annullate erroneamente
 - gestione di eventuali altri errori
 
 
 
 Do
 se_premi_ESC_torna_qua:
 
 Dim chiavi As String
 chiavi = "M R S I T E L Z P A V"
 ThisDrawing.Utility.initializeuserinput 128, chiavi
 
 On Error GoTo OH_NO
 
 Dim scelta As String
 scelta = ""
 scelta = ThisDrawing.Utility.GetKeyword("Cosa vuoi fare? (Muovi/Ruota/Scala/Interrompi/Taglia/Elimina/Linea_tratteggiata/Zoom/zoomPrecedente/Annulla/salVa_stampa): ")
 
 Dim Selezione As AcadSelectionSet
 Dim EntitāSelezione As AcadEntity
 Dim scalefactor As AcadDimAligned
 Dim punto As Variant
 Dim puntoDA(0 To 2) As Double
 Dim puntoA(0 To 2) As Double
 Dim entObj As AcadEntity
 Dim Pnt As Variant
 Dim Pnt2 As Variant
 Dim det As String
 Dim lspPnt As String
 Dim lspPnt1 As String
 Dim lspPnt2 As String
 Dim puntomed...(0 To 2) As Double
 
 
 Select Case scelta
 
 
 Case "M"    'MUOVI (MOVE)
 On Error GoTo OH_NO
 
 
 With ThisDrawing.SelectionSets
 While .Count > 0
 .Item(0).Delete
 Wend
 Set Selezione = .Add("$MoveTest$")
 End With
 Selezione.SelectOnScreen
 
 Set objutil = ThisDrawing.Utility
 strPrmt = vbCr & "Muovi DAL punto: "
 punto = objutil.GetPoint(Prompt:=strPrmt)
 puntoDA(0) = punto(0) - ThisDrawing.ActiveUCS.origin(0):  puntoDA(1) = punto(1) - ThisDrawing.ActiveUCS.origin(1): puntoDA(2) = 0
 punto1 = CVar(puntoDA)
 strPrmt = vbCr & "AL punto: "
 objutil.initializeuserinput 33
 punto = objutil.GetPoint(punto1, strPrmt)
 puntoA(0) = punto(0) - ThisDrawing.ActiveUCS.origin(0):  puntoA(1) = punto(1) - ThisDrawing.ActiveUCS.origin(1): puntoA(2) = 0
 punto2 = CVar(puntoA)
 
 For Each EntitāSelezione In Selezione
 Set objcopy = EntitāSelezione.Copy
 objcopy.Move punto1, punto2
 Next EntitāSelezione
 Selezione.Erase
 Set Selezione = Nothing
 Set objutil = Nothing
 Set objcopy = Nothing
 ThisDrawing.Regen (True)
 
 
 Case "R"   'RUOTA (ROTATE)
 On Error GoTo OH_NO
 
 'ThisDrawing.StartUndoMark
 With ThisDrawing.SelectionSets
 While .Count > 0
 .Item(0).Delete
 Wend
 Set Selezione = .Add("$MoveTest$")
 End With
 Selezione.SelectOnScreen
 
 Set objutil = ThisDrawing.Utility
 strPrmt = vbCr & "Ruota attorno al punto: "
 punto = objutil.GetPoint(Prompt:=strPrmt)
 puntoB = punto
 puntoDA(0) = punto(0) - ThisDrawing.ActiveUCS.origin(0):  puntoDA(1) = punto(1) - ThisDrawing.ActiveUCS.origin(1): puntoDA(2) = 0
 punto1 = CVar(puntoDA)
 strPrmt = vbCr & "Angolo di rotazione: "
 objutil.initializeuserinput 33
 punto = objutil.GetPoint(punto1, strPrmt)
 puntoA(0) = punto(0) - ThisDrawing.ActiveUCS.origin(0):  puntoA(1) = punto(1) - ThisDrawing.ActiveUCS.origin(1): puntoA(2) = 0
 punto2 = CVar(puntoA)
 dblrot = objutil.AngleFromXAxis(punto1, punto2)
 
 
 For Each EntitāSelezione In Selezione
 Set objcopy = EntitāSelezione.Copy
 objcopy.Rotate puntoB, dblrot
 Next EntitāSelezione
 Selezione.Erase
 Set Selezione = Nothing
 Set objutil = Nothing
 Set objcopy = Nothing
 ThisDrawing.Regen (True)
 'ThisDrawing.EndUndoMark
 
 
 Case "S"    'SCALA (SCALE)
 On Error GoTo OH_NO
 
 With ThisDrawing.SelectionSets
 While .Count > 0
 .Item(0).Delete
 Wend
 Set Selezione = .Add("$MoveTest$")
 End With
 Selezione.SelectOnScreen
 
 Set objutil = ThisDrawing.Utility
 strPrmt = vbCr & "Scala: "
 punto = objutil.GetPoint(Prompt:=strPrmt)
 puntoB = punto
 puntoDA(0) = punto(0) - ThisDrawing.ActiveUCS.origin(0):  puntoDA(1) = punto(1) - ThisDrawing.ActiveUCS.origin(1): puntoDA(2) = 0
 punto1 = CVar(puntoDA)
 strPrmt = vbCr & "Scala: "
 objutil.initializeuserinput 33
 punto = objutil.GetPoint(punto1, strPrmt)
 puntoA(0) = punto(0) - ThisDrawing.ActiveUCS.origin(0):  puntoA(1) = punto(1) - ThisDrawing.ActiveUCS.origin(1): puntoA(2) = 0
 punto2 = CVar(puntoA)
 puntomed...(0) = (punto1(0) + punto2(0)) / 2: puntomed...(1) = (punto1(1) + punto2(1)) / 2: puntomed...(2) = 0
 text = CVar(puntomed...)
 Set scalefactor = ThisDrawing.ModelSpace.AddDimAligned(punto1, punto2, text)
 scalefactor.Visible = False
 valore = scalefactor.Measurement / 4    'questo denominatore varia la sensibilitā della scala
 For Each EntitāSelezione In Selezione
 Set objcopy = EntitāSelezione.Copy
 objcopy.ScaleEntity puntoB, valore
 Next EntitāSelezione
 Selezione.Erase
 Set Selezione = Nothing
 Set objutil = Nothing
 Set objcopy = Nothing
 ThisDrawing.Regen (True)
 
 
 Case "I"    'INTERROMPI (BREAK)
 On Error GoTo OH_NO
 
 ThisDrawing.Utility.GetEntity entObj, Pnt, "Seleziona il primo PUNTO della linea in cui tagliare: "
 Pnt2 = ThisDrawing.Utility.GetPoint(, "Seleziona il secondo PUNTO in cui tagliare: ")
 puntoA(0) = Pnt2(0) - ThisDrawing.ActiveUCS.origin(0):  puntoA(1) = Pnt2(1) - ThisDrawing.ActiveUCS.origin(1): puntoA(2) = 0
 Pnt2 = CVar(puntoA)
 det = GetDoubleEntTable(entObj, Pnt)
 lspPnt1 = axPoint2lspPoint(Pnt)
 lspPnt2 = axPoint2lspPoint(Pnt2)
 ThisDrawing.SendCommand "_break" & vbCr & det & vbCr & lspPnt1 & vbCr & lspPnt2 & vbCr
 ThisDrawing.Regen (True)
 
 
 Case "T"    'TAGLIA (BREAK AT POINT)
 On Error GoTo OH_NO
 
 ThisDrawing.Utility.GetEntity entObj, Pnt, "Seleziona la LINEA da tagliare: "
 Pnt2 = ThisDrawing.Utility.GetPoint(, "Seleziona il PUNTO in cui tagliare: ")
 puntoA(0) = Pnt2(0) - ThisDrawing.ActiveUCS.origin(0):  puntoA(1) = Pnt2(1) - ThisDrawing.ActiveUCS.origin(1): puntoA(2) = 0
 Pnt2 = CVar(puntoA)
 det = GetDoubleEntTable(entObj, Pnt)
 lspPnt = axPoint2lspPoint(Pnt2)
 ThisDrawing.SendCommand "_break" & vbCr & det & vbCr & lspPnt & vbCr & "@" & vbCr 'lspPnt & vbCr
 ThisDrawing.Regen (True)
 
 
 Case "E"    'ELIMINA
 On Error GoTo OH_NO
 
 With ThisDrawing.SelectionSets
 While .Count > 0
 .Item(0).Delete
 Wend
 Set Selezione = .Add("$MoveTest$")
 End With
 Selezione.SelectOnScreen
 
 For Each EntitāSelezione In Selezione
 EntitāSelezione.Erase
 Next EntitāSelezione
 Set Selezione = Nothing
 ThisDrawing.Regen (True)
 
 
 Case "L"    'LINEA TRATTEGGIATA
 On Error GoTo OH_NO
 
 With ThisDrawing.SelectionSets
 While .Count > 0
 .Item(0).Delete
 Wend
 Set Selezione = .Add("$MoveTest$")
 End With
 Selezione.SelectOnScreen
 
 For Each EntitāSelezione In Selezione
 EntitāSelezione.Linetype = "DASHEDX2"
 Next EntitāSelezione
 Set Selezione = Nothing
 ThisDrawing.Regen (True)
 
 
 
 Case "Z"    'ZOOM
 On Error GoTo OH_NO
 
 Set objutil = ThisDrawing.Utility
 strPrmt = vbCr & "Clicca il primo angolo della zona in cui zoomare: "
 punto1 = objutil.GetPoint(Prompt:=strPrmt)
 strPrmt = vbCr & "Specifica il secondo angolo: "
 objutil.initializeuserinput 33
 punto2 = objutil.GetPoint(punto1, strPrmt)
 ZoomWindow punto1, punto2
 
 
 Case "P"    'ZOOMPRECEDENTE
 On Error GoTo OH_NO     'qua l'errore non serve perchč non c'č modo di dare ESC, essendo repentino il comando
 ZoomPrevious
 
 
 Case "A"    'ANNULLA ULTIMO COMANDO (UNDO)
 On Error GoTo OH_NO     'qua l'errore non serve perchč non c'č modo di dare ESC, essendo repentino il comando
 ThisDrawing.SendCommand "_undo" & vbCr
 ThisDrawing.SendCommand "1" & vbCr
 
 
 Case "V"    'SALVA_STAMPA
 On Error GoTo OH_NO     'qua l'errore non serve perchč non c'č modo di dare ESC, essendo repentino il comando
 Exit Do
 
 
 End Select
 
 Set Selezione = Nothing
 
 Loop Until scelta = "V"
 
 
 OH_NO:
 ThisDrawing.Utility.Prompt vbCrLf & Err.Description & vbCr
 Resume se_premi_ESC_torna_qua
 Err.Clear
 
 
 
 Public Function GetDoubleEntTable(entObj As AcadEntity, Pnt As Variant) As String
 Dim entHandle As String
 entHandle = entObj.Handle
 GetDoubleEntTable = "(list(handent " & Chr(34) & entHandle & Chr(34) & ")(list " & str(Pnt(0)) & str(Pnt(1)) & str(Pnt(2)) & "))"
 End Function
 
 
 'convert Point to LISP format
 Public Function axPoint2lspPoint(Pnt As Variant) As String
 axPoint2lspPoint = Replace(Pnt(0), ",", ".") & "," & Replace(Pnt(1), ",", ".") & "," & Pnt(2)
 End Function
 
 
 
 |  
                      | Modificato da - Lucakit in Data 27/10/2010  02:23:38
 |  |