Newsgroup: it.comp.software.cad
Titolo: aiuto su programma autolisp

Salve, siccome in questo NG scrivono delle persone volenterose (direi SANTI)
tipo Emiliano & co che ne capiscono qualcosa, chiedo cortesemente a chi sa
programmare in autolisp di aiutarmi, se possibile.
Ho bisogno di creare una funzione in autocad che mi disegni un segmento
interpolante una serie di punti.
Dal punto di vista operativo: puntando a spigoli, centri di cerchi e così
via dicendo, vorrei poi un segmento che sia il risultato di una
interpolazione lineare di tali punti.
Ho pensato, pertanto di creare un semplice programmino in autolisp così
strutturato:
1) input lista di punti
2) calcola la retta interpolante
3) disegna il segmento di coordinate perpendicolari al primo ed all'ultimo
punto della lista
Ora ho bisogno del vostro aiuto perchè ho scritto in meta linguaggio il
programma, ma non so implementarlo in autolisp
Ecco il listato nel mio fantasioso metalinguaggio, misto di basic e C :-)
input_lista_punti ()
    float lista(100,100)
    interger NP
    NP=0
    while punto = nil
          lista = coordinate punto
          Np = NP +1
    wend
    return (float lista, integer NP)   <- dove lista è l'array di coordinate
dei punti presi e NP è il numero di punti
calcola_retta_interpolante (lista, NP)
    integer n
    float SXY, SX, SY, SXQ
    float a,b
    SXY = 0
    SX = 0
    SY = 0
    SXQ = 0
    for n=1 to NP
        SXY = (lista(1,n) * lista(2,n)) + SXY
        SX = lista(1,n) + SX
        SY = lista(1,n) + SY
        SXQ = lista(1,n)*lista(1,n) + SXQ
    next n
    a = (SXY - SX * SY) / (NP * SXQ - (SX * SX))
    b = (SXQ * SY - SX * SY) / (NP * SXQ - (SX * SX))
    return (a,b) <- dove a e b sono i coefficienti dell'equazione y = ax+b
disegna_segmento(lista, NP, a,b)
    float c, x1, y1, x2, y2
    c = lista(1,1) / a + lista(2,1)
    x1 = (c-b)/(a+ 1/a)
    y1 = a * x1 + b
    c = lista(1,NP) / a + lista(2,NP)
    x2 = (c-b)/(a+ 1/a)
    y2 = a * x1 + b
    linea ( x1, y1, x2, y2)
premetto che questo programma va in malora se la retta interpolante è x =
costante, ma per ora mi andrebbe bene anche così.
Grazie di cuore a chi, in tempi brevi, mi darà il listato funzionante.
Inoltre, se qualcuno conosce un buon libro per autodidatti di AUTOLISP, lo
ringrazio pure.
Saluti
--
Angelo M. Figundio
ang...@figundio.it
www.figundio.it
***********************************************
E il mio signore lo sa
una sola volta non basterà
che l'avvoltoio divori il mio corpo
per far tacere per sempre il mio cuore
(A. Branduardi)
*******************************************

Inoltre, se qualcuno conosce un buon libro per autodidatti di AUTOLISP, lo
Ecco la routine, anche se in VBA:
Public Sub RettaInterpolante()
    Dim Sset As Object
    Dim Punto As AcadPoint
    Dim GroupCode(0) As Integer
    Dim DataValue(0) As Variant
    Dim ListaPunti(0 To 1, 0 To 100) As Double
    Dim RiempListaPunti As Integer
    Dim LineaInterpolante As AcadLine
    Dim StartPoint(0 To 2) As Double
    Dim EndPoint(0 To 2) As Double
 
'    On Error GoTo ErrorTrap
 
' Creo un nuovo set di selezione
    Set Sset = ThisDrawing.SelectionSets.Add("PointToInterpolate")
' Filtro solo i punti
    GroupCode(0) = 0
    DataValue(0) = "POINT"
    Sset.SelectOnScreen GroupCode, DataValue 'Acquisisce i Punti.
' Calcola le coordinate di tutti i punti
    RiempListaPunti = -1
    For Each Punto In Sset
        RiempListaPunti = RiempListaPunti + 1
        ListaPunti(0, RiempListaPunti) = Punto.Coordinates(0)
        ListaPunti(1, RiempListaPunti) = Punto.Coordinates(1)
    Next
' Il tuo algoritmo per il calcolo della retta interpolante
    SXY = 0
    SX = 0
    SY = 0
    SXQ = 0
    For n = 0 To RiempListaPunti
        SXY = (ListaPunti(0, n) * ListaPunti(1, n)) + SXY
        SX = ListaPunti(0, n) + SX
        SY = ListaPunti(0, n) + SY
        SXQ = ListaPunti(0, n) * ListaPunti(0, n) + SXQ
    Next n
    a = (SXY - SX * SY) / (RiempListaPunti * SXQ - (SX * SX))
    b = (SXQ * SY - SX * SY) / (RiempListaPunti * SXQ - (SX * SX))
' Disegna il segmento
    c = ListaPunti(0, 1) / a + ListaPunti(1, 1)
    StartPoint(0) = (c - b) / (a + 1 / a)
    StartPoint(1) = a * x1 + b
    StartPoint(2) = 0
    c = ListaPunti(0, RiempListaPunti) / a + ListaPunti(1,
RiempListaPunti)
    EndPoint(0) = (c - b) / (a + 1 / a)
    EndPoint(1) = a * x1 + b
    EndPoint(2) = 0
    Set LineaInterpolante = ThisDrawing.ModelSpace.AddLine(StartPoint,
EndPoint)
    ZoomAll
    Sset.Delete  'Cancella il set di selezione
    Exit Sub
 
ErrorTrap:
    ThisDrawing.SelectionSets.Item("PointToInterpolate").Delete
'Cancella il set di selezione
End Sub
Saluti, Aniello
-- 
Aniello Annunziata
Content Director Manager
www.cadlandia.com
aniello.a...@cadlandia.com
Per rispondermi in privato, togli NOGARBAGE dall'indirizzo