utility DNAmodel "DNA model" ( -- local variables --------------------------------------------------------------------- local DNAstring="3", DNAmesh, DNAmat, DNAcube, DNAtessera, DNAcircle local FractalOrder=0, Fractalindex=1, FractalString="1", TotalLinks=0, ProgressFactor=1.0, NestedPF=1.0, prevLinkNo=0 local mshVerts=0, mshFaces=0, LinkIndex=0, LinkNum=0, LinkFlag=false local halfStepH=0.0, stepH=0.0, ShiftH=0.0, DiagRung=[0,0,0], SpagoOx=[0,0,0], SpagoOz=[0,0,0] local TesseraBox, CubeShp, CubeVerts=#(0,0,0,0,0,0,0,0), CubeShpM3=matrix3 1 local HelixCircle, instHCircle local meshDEE, meshSPAGO, instDEE2, instDEE3, instDEE, instSPAGO, instRing, instCube, instTessera, deeID=3 local MDEEcurrent=matrix3 1, PCubeCurrent=[0,0,0], M120rot=matrix3 [-0.5,0.86602539,0] [-0.86602539,-0.5,0] [0,0,1] [0,0,0] local MrotAxToLocal=matrix3 1, MLocalToRotAx=matrix3 1, Mrot=matrix3 [-1, 0, 0] [0, -1, 0] [0, 0, 1] [0, 0, 0] -- local functions --------------------------------------------------------------------- local NpointCircle, StructuralMatter, StringReader, StringReaderCube, SelectTessera -- local rollouts --------------------------------------------------------------------- local MeshParameters, DNAconstruct function NpointCircle radius:100 N:3 prefix:"NpCircle" wireColor:[200, 230, 255] = ( local fe=360.0/N local P0=[-radius*sin(fe/2),radius*cos(fe/2),0] local P1=[0,0,0] local P2=[0,0,0] local P3=[0,0,0] P1.y=(4*radius-P0.y)/3 P1.x=-P0.y*(P1.y-P0.y)/P0.x+P0.x P2.x=-P1.x; P2.y=P1.y P3.x=-P0.x; P3.y=P0.y --Segment drawing local Segment = SplineShape() addNewSpline Segment addKnot Segment 1 #bezierCorner #curve P0 P0 P1 addKnot Segment 1 #bezierCorner #curve P3 P2 P3 updateShape Segment --Circle assembling local NpCircle = SplineShape prefix:prefix wireColor:wireColor NpCircle.transform=matrix3 [0,-1,0] [1,0,0] [0,0,1] [0,0,0] for i=1 to N do ( copySeg=copy Segment addAndWeld NpCircle copySeg 0.1 updateShape NpCircle rot = eulerangles 0 0 fe rotate Segment rot ) delete Segment close NpCircle 1 updateShape NpCircle NpCircle ) -- end of fn NpointCircle function createDNAmat = ( DNAmat=multimaterial numsubs:4 DNAmat.name="DNA Material" DNAmat.materialList[1].twoSided=true; DNAmat.materialList[1].diffuse=[255, 12, 0] -- Red DNAmat.materialList[2].twoSided=true; DNAmat.materialList[2].diffuse=[80, 230, 0] -- Green DNAmat.materialList[3].twoSided=true; DNAmat.materialList[3].diffuse=[0, 105, 255] -- Blue DNAmat.materialList[4].twoSided=true; DNAmat.materialList[4].diffuse=[225, 145, 90] -- Yellow ) -- end of fn createDNAmat function StructuralMatter r Dsteps Hsteps create:false tweakRad:false = ( -- A = 120 deg, cosA=-0.5, sinA=0.86602539 stepH=0.70710677*r; ShiftH=2*stepH; halfStepH=0.5*stepH -- stepH=r/sqrt(2) DiagRung=[-2*r, 0, stepH] SpagoOx=[-r, 0, halfStepH]; SpagoOz=[halfStepH, 0, r] local Center=[0, 0, 0.083333351*stepH], halfR=0.5*r, RsinA=r*0.86602539, k=1.16666667 -- k=7.0/6.0 local CV1=CubeVerts[1]=[k*r, 0, 0]-Center local CV2=CubeVerts[2]=k*[halfR, RsinA, stepH]-Center local CV3=CubeVerts[3]=k*[-halfR, RsinA, 0]-Center local CubeEdge=CubeVerts[1]-CubeVerts[2] local CV4=CubeVerts[4]=CubeVerts[3]+CubeEdge local CV5=CubeVerts[5]=k*[-r, 0, stepH]-Center local CV6=CubeVerts[6]=k*[-halfR, -RsinA, 0]-Center local CV7=CubeVerts[7]=k*[halfR, -RsinA, stepH]-Center local CV8=CubeVerts[8]=CubeVerts[7]+CubeVerts[5]-CubeVerts[6] local Xshift1=2.2*r, Xshift2=4.2*r local pos=[0, 0, 0.5*stepH] if create then ( -- HelixCircle -------------------------------------------------------------------------------------------------------------- HelixCircle=NpointCircle radius:r prefix:"Sample_helixCircle" wireColor:[200, 230, 255] HelixCircle.adaptive=true HelixCircle.pos=[Xshift1, 0, 0] instHCircle=copy HelixCircle prefix:"Sample_helixCircle" wireColor:[200, 230, 255] HelixCircle.pos=[Xshift1, 0, stepH] -- CubeShp ------------------------------------------------------------------------------------------------------------------ CubeShp=SplineShape prefix:"Sample_CubeOutline" wireColor:[30, 200, 100] CubeShp.transform=CubeShpM3=matrix3 (normalize (CV1-CV4)) (normalize (CV2-CV1)) (normalize (CV7-CV1)) pos PCubeCurrent=CubeShpM3.row4 addNewSpline CubeShp addKnot CubeShp 1 #corner #line CV1 addKnot CubeShp 1 #corner #line CV2 addKnot CubeShp 1 #corner #line CV3 addKnot CubeShp 1 #corner #line CV4 close CubeShp 1 addNewSpline CubeShp addKnot CubeShp 2 #corner #line CV5 addKnot CubeShp 2 #corner #line CV6 addKnot CubeShp 2 #corner #line CV7 addKnot CubeShp 2 #corner #line CV8 close CubeShp 2 addNewSpline CubeShp addKnot CubeShp 3 #corner #line CV1 addKnot CubeShp 3 #corner #line CV7 addNewSpline CubeShp addKnot CubeShp 4 #corner #line CV2 addKnot CubeShp 4 #corner #line CV8 addNewSpline CubeShp addKnot CubeShp 5 #corner #line CV3 addKnot CubeShp 5 #corner #line CV5 addNewSpline CubeShp addKnot CubeShp 6 #corner #line CV4 addKnot CubeShp 6 #corner #line CV6 updateShape CubeShp move CubeShp [Xshift1, 0, 0] -- MrotAxToLocal ----------------------------------------------------------------------------------------------------------- local rotAxis=normalize (0.5*(CV2+CV8)-pos) local spsi=rotAxis.x, cpsi=sqrt(1-spsi*spsi), sfee=0.0, cfee=1.0 if cpsi!=0.0 do (sfee=rotAxis.y/cpsi; cfee=rotAxis.z/cpsi) local Mfee=matrix3 [1,0,0] [0, cfee, -sfee] [0, sfee, cfee] [0,0,0] local Mpsi=matrix3 [cpsi, 0, -spsi] [0,1,0] [spsi, 0, cpsi] [0,0,0] MrotAxToLocal=Mpsi*Mfee; MrotAxToLocal.row4=[0,0,-1.5*stepH] MLocalToRotAx=inverse MrotAxToLocal -- TesseraBox -------------------------------------------------------------------------------------------------------------- CubeEdge=(length CubeEdge)/7.0 TesseraBox=box length:CubeEdge width:CubeEdge height:CubeEdge prefix:"Sample_Tessera" wireColor:[30, 200, 100] TesseraBox.objectOffsetPos=[0,0,-0.5*CubeEdge] TesseraBox.transform=CubeShpM3 move TesseraBox [Xshift1, 0, 0] -- meshDEE and meshSPAGO ----------------------------------------------------------------------------------------------------------- local Dverts=2+Dsteps, Hverts=2+Hsteps local Dfaces=1+Dsteps, Hfaces=1+Hsteps mshVerts=Dverts*Hverts; mshFaces=2*Dfaces*Hfaces local VI=1, FI=0, F1=[1,1,1], F2=[1,1,1], VIperiod=0 meshDEE=mesh numverts:mshVerts numfaces:mshFaces meshDEE.wireColor=[225, 5, 0] meshDEE.name="Sample_DEE" meshSPAGO=mesh numverts:mshVerts numfaces:mshFaces meshSPAGO.wireColor=[225, 145, 90] meshSPAGO.name="Sample_SPAGO" local sfee=-0.33333333, cfee=0.94280905 meshSPAGO.transform=matrix3 [cfee, 0, sfee] [0, 1, 0] [-sfee, 0, cfee] [0, 0, 0.5*stepH] local P1=[r,0,0], P2=P1, stepVec=DiagRung/Dfaces, stepLength=3*stepH/Dfaces, RadDiag=1.5*stepH local DrungPoints=#() DrungPoints.count=Dverts DrungPoints[1]=[r, 0.0, RadDiag] setVert meshDEE 1 P1 setVert meshSPAGO 1 P1 for j=2 to Dverts do ( VI+=1 P1+=stepVec RadDiag-=stepLength DrungPoints[j]=[P1.x, P1.z, RadDiag] setVert meshDEE VI P1 setVert meshSPAGO VI P1 ) local dA1=120.0/Hfaces, A1=0.0, cosA1=0.0, sinA1=0.0 local dA2=180.0/Hfaces, A2=0.0, cosA2=0.0, sinA2=0.0 local dH=2*stepH/Hfaces, H=0.0, H2=meshSPAGO.pos.z, DrP=[0,0,0] local P2x=0.0 for i=2 to Hverts do ( VI+=1; A1+=dA1; A2+=dA2; H+=dH; H2+=dH DrP=DrungPoints[1] cosA1=cos A1; sinA1=sin A1 cosA2=cos A2; sinA2=sin A2 P1=[DrP.x*cosA1, DrP.x*sinA1, DrP.y+H] P2x=DrP.z*cosA2 P2=[P2x*cfee, DrP.z*sinA2, H2+P2x*sfee] setVert meshDEE VI P1 setVert meshSPAGO VI P2 for j=2 to Dverts do ( VI+=1 DrP=DrungPoints[j] P1=[DrP.x*cosA1, DrP.x*sinA1, DrP.y+H] P2x=DrP.z*cosA2 P2=[P2x*cfee, DrP.z*sinA2, H2+P2x*sfee] setVert meshDEE VI P1 setVert meshSPAGO VI P2 VIperiod=VI-Dverts F1=[VI, VI-1, VIperiod-1] F2=[VI, F1.z, VIperiod] FI+=1 setFace meshDEE FI F1 setFace meshSPAGO FI F1 setEdgeVis meshDEE FI 1 true; setEdgeVis meshSPAGO FI 1 true setEdgeVis meshDEE FI 2 true; setEdgeVis meshSPAGO FI 2 true setEdgeVis meshDEE FI 3 true; setEdgeVis meshSPAGO FI 3 true FI+=1 setFace meshDEE FI F2 setFace meshSPAGO FI F2 setEdgeVis meshDEE FI 1 true; setEdgeVis meshSPAGO FI 1 true setEdgeVis meshDEE FI 2 true; setEdgeVis meshSPAGO FI 2 true setEdgeVis meshDEE FI 3 true; setEdgeVis meshSPAGO FI 3 true ) ) for FI=1 to mshFaces do setFaceMatID meshSPAGO FI 4 update meshDEE update meshSPAGO move meshDEE [Xshift1, 0, 0] move meshSPAGO [Xshift2, 0, 0] ) else -- tweak parameters -------------------------------------------------------------------------------------------------------------------------------- ( if tweakRad do ( -- HelixCircle -------------------------------------------------------------------------------------------------------------- delete #(HelixCircle, instHCircle) HelixCircle=NpointCircle radius:r prefix:"helixCircle" wireColor:[200, 230, 255] HelixCircle.adaptive=true HelixCircle.pos=[Xshift1, 0, 0] instHCircle=copy HelixCircle wireColor:[200, 230, 255] HelixCircle.pos=[Xshift1, 0, stepH] -- TesseraBox -------------------------------------------------------------------------------------------------------------- TesseraBox.pos=PCubeCurrent=CubeShpM3.row4=pos CubeEdge=(length CubeEdge)/7.0 TesseraBox.length=TesseraBox.width=TesseraBox.height=CubeEdge TesseraBox.objectOffsetPos=[0,0,-0.5*CubeEdge] move TesseraBox [Xshift1, 0, 0] -- CubeShp ----------------------------------------------------------------------------------------------------------------- CubeShp.pos=pos for i=1 to 4 do setKnotPoint CubeShp 1 i CubeVerts[i] for i=1 to 4 do setKnotPoint CubeShp 2 i CubeVerts[i+4] setKnotPoint CubeShp 3 1 CV1 setKnotPoint CubeShp 3 2 CV7 setKnotPoint CubeShp 4 1 CV2 setKnotPoint CubeShp 4 2 CV8 setKnotPoint CubeShp 5 1 CV3 setKnotPoint CubeShp 5 2 CV5 setKnotPoint CubeShp 6 1 CV4 setKnotPoint CubeShp 6 2 CV6 updateShape CubeShp move CubeShp [Xshift1, 0, 0] ) -- MrotAxToLocal ----------------------------------------------------------------------------------------------------------- MrotAxToLocal.row4=[0,0,-1.5*stepH] MLocalToRotAx=inverse MrotAxToLocal -- meshDEE and meshSPAGO ----------------------------------------------------------------------------------------------------------- local Dverts=2+Dsteps, Hverts=2+Hsteps local Dfaces=1+Dsteps, Hfaces=1+Hsteps local mshVerts=Dverts*Hverts, mshFaces=2*Dfaces*Hfaces local VI=1, FI=0, F1=[1,1,1], F2=[1,1,1], VIperiod=0 meshDEE.numverts=meshSPAGO.numverts=0 meshDEE.numfaces=meshSPAGO.numfaces=0 meshDEE.transform=matrix3 1 local sfee=-0.33333333, cfee=0.94280905 meshSPAGO.transform=matrix3 [cfee, 0, sfee] [0, 1, 0] [-sfee, 0, cfee] [Xshift2, 0, 0.5*stepH] meshDEE.numverts=meshSPAGO.numverts=mshVerts meshDEE.numfaces=meshSPAGO.numfaces=mshFaces local P1=[r,0,0], P2=P1, stepVec=DiagRung/Dfaces, stepLength=3*stepH/Dfaces, RadDiag=1.5*stepH local DrungPoints=#() DrungPoints.count=Dverts DrungPoints[1]=[r, 0.0, RadDiag] setVert meshDEE 1 P1 setVert meshSPAGO 1 [P1.x+Xshift2, 0, 0] for j=2 to Dverts do ( VI+=1 P1+=stepVec RadDiag-=stepLength DrungPoints[j]=[P1.x, P1.z, RadDiag] setVert meshDEE VI P1 setVert meshSPAGO VI [P1.x+Xshift2, 0, P1.z] ) local dA1=120.0/Hfaces, A1=0.0, cosA1=0.0, sinA1=0.0 local dA2=180.0/Hfaces, A2=0.0, cosA2=0.0, sinA2=0.0 local dH=2*stepH/Hfaces, H=0.0, H2=meshSPAGO.pos.z, DrP=[0,0,0] local P2x=0.0 for i=2 to Hverts do ( VI+=1; A1+=dA1; A2+=dA2; H+=dH; H2+=dH DrP=DrungPoints[1] cosA1=cos A1; sinA1=sin A1 cosA2=cos A2; sinA2=sin A2 P1=[DrP.x*cosA1, DrP.x*sinA1, DrP.y+H] P2x=DrP.z*cosA2 P2=[P2x*cfee+Xshift2, DrP.z*sinA2, H2+P2x*sfee] setVert meshDEE VI P1 setVert meshSPAGO VI P2 for j=2 to Dverts do ( VI+=1 DrP=DrungPoints[j] P1=[DrP.x*cosA1, DrP.x*sinA1, DrP.y+H] P2x=DrP.z*cosA2 P2=[P2x*cfee+Xshift2, DrP.z*sinA2, H2+P2x*sfee] setVert meshDEE VI P1 setVert meshSPAGO VI P2 VIperiod=VI-Dverts F1=[VI, VI-1, VIperiod-1] F2=[VI, F1.z, VIperiod] FI+=1 setFace meshDEE FI F1 setFace meshSPAGO FI F1 setEdgeVis meshDEE FI 1 true; setEdgeVis meshSPAGO FI 1 true setEdgeVis meshDEE FI 2 true; setEdgeVis meshSPAGO FI 2 true setEdgeVis meshDEE FI 3 true; setEdgeVis meshSPAGO FI 3 true FI+=1 setFace meshDEE FI F2 setFace meshSPAGO FI F2 setEdgeVis meshDEE FI 1 true; setEdgeVis meshSPAGO FI 1 true setEdgeVis meshDEE FI 2 true; setEdgeVis meshSPAGO FI 2 true setEdgeVis meshDEE FI 3 true; setEdgeVis meshSPAGO FI 3 true ) ) for FI=1 to mshFaces do setFaceMatID meshSPAGO FI 4 update meshDEE update meshSPAGO move meshDEE [Xshift1, 0, 0] ) ) -- end of fn CubeOutline function StringReaderCube Str straight:true = ( if straight do ( if isValidNode DNAcube do delete DNAcube DNAcube=SplineShape prefix:"DNA_CubeOutlines" wireColor:[30, 200, 100] if isValidNode DNAtessera do delete DNAtessera DNAtessera=mesh numverts:0 numfaces:0 DNAtessera.name="DNA_Tessera" DNAtessera.wireColor=[30, 200, 100] ProgressFactor=100.0/Str.count Fractalindex=1 ) local charNum=Str.count, char="", Num=0 for j=1 to charNum do ( char=Str[j] case of ( (Num=char as integer; Num!=undefined and Num!=0): ( for i=1 to Num do ( instCube=copy CubeShp; instTessera=copy TesseraBox instCube.pos=instTessera.pos=PCubeCurrent addAndWeld DNAcube instCube 0.0 attach DNAtessera instTessera -- next M3current calculation -------------------------- MDEEcurrent=M120rot*MDEEcurrent PCubeCurrent=PCubeCurrent+ShiftH*MDEEcurrent.row3 ) ) (char=="S" or char=="s"): ( instCube=copy CubeShp; instTessera=copy TesseraBox instCube.pos=instTessera.pos=PCubeCurrent addAndWeld DNAcube instCube 0.0 attach DNAtessera instTessera MDEEcurrent=MLocalToRotAx*Mrot*MrotAxToLocal*MDEEcurrent PCubeCurrent=PCubeCurrent+ShiftH*MDEEcurrent.row3 ) (Fractalindex<=FractalOrder and (char=="F" or char=="f")): ( DNAconstruct.prgDNAnested.value=Fractalindex*NestedPF Fractalindex+=1 StringReaderCube FractalString straight:false ) ) -- end case of if straight do DNAconstruct.prgDNA.value=j*ProgressFactor ) -- end for if straight then ( PCubeCurrent=CubeShpM3.row4 MDEEcurrent=matrix3 1 updateShape DNAcube update DNAtessera TotalLinks=DNAtessera.numVerts/8 DNAconstruct.labTotalLinks.text="Total Links: "+FormattedPrint TotalLinks DNAconstruct.prgDNA.value=0 DNAconstruct.prgDNAnested.value=0 ) else ( Fractalindex-=1 DNAconstruct.prgDNAnested.value=Fractalindex*NestedPF ) ) -- end of fn StringReaderCube function StringReader Str create:true straight:true = ( if straight do ( if create do ( if isValidNode DNAmesh do delete DNAmesh DNAmesh=convertToMesh (copy TesseraBox prefix:"DNA_model") DNAmesh.transform=matrix3 1 DNAmesh.material=DNAmat if isValidNode DNAcircle do delete DNAcircle DNAcircle=SplineShape prefix:"DNA_Rings" wireColor:[200, 230, 255] TotalLinks=0 ) instDEE2=copy meshDEE; instDEE3=copy meshDEE for FI=1 to mshFaces do (setFaceMatID instDEE2 FI 2; setFaceMatID instDEE3 FI 3) deeID=3 ProgressFactor=100.0/Str.count LinkIndex=0 LinkNum=DNAconstruct.spLinkNo.value+DNAconstruct.spQuantity.value-1 LinkFlag=false Fractalindex=1 ) local charNum=Str.count, char="", Num=0 local pos=[0,0,0], pos1=[0,0,0], SpagoOxInW=[0,0,0], SpagoOyInW=[0,0,0], SpagoOzInW=[0,0,0], M3Spago=matrix3 1 if create then -- create entire DNA model ( for j=1 to charNum do ( char=Str[j] case of ( (Num=char as integer; Num!=undefined and Num!=0): ( for i=1 to Num do ( case deeID of ( 1: (deeID=2; instDEE=copy instDEE2) 2: (deeID=3; instDEE=copy instDEE3) 3: (deeID=1; instDEE=copy meshDEE) ) instDEE.transform=MDEEcurrent meshop.attach DNAmesh instDEE instRing=copy instHCircle instRing.transform=MDEEcurrent addAndWeld DNAcircle instRing 0.0 instRing=copy instHCircle instRing.transform=(matrix3 [0.5,0.86602539,0] [-0.86602539,0.5,0] [0,0,1] [0,0,0])*MDEEcurrent instRing.pos=MDEEcurrent.row4+stepH*MDEEcurrent.row3 addAndWeld DNAcircle instRing 0.0 -- next M3current calculation -------------------------- pos=MDEEcurrent.row4+ShiftH*MDEEcurrent.row3 MDEEcurrent.row4=[0,0,0] MDEEcurrent=M120rot*MDEEcurrent MDEEcurrent.row4=pos TotalLinks+=1 ) ) (char=="S" or char=="s"): ( pos=MDEEcurrent.row4 MDEEcurrent.row4=[0,0,0] pos1=pos+halfStepH*MDEEcurrent.row3 SpagoOxInW=SpagoOx*MDEEcurrent SpagoOzInW=SpagoOz*MDEEcurrent SpagoOyInW=cross SpagoOzInW SpagoOxInW M3Spago=matrix3 (normalize SpagoOxInW) (normalize SpagoOyInW) (normalize SpagoOzInW) pos1 M3Spago=(matrix3 [1,0,0] [0,0.5,0.86602539] [0,-0.86602539,0.5] [0,0,0])*M3Spago instSPAGO=copy meshSPAGO instSPAGO.transform=M3Spago meshop.attach DNAmesh instSPAGO MDEEcurrent.row4=pos+ShiftH*MDEEcurrent.row3 MDEEcurrent=MLocalToRotAx*Mrot*MrotAxToLocal*MDEEcurrent TotalLinks+=1 ) (Fractalindex<=FractalOrder and (char=="F" or char=="f")): ( DNAconstruct.prgDNAnested.value=Fractalindex*NestedPF Fractalindex+=1 StringReader FractalString straight:false ) ) -- end case of if straight do DNAconstruct.prgDNA.value=j*ProgressFactor ) -- end for if straight then ( updateShape DNAcircle update DNAmesh MDEEcurrent=matrix3 1 DNAconstruct.labTotalLinks.text="Total Links: "+FormattedPrint TotalLinks DNAconstruct.prgDNA.value=0 DNAconstruct.prgDNAnested.value=0 ) else ( Fractalindex-=1 DNAconstruct.prgDNAnested.value=Fractalindex*NestedPF ) ) else -- create Specific Links separately ( local j=0 while j=DNAconstruct.spLinkNo.value) then -- create Link ( instCube=copy CubeShp prefix:"Link_CubeOutline" wireColor:[30, 200, 100] instTessera=copy TesseraBox prefix:"Link_Tessera" wireColor:[30, 200, 100] instCube.pos=instTessera.pos=PCubeCurrent case deeID of ( 1: (deeID=2; instDEE=copy instDEE2 prefix:"Link_DEE") 2: (deeID=3; instDEE=copy instDEE3 prefix:"Link_DEE") 3: (deeID=1; instDEE=copy meshDEE prefix:"Link_DEE") ) instDEE.transform=MDEEcurrent instDEE.material=DNAmat instRing=copy instHCircle prefix:"Link_helixCircle" wireColor:[200, 230, 255] instRing.transform=MDEEcurrent instRing=copy instHCircle prefix:"Link_helixCircle" wireColor:[200, 230, 255] instRing.transform=(matrix3 [0.5,0.86602539,0] [-0.86602539,0.5,0] [0,0,1] [0,0,0])*MDEEcurrent instRing.pos=MDEEcurrent.row4+stepH*MDEEcurrent.row3 ) else -- go to the next Link ( case deeID of ( 1: deeID=2 2: deeID=3 3: deeID=1 ) ) -- next M3current calculation -------------------------- pos=ShiftH*MDEEcurrent.row3 PCubeCurrent=PCubeCurrent+pos MDEEcurrent.row4=MDEEcurrent.row4+pos MDEEcurrent=M120rot*MDEEcurrent ) ) (char=="S" or char=="s"): ( LinkIndex+=1 if LinkFlag or (LinkFlag=LinkIndex>=DNAconstruct.spLinkNo.value) then -- create Link ( instCube=copy CubeShp prefix:"Link_CubeOutline" wireColor:[30, 200, 100] instTessera=copy TesseraBox prefix:"Link_Tessera" wireColor:[30, 200, 100] instCube.pos=instTessera.pos=PCubeCurrent pos=MDEEcurrent.row4 MDEEcurrent.row4=[0,0,0] pos1=pos+halfStepH*MDEEcurrent.row3 SpagoOxInW=SpagoOx*MDEEcurrent SpagoOzInW=SpagoOz*MDEEcurrent SpagoOyInW=cross SpagoOzInW SpagoOxInW M3Spago=matrix3 (normalize SpagoOxInW) (normalize SpagoOyInW) (normalize SpagoOzInW) pos1 M3Spago=(matrix3 [1,0,0] [0,0.5,0.86602539] [0,-0.86602539,0.5] [0,0,0])*M3Spago instSPAGO=copy meshSPAGO prefix:"Link_SPAGO" instSPAGO.transform=M3Spago instSPAGO.material=DNAmat MDEEcurrent.row4=pos+ShiftH*MDEEcurrent.row3 MDEEcurrent=MLocalToRotAx*Mrot*MrotAxToLocal*MDEEcurrent PCubeCurrent=PCubeCurrent+ShiftH*MDEEcurrent.row3 ) else ( MDEEcurrent.row4=MDEEcurrent.row4+ShiftH*MDEEcurrent.row3 MDEEcurrent=MLocalToRotAx*Mrot*MrotAxToLocal*MDEEcurrent PCubeCurrent=PCubeCurrent+ShiftH*MDEEcurrent.row3 ) ) (Fractalindex<=FractalOrder and (char=="F" or char=="f")): ( DNAconstruct.prgDNAnested.value=Fractalindex*NestedPF Fractalindex+=1 StringReader FractalString create:false straight:false ) ) -- end case of if straight do DNAconstruct.prgDNA.value=j*ProgressFactor ) -- end for if straight then ( MDEEcurrent=matrix3 1 PCubeCurrent=CubeShpM3.row4 DNAconstruct.prgDNA.value=0 DNAconstruct.prgDNAnested.value=0 delete #(instDEE2, instDEE3) ) else ( Fractalindex-=1 DNAconstruct.prgDNAnested.value=Fractalindex*NestedPF ) ) -- end if create ) -- end of fn StringReader function SelectTessera index inflate:true = ( local i8=8*index, VI=#(i8-7, i8-6, i8-5, i8-4, i8-3, i8-2, i8-1, i8), VIpoint=#(0,0,0,0,0,0,0,0) for i=1 to 8 do VIpoint[i]=getVert DNAtessera VI[i] if inflate then ( local Center=2.5*(VIpoint[1]+VIpoint[8]) for i=1 to 8 do setVert DNAtessera VI[i] (6*VIpoint[i]-Center) ) else -- blow off ( local Center=0.416667*(VIpoint[1]+VIpoint[8]) for i=1 to 8 do setVert DNAtessera VI[i] (0.166667*VIpoint[i]+Center) ) update DNAtessera ) -- end of fn SelectTessera -- end of fn definition ----------------------------------------------------------------------------------------------------------------------------------------------- button bttNew "New" rollout MeshParameters "Mesh Parameters" ( spinner spRadius "radius:" range:[0.0, 10000, 50.0] type:#worldunits enabled:false spinner spDsteps "Diag steps:" range:[0, 100, 5] type:#integer enabled:false spinner spHsteps "Hight steps:" range:[0, 100, 5] type:#integer enabled:false on spRadius changed r twiddle do ( StructuralMatter r spDsteps.value spHsteps.value tweakRad:true if not twiddle do format "Vertical shift: % system units\n" ShiftH ) on spRadius buttonup do format "Vertical shift: % system units\n" ShiftH on spDsteps changed Ds do StructuralMatter spRadius.value Ds spHsteps.value on spHsteps changed Hs do StructuralMatter spRadius.value spDsteps.value Hs ) -- end of roll MeshParameters rollout DNAconstruct "DNA constructor" ( group "Entire Model" ( spinner spFrOrder "Nesting Order:" range:[0, 1000, 0] type:#integer enabled:false button bttUpdateCube "Update Outline" width:90 align:#center enabled:false button bttUpdateSwirl "Update Swirl" width:90 align:#center enabled:false label labTotalLinks "Total Links: 0" align:#left enabled:false progressBar prgDNA "progress:" progressBar prgDNAnested "nested progress:" ) group "Specific Links" ( spinner spLinkNo "Link No.:" range:[0, 0, 0] type:#integer Indeterminate:true enabled:false spinner spQuantity "Quantity:" range:[1, 1, 1] type:#integer enabled:false button bttCreate "Create" width:90 align:#center enabled:false ) on spFrOrder changed param do (FractalOrder=param; NestedPF=100.0/param) on bttUpdateCube pressed do ( StringReaderCube DNAstring spLinkNo.enabled=spQuantity.enabled=true bttCreate.enabled=false spLinkNo.range=[0, TotalLinks, 0] spQuantity.range=[1, TotalLinks, 1] prevLinkNo=0 ) on bttUpdateSwirl pressed do ( StringReader DNAstring spLinkNo.range=[0, TotalLinks, 0] spQuantity.range=[1, TotalLinks, 1] prevLinkNo=0 ) on spLinkNo changed index twiddle do ( if prevLinkNo!=0 do SelectTessera prevLinkNo inflate:false if index!=0 do SelectTessera index if not twiddle do ( if prevLinkNo!=0 do SelectTessera prevLinkNo inflate:false if spLinkNo.value==0 then bttCreate.enabled=false else bttCreate.enabled=true local rangeMax=TotalLinks-spLinkNo.value+1 local Qvalue=spQuantity.value if Qvalue>rangeMax do Qvalue=rangeMax spQuantity.range=[1, rangeMax, Qvalue] ) prevLinkNo=index ) on spLinkNo buttonup do ( if spLinkNo.value==0 then bttCreate.enabled=false else bttCreate.enabled=true local rangeMax=TotalLinks-spLinkNo.value+1 local Qvalue=spQuantity.value if Qvalue>rangeMax do Qvalue=rangeMax spQuantity.range=[1, rangeMax, Qvalue] ) on bttCreate pressed do StringReader DNAstring create:false ) -- end of roll DNAconstruct on bttNew pressed do ( for UIC in MeshParameters.controls do UIC.enabled=true for i=1 to 8 do DNAconstruct.controls[i].enabled=true StructuralMatter MeshParameters.spRadius.value \ MeshParameters.spDsteps.value MeshParameters.spHsteps.value create:true format "Vertical shift: % system units\n" ShiftH ) on DNAmodel open do ( addRollout MeshParameters rolledUp:true addRollout DNAconstruct rolledUp:true createDNAmat() ) -- end of DNAmodel open on DNAmodel close do ( removeRollout MeshParameters removeRollout DNAconstruct ) -- end of DNAmodel close )