Newsgroup: it.comp.software.cad
Titolo: [LISP] Baricentro

 esiste un lisp che segni il baricentro di una polilena ?
 (o magari c'e` il comando AutoCAD, ma non lo trovo)
 ringrazio per l'attenzione
 un saluto da
 Sebastiano Venabile

 esiste un lisp che segni il baricentro di una polilena ?
Vieni su CADLandia, ho fatto una procedura VBA che traccia il
baricentro e l'ellisse d'inerzia.
Saluti, Aniello
-- 
Aniello Annunziata
Content Director Manager
www.cadlandia.com
aniello.a...@cadlandia.com
Per rispondermi in privato, togli NOGARBAGE dall'indirizzo


 grazie, sono venuto su CADLandia, ma non l'ho trovato
 mi puoi dare, per cortesia, l'URL preciso ?
 grazie ancora


 scrisse:

Devi trasformare la *polilena* prima in una polilinea  :) e poi inuna
regione, dopodiche' c'e' il comando nel menu interrroga.
-- 
Ciao, Tigers
[cit.] .. perchè la curva d'apprendimento di google è storicamente tra le
più ripide ... e.
www.tigers.3000.it

regione, dopodiche' c'e' il comando nel menu interrroga.
 grazie, comando _massprop, ho trovato
 sono un po' arruginito con il LISP, ma provero` a scrivere
 qualcosa che segni il baricentro, sfruttando il tuo consiglio
 pero` se qualcuno l'ha gia` scritto non mi offendo :-)
 grazie ancora


 mi puoi dare, per cortesia, l'URL preciso ?
Hai ragione, non è stata uploadata.
Ti do il listato VBA:
Sub InputSezione(objRegion As Object)
    '
    'Acquisisce un immagine dallo schermo di AutoCAD.
    '
    Dim SSet As Object
    Dim GroupCode(0 To 2) As Integer
    Dim DataValue(0 To 2) As Variant
    On Error GoTo ErrorTrap
    'Definisce un nuovo set di selezione.
    Set SSet = ThisDrawing.SelectionSets.Add("SSImage")
    'Filtra solo le regioni.
    GroupCode(0) = -4
    DataValue(0) = "<or"
    GroupCode(1) = 0
    DataValue(1) = "region"
    GroupCode(2) = -4
    DataValue(2) = "or>"
    SSet.SelectOnScreen GroupCode, DataValue 'Acquisisce la regione.
    Set objRegion = SSet.Item(0)  'Estrapola la regione dal selection
set.
    SSet.Delete  'Cancella il set di selezione.
    Exit Sub
ErrorTrap:
    SSet.Delete  'Cancella il set di selezione.
End Sub
Sub MassPropRegion()
    '
    'Processa una regione dallo schermo di AutoCAD, calcola le
    'proprietà di massa, le mostra a finestra di dialogo
    'e disegna l'ellisse d'inerzia ed il nocciolo d'inerzia.
    '
    Dim Sezione As Object
    Dim Baricentro As Variant
    Dim DirezioniPrincipali As Variant
    Dim MomentiPrincipali As Variant
    Dim Ro As Variant
    Dim pointObj As AcadPoint
    Dim PunBaricentro(0 To 2) As Double
    Dim viewportObj As AcadViewport
    Dim AsseX(0 To 2) As Double
    Dim AsseY(0 To 2) As Double
    Dim ucsObj As AcadUCS
    Dim oldUCS As AcadUCS
    Dim ellObj As AcadEllipse
    Dim majAxis(0 To 2) As Double
    Dim radRatio As Double
    Dim msgText As String
    Dim aXObj, aYObj As AcadLine
 
    On Error GoTo ErrorTrap2
 
    'Calcolo dei dati della sezione
    Set viewportObj = ThisDrawing.ActiveViewport
    InputSezione Sezione
    'Calcolo del Baricentro
    Baricentro = Sezione.Centroid
    PunBaricentro(0) = Baricentro(0)
    PunBaricentro(1) = Baricentro(1)
    PunBaricentro(2) = 0
    'Calcolo delle direzioni principali d'inerzia
    DirezioniPrincipali = Sezione.PrincipalDirections
    'Calcolo dei vertici delle direzioni principali d'inerzia
    AsseX(0) = PunBaricentro(0) + DirezioniPrincipali(0)
    AsseX(1) = PunBaricentro(1) + DirezioniPrincipali(1)
    AsseX(2) = PunBaricentro(2)
    AsseY(0) = PunBaricentro(0) + DirezioniPrincipali(2)
    AsseY(1) = PunBaricentro(1) + DirezioniPrincipali(3)
    AsseY(2) = PunBaricentro(2)
    ThisDrawing.SetVariable "PDMODE", 2
    'Disegno del baricentro
    Set pointObj = ThisDrawing.ModelSpace.AddPoint(PunBaricentro)
    pointObj.Color = acCyan
    'Spostamento dell'UCS
    Set ucsObj = ThisDrawing.UserCoordinateSystems.Add(PunBaricentro,
AsseX, AsseY, "UCS2")
    Set oldUCS = ThisDrawing.ActiveUCS
    ThisDrawing.ActiveUCS = ucsObj
    'Calcolo dei momenti principali d'inerzia baricentrici e del
raggio d'inerzia
    MomentiPrincipali = Sezione.PrincipalMoments
    Ro = Sezione.RadiiOfGyration
    'Calcolo dei vertici degli assi cartesiani principali
    AsseX(0) = PunBaricentro(0) + DirezioniPrincipali(0) * Ro(1) * 1.5
    AsseX(1) = PunBaricentro(1) + DirezioniPrincipali(1) * Ro(1) * 1.5
    AsseX(2) = PunBaricentro(2)
    AsseY(0) = PunBaricentro(0) + DirezioniPrincipali(2) * Ro(1) * 1.5
    AsseY(1) = PunBaricentro(1) + DirezioniPrincipali(3) * Ro(1) * 1.5
    AsseY(2) = PunBaricentro(2)
    'Calcolo di un estremo dell'ellisse d'inerzia e del rapporto tra i
diametri
    majAxis(0) = Ro(1) * DirezioniPrincipali(0)
    majAxis(1) = Ro(1) * DirezioniPrincipali(1)
    majAxis(2) = 0
    radRatio = Ro(0) / Ro(1)
    'Disegno dell'ellisse d'inerzia
    Set ellObj = ThisDrawing.ModelSpace.AddEllipse(PunBaricentro,
majAxis, radRatio)
    ellObj.Color = acYellow
    'Disegno degli assi coordinati principali
    Set aXObj = ThisDrawing.ModelSpace.AddLine(PunBaricentro, AsseX)
    aXObj.Color = acBlue
    Set aYObj = ThisDrawing.ModelSpace.AddLine(PunBaricentro, AsseY)
    aYObj.Color = acBlue
    'Torna alle coordinate WCS
    ThisDrawing.ActiveUCS = oldUCS
    'Mostra i dati della sezione
    msgText = "Baricentro della sezione: " & Chr(10) &
PunBaricentro(0) & ";" & PunBaricentro(1) & "," & PunBaricentro(2)
    msgText = msgText & Chr(10) & Chr(10)
    msgText = msgText & "Raggi d'inerzia: " & Chr(10) & Ro(0) & ";" &
Ro(1)
    msgText = msgText & Chr(10) & Chr(10)
    msgText = msgText & "Momenti principali d'inerzia: " & Chr(10)
    msgText = msgText & "Ix: " & MomentiPrincipali(0) & Chr(10)
    msgText = msgText & "Iy: " & MomentiPrincipali(1)
    MsgBox msgText, , "Proprietà della sezione"
ErrorTrap2:
End Sub
