Files
linuxcncAllWasm/nc_files/nurbs/G6/Rhino_Convert_NURBS.rvb
2026-08-20 06:17:39 +08:00

326 lines
16 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Option Explicit
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''
' Description
' Divides a curve based on the linear distance between points.
'
Sub CREA_CODE
'La curva chiusa è spezzata; dopodichè è suddivisa in segmenti, per ogni segmento sono generate le istruzioni NC in formato NURBS
'Dim strPoint, strText, dblWeight, Gcode, dblDegree, dblknot_vector
Dim cc
'Rhino.MessageBox ("Dalla barra di comando inserire 1 per realizzare l'interpolazione NURBS tramite movimento circolare (con incrementi du=cost), 2 per realizzare l'interpolazione NURBS tramite movimento circolare (con incrementi ds=cost), 3 per realizzare l'interpolazione NURBS tramite movimento lineare (con incrementi ds=cost) oppure non inserire nulla (premere invio) per lasciare la scelta al CN in funzione del valore assunto dall'incremento ds")
cc=Rhino.GetInteger("Selezionare la modalità di interpolazione NURBS inserendo 1,2,3 oppure premere direttamente invio")
Dim F, S
Dim PP
'Rhino.MessageBox ("Dalla barra di comando inserire il valore dell'avanzamento [mm/min] con il quale eseguire l'interpolazione NURBS")
F=Rhino.GetString("Inserire l'avanzamento [mm/min] con il quale eseguire l'interpolazione NURBS")
S=Rhino.GetString("Inserire la velocità di taglio in [m/min] ")
PP=Rhino.GetString("Inserire la profondità di passata [mm]")
Dim G
Dim III
'Chiede all'utente di specificare un nome di file
Dim strFilter, strFileName
strFilter = " File NGC (*.ngc)|*.ngc|All Files (*.*)|*.*||"
strFileName = Rhino.SaveFileName("Save Code NC ", strFilter)
If IsNull(strFileName) Then Exit Sub
' Ottieni i file system dall'oggetto
Dim objFSO, objStream
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Aprire un file di testo da scrivere
On Error Resume Next
Set objStream = objFSO.CreateTextFile(strFileName, True)
If Err Then
MsgBox Err.Description
Exit Sub
End If
objStream.WriteLine("G21 G40 G54 G90 G94")
objStream.WriteLine("G0 Z50")
objStream.WriteLine("X0Y0")
objStream.WriteLine("M6 T0")
objStream.WriteLine("G96 M3 S"+ CStr (S))
objStream.WriteLine("G0 Z50 (movimento per avvicinarsi alla posizione di taglio)")
Dim var
var=1
For III =1 To 100 Step 1 'Il numero massimo di curve selezionabili è fissato pari a 100
If(var=1)Then
G=1
var=2
Else
G=Rhino.GetInteger("Inserire 1 per acquisire una nuova curva, altrimenti 0 per chiudere il ciclo")
End If
If (G=1) Then
objStream.WriteLine("(Curva acquisita N°="+CStr (III)+")")
If(III>1) Then
End If
Const rhCurveObject = 4
Dim sCurve, strObject, CRV
CRV= Rhino.GetObject("Selezionare la curva NURBS", rhCurveObject)
Rhino.Print ("Curva NURBS acquisita")
If IsNull(CRV) Then Exit Sub
Dim arrDomain
If Rhino.IsCurve(CRV) Then
arrDomain = Rhino.CurveDomain(CRV)
End If
'Dim ij,pt
'For ij=(arrDomain(1)-0.0001) To arrDomain(1) Step 0.0001
' pt = Rhino.EvaluateCurve(CRV, ij) 'PUNTO APPARTENENTE ALLA CRVA
' Rhino.AddPoint pt
'Next
Dim tt0, tt1
tt0 = (arrDomain(1)-0.0001)
tt1 = arrDomain(1)
sCurve= Rhino.TrimCurve(CRV, Array(tt1, tt0),vbFalse )
strObject=sCurve
'Rhino.DeleteObject (sCurva)
'Rhino.DeleteObject (strObject)
Rhino.EnableRedraw True
',vbFalse
'Ottieni i punti di controllo della curva
Dim arrPoints, intCount
arrPoints = Rhino.CurvePoints(strObject)
intCount = Rhino.CurvePointCount(strObject)
If Not IsArray(arrPoints) Then Exit Sub
'Ottieni i valori dei peso dei punti di controllo della curva
Dim arrWeights
arrWeights = Rhino.CurveWeights(strObject) 'IL VALORE 2.555 LO RESTITUISCE CON LA VIRGOLA 2,555 lo modifico manualmente
If Not IsArray(arrWeights) Then Exit Sub
'Ottieni il grado della curva
Dim intDegree, k, n, c, U
intDegree = Rhino.CurveDegree(strObject)
'If Not IsInt(intDegree) Then Exit Sub
k=intDegree+1 'ordine NURBS
n=intCount-1 ' i punti di controllo vanno da {P0.....Pn} se fossero 7 n=6
Dim knot_vector()'si crea un vettore grande (l'ideale n+k)
Dim ii, intRankK
c= (n+k)
For ii=0 To c Step 1 ' esegue finchè¨ i<=n+k la dimensione del vettore dei nodi(m+1)= n+k+1; k grado n numero complessivo dei punti di controllo;i parte da 0
If (ii < k) Then ' se i<k definisce come calore x il knot=0 NB {00._0kvolte In ; esegue questo ciclo k volte visto che parte da 0
ReDim Preserve knot_vector(ii)
knot_vector(ii) = 0' Aggiunge un elelemnto 0
ElseIf (ii >= k And ii <= n)Then ' Se In Knot considerato va da <k< a <n< allora porrà il knot =i-k+1
ReDim Preserve knot_vector(ii)
knot_vector(ii)=(ii - k + 1)' n=7 k=4 i=k, knot=1 ecc... i=k+1 knot=2 etc..(uniformi)
Else
ReDim Preserve knot_vector(ii)
knot_vector(ii)=(n - k + 2)' nel momento In cui i>n knot=n-k+2
End If
Next
intRankK = c+1 ' +1 perchè c'è sempre il discorso il il numero dei punti di controllo intCount=n+1
'Rhino.MessageBox ("il grado della curva NURBS è ="&" "&intDegree)
'Rhino.MessageBox ("il numero dei punti di controllo è ="&" "&intCount)
'Rhino.MessageBox ("la dimensione del vettorei dei nodi ="&" "&intRankK)
Dim intBB
intBB=(intCount)/k'se l'ordine della NURBS è uguale a k il numero minimo dei punti è pari a 4.
'k=4 n=4 knot=(0000, 1111)
Dim sud
sud=0
'Suddivisione delle curva
'Rhino.MessageBox ("La curva è suddivisa in "&" "&intBB)
If(intBB >=2000000000)Then 'la suddivisione è condotta solo se bb>=2 ovvero solo se la curva può essere suddivisa in due o più tratti
sud=1
objStream.WriteLine(" X... Y...")
objStream.WriteLine(" Z1")
objStream.WriteLine(" G1 Z"+ CStr (PP)+ " F"+ CStr (F))
Dim nSegments, aPoints
nSegments = intBB
aPoints = Rhino.DivideCurve(strObject, nSegments) 'questo comando divide la curva in segmenti e ne memorizza gli estremi
If Not IsArray(aPoints) Then Exit Sub
Rhino.EnableRedraw False
Dim i, t0, t1, CCurva
For i = 0 To UBound(aPoints) - 1
t0 = Rhino.CurveClosestPoint(strObject, aPoints(i))
t1 = Rhino.CurveClosestPoint(strObject, aPoints(i+1))
CCurva= Rhino.TrimCurve(strObject, Array(t0, t1), vbFalse)
'strObject=CCurva
''''''''''''''''''''''''''''''''
'Ottieni i punti di controllo della curva
arrPoints = Rhino.CurvePoints(CCurva)
intCount = Rhino.CurvePointCount(CCurva)
If Not IsArray(arrPoints) Then Exit Sub
'Ottieni i valori dei peso dei punti di controllo della curva
arrWeights = Rhino.CurveWeights(CCurva) 'IL VALORE 2.555 LO RESTITUISCE CON LA VIRGOLA 2,555 lo modifico manualmente
If Not IsArray(arrWeights) Then Exit Sub
'Ottieni il grado della curva
intDegree = Rhino.CurveDegree(CCurva)
'If Not IsInt(intDegree) Then Exit Sub
k=intDegree+1 'ordine NURBS
n=intCount-1 ' i punti di controllo vanno da {P0.....Pn} se fossero 7 n=6
c= (n+k)
For ii=0 To c Step 1 ' esegue finchè i<=n+k la dimensione del vettore dei nodi(m+1)= n+k+1; k grado n numero complessivo dei punti di controllo;i parte da 0
If (ii < k) Then ' se i<k definisce come calore x il knot=0 NB {00._0kvolte In ; esegue questo ciclo k volte visto che parte da 0
ReDim Preserve knot_vector(ii)
knot_vector(ii) = 0' Aggiunge un elelemnto 0
ElseIf (ii >= k And ii <= n)Then ' Se In Knot considerato va da <k< a <n< allora porrà il knot =i-k+1
ReDim Preserve knot_vector(ii)
knot_vector(ii)=(ii - k + 1)' n=7 k=4 i=k, knot=1 ecc... i=k+1 knot=2 etc..(uniformi)
Else
ReDim Preserve knot_vector(ii)
knot_vector(ii)=(n - k + 2)' nel momento In cui i>n knot=n-k+2
End If
Next
intRankK = c+1 ' +1 perchè c'è sempre il discorso il il numero dei punti di controllo intCount=n+1
'Rhino.MessageBox ("il grado della curva NURBS è ="&" "&intDegree)
'Rhino.MessageBox ("il numero dei punti di controllo è ="&" "&intCount)
'Rhino.MessageBox ("la dimensione del vettorei dei nodi ="&" "&intRankK)
' Write each point as text to the file (Scrivere nel file ogni punto come testo )
' Write each point as text to the file
Dim strPoint, strText, dblWeight, Gcode, dblDegree, dblknot_vector, j, jj
Gcode=Split(Rhino.Pt2Str(arrPoints(0)),",")
'objStream.WriteLine(" X"+Gcode(0)+" Y"+Gcode(1))
'objStream.WriteLine(" Z1")
'objStream.WriteLine(" G1 Z"+ CStr (PP)+ " F"+ CStr (F))
' this changes are untestet, because I do not have Rhino jjf
' objStream.WriteLine("#1="+ CStr (cc)) jjf
' objStream.WriteLine("G6.2 X"+Gcode(0)+" Y"+Gcode(1)+ " R" +Replace(arrWeights(0),",",".")+" K"+CStr(knot_vector(0))+" P"+ CStr(k)+ " F"+ CStr (F)) jjf
objStream.WriteLine(" F"+ CStr (F))
objStream.WriteLine("G6.2 X"+Gcode(0)+" Y"+Gcode(1)+ " R" +Replace(arrWeights(0),",",".")+" K"+CStr(knot_vector(0))+" P"+ CStr(k)+ " Q"+ CStr (cc))
For j =1 To intCount-1
Gcode=Split(Rhino.Pt2Str(arrPoints(j)),",")
objStream.WriteLine(" X"+Gcode(0)+" Y"+Gcode(1)+ " R" + Replace(arrWeights(j),",",".")+" K"+CStr(knot_vector(j)))
Next
For jj =intCount To (n+k) Step 1
objStream.WriteLine( "G6.2 K" & knot_vector(jj))'NB se la curva non avesse gli ultimi tre nodi con molteplicità piena si avrebbe un errore, i nodi programmati non coincidono con quelli della curva.
Next
'objStream.WriteLine("G1 X"+Gcode(0)+" Y"+Gcode(1)+ " Z1")
'objStream.WriteLine("G0 X"+Gcode(0)+" Y"+Gcode(1)+ " Z50")
Rhino.DeleteObject (CCurva)'Questo comando cancella il segmento di curva generato
'Rhino.DeleteObject (sCurva)
'Rhino.DeleteObject (strObject)
Next
'objStream.WriteLine("G1 X...Y...Z...(inserire posizione per all'ontanarsi dal profilo)")
'objStream.WriteLine("G0 Z50")
'objStream.WriteLine("M5")
'objStream.WriteLine("M2")
Else 'se il numero dei punti di controllo fosse <2*ordine
'Ottieni i valori dei peso dei punti di controllo della curva
arrWeights = Rhino.CurveWeights(strObject) 'IL VALORE 2.555 LO RESTITUISCE CON LA VIRGOLA 2,555 lo modifico manualmente
If Not IsArray(arrWeights) Then Exit Sub
'Ottieni il grado della curva
intDegree = Rhino.CurveDegree(strObject)
'If Not IsInt(intDegree) Then Exit Sub
k=intDegree+1 'ordine NURBS
n=intCount-1 ' i punti di controllo vanno da {P0.....Pn} se fossero 7 n=6
c= (n+k)
For ii=0 To c Step 1 ' esegue finchè i<=n+k la dimensione del vettore dei nodi(m+1)= n+k+1; k grado n numero complessivo dei punti di controllo;i parte da 0
If (ii < k) Then ' se i<k definisce come calore x il knot=0 NB {00._0kvolte In ; esegue questo ciclo k volte visto che parte da 0
ReDim Preserve knot_vector(ii)
knot_vector(ii) = 0' Aggiunge un elelemnto 0
ElseIf (ii >= k And ii <= n)Then ' Se In Knot considerato va da <k< a <n< allora porrà il knot =i-k+1
ReDim Preserve knot_vector(ii)
knot_vector(ii)=(ii - k + 1)' n=7 k=4 i=k, knot=1 ecc... i=k+1 knot=2 etc..(uniformi)
Else
ReDim Preserve knot_vector(ii)
knot_vector(ii)=(n - k + 2)' nel momento In cui i>n knot=n-k+2
End If
Next
intRankK = c+1 ' +1 perchè c'è sempre il discorso il il numero dei punti di controllo intCount=n+1
'Rhino.MessageBox ("il grado della curva NURBS è ="&" "&intDegree)
'Rhino.MessageBox ("il numero dei punti di controllo è ="&" "&intCount)
'Rhino.MessageBox ("la dimensione del vettorei dei nodi ="&" "&intRankK)
' Write each point as text to the file (Scrivere nel file ogni punto come testo )
' Write each point as text to the file
'Dim strPoint, strText, dblWeight, Gcode, dblDegree, dblknot_vector, j, jj
Gcode=Split(Rhino.Pt2Str(arrPoints(0)),",")
objStream.WriteLine(" X"+Gcode(0)+" Y"+Gcode(1))
objStream.WriteLine(" Z1")
objStream.WriteLine(" G1 Z"+ CStr (PP)+ " F"+ CStr (F))
objStream.WriteLine("#1="+ CStr (cc))
objStream.WriteLine("G6.2 X"+Gcode(0)+" Y"+Gcode(1)+ " R" +Replace(arrWeights(0),",",".")+" K"+CStr(knot_vector(0))+" P"+ CStr(k)+ " F"+ CStr (F))
For j =1 To intCount-1
Gcode=Split(Rhino.Pt2Str(arrPoints(j)),",")
objStream.WriteLine(" X"+Gcode(0)+" Y"+Gcode(1)+ " R" + Replace(arrWeights(j),",",".")+" K"+CStr(knot_vector(j)))
Next
For jj =intCount To (n+k) Step 1
objStream.WriteLine( "K" & knot_vector(jj))'NB se la curva non avesse gli ultimi tre nodi con molteplicità piena si avrebbe un errore, i nodi programmati non coincidono con quelli della curva.
Next
objStream.WriteLine("G1 X"+Gcode(0)+" Y"+Gcode(1)+ " Z1")
objStream.WriteLine("G0 X"+Gcode(0)+" Y"+Gcode(1)+ " Z50")
End If
Rhino.DeleteObject (sCurva)
Rhino.DeleteObject (strObject)
Else
Rhino.DeleteObject (sCurva)
Rhino.DeleteObject (strObject)
If(sud >=1) Then
objStream.WriteLine("G1 X"+Gcode(0)+" Y"+Gcode(1)+ " Z1")
objStream.WriteLine("G0 X"+Gcode(0)+" Y"+Gcode(1)+ " Z50")
End If
objStream.WriteLine("M5")
objStream.WriteLine("M2")
Exit Sub
End If
Rhino.EnableRedraw True
Next
End Sub