понедельник, 16 июля 2012 г.

Вот ещё один интересный скрипт:

Нажимаем кнопку "Execute", потом кнопку " ОК"
Проверено в 12 и 13 версии СИНЕМЫ.

Вот, если что, ссылка на сам файл:
http://narod.ru/disk/56658972001.b159b8caa9e6ce5c386376f340d34fdd/My_Tri_Spline.CSC.html

Называется он: 
My_Tri_Spline.CSC (в имени файла не должно быть русских букв)
Ввести его через File/Open в 13 версии или File/Import в 12 версии в самом Менеджере скриптов.


//************************


      const var cPluginID = 0000077;
      const var cPlugName = "Knots";
      const var cPlugHelp = "Knots";
      var i,k,m,p;
      var x,y,z;
      var N=300;//Количество кругов
var NTri=100;//Количество итераций у кругов
      var qObj;
      var gDial;
      var t,dt,tTri,dtTri;//Шаги количества и итераций
var qSplin;
var vPointAry;
var f;
var vOp;
var vDoc;
var Trix;
var Triy;
var Triz;
var qSplinTri;
var vPointAryTri;
//*******************
UstDoc(vDoc)
{
qSplin = AllocObject(Ospline); // Creates the empty spline object
vPointAry = new(array,N); //New array to store the spline points info
qSplin->SetPoints(vPointAry);// Execute the changes to the spline points
var vc = new(VariableChanged); // *Important. Must be used for splines
vc->Init(0,N);  // *Important. Must be used for splines
qSplin->Message(MSG_POINTS_CHANGED,vc); // *Important. Must be used for splines
qSplin#SPLINEOBJECT_TYPE = 4; // make it a Bezier type
qSplin->SetName("Spline ");//Установить имена по порядку
vDoc->InsertObject(qSplin,NULL,NULL); // Insert it into the Object Manager
qSplin->SetBit(BIT_ACTIVE); //Сделать qSplin активной (выбрать)
}
//*******************
UstTriDoc(vDoc)
{
qSplinTri = AllocObject(Ospline); // Creates the empty spline object
vPointAryTri = new(array,N); //New array to store the spline points info
qSplinTri->SetPoints(vPointAryTri);// Execute the changes to the spline points
var vcTri = new(VariableChanged); // *Important. Must be used for splines
vcTri->Init(0,NTri);  // *Important. Must be used for splines
qSplinTri->Message(MSG_POINTS_CHANGED,vcTri); // *Important. Must be used for splines
qSplinTri#SPLINEOBJECT_TYPE = 4; // make it a Bezier type
qSplinTri->SetName("SplineTri ");//Установить имена по порядку
vDoc->InsertObject(qSplinTri,NULL,NULL); // Insert it into the Object Manager
qSplinTri->SetBit(BIT_ACTIVE); //Сделать qSplin активной (выбрать)
}
//******************
pipeit(obj, vDoc)
{
var sweep = AllocObject(5118);// Создать пустой Sweep NURBS (5118) объект
vDoc->InsertObject(sweep ,qSplin, vDoc->GetActiveObject());//Вставить Sweep NURBS в документ "родителем" к пипеитируемому активному объекту
vDoc->AddUndo(UNDO_NEW, sweep);//Включить в UNDO
vDoc->SetActiveObject(sweep);// Активировать Sweep NURBS
    var tag = AllocTag(5612);// Создать пустой (5612) тэг
    sweep->InsertTag(tag);//Вставить в Sweep NURBS тэг 5612
    var name=obj->GetName();//Получить имя сплайна
    sweep->SetName(name+"_pipe");//Изменить имя Sweep NURBS
   var objpos   = obj->GetMg();//Получить глобальную матрицу и вставить её в  объект сплайн (Matrix global)
   sweep->SetMg(objpos);//Вставить  глобальную матрицу в Sweep NURBS
obj#ID_BASEOBJECT_POSITION:VECTOR_X=0;
obj#ID_BASEOBJECT_POSITION:VECTOR_Y=-200;
obj#ID_BASEOBJECT_POSITION:VECTOR_Z=0;
//obj#ID_BASEOBJECT_ROTATION:VECTOR_X=1.571;
//obj#ID_BASEOBJECT_ROTATION:VECTOR_Y=1.571;
obj#ID_BASEOBJECT_ROTATION:VECTOR_Z=1.571;
object()#CAP_START=1;// Заделать концы 0-None, 1=Cap, 2=Fillet, 3=Fillet Cap
object()#CAP_END=1;// Заделать концы  0-None, 1=Cap, 2=Fillet, 3=Fillet Cap
   var circle = AllocObject(5179);//Создать пустой объект n-Side, сплайновый шестиугольник
vDoc->InsertObject(circle, null, vDoc->GetActiveObject());//Вставить n-Side, как "детку" к активному объекту Sweep NURBS
vDoc->AddUndo(UNDO_NEW, circle);//Включить в UNDO
vDoc->SetActiveObject(circle);//Сделать n-Side активным
object()#PRIM_NSIDE_RADIUS = 2; // Радиус трубы
object()#PRIM_PLANE = 0;//Ориентация xy=0-труба, zy=1-плоско, xz=2-плоско
object()#PRIM_NSIDE_SIDES = 12; // Профиль-сабдивайдинг трубы
    object()#SPLINEOBJECT_INTERPOLATION=0;//Intermediate Points 0-None, 1=Natural, 2=Uniform, 3=Adaptive, 4=Subdivided
obj->Remove();//Стереть старый наш сплайн, (использовать Remove () сначала, если объект уже вставлена ​​в другую иерархию.)
obj->InsertUnder(sweep);//Вставить сплайн как "детку"
circle->Remove();//Стереть трубу,( использовать Remove () сначала, если объект уже вставлена ​​в другую иерархию.)
circle->InsertUnder(sweep);//Вставить трубу как "детку"
}
//*******************
SerchMassiv(vDoc)
{
var m = 0;
var selected = new(array, N*N); // Количество наших сплайнов (массив)
var obj = object();//Это первый наш активированный объект
if(!obj) return;
while(obj->SearchNext(BIT_AOBJ))//Выяснить сколько объектов всего начиная с нашего
{
selected[m] = obj;// i-объекты в массив
m++;
obj = obj->SearchNext(BIT_AOBJ);//Считать следующие объекты пока они не кончатся
}
selected[m++] = obj;//Кончились? Последний внести в конец массива, i-будет означать количество объектов
//DeselectAll();//Сбросить все последующие не наши (кроме тех которые мы выбрали)
    pipeit(qSplin,vDoc);//Пипеитировать сплайны!
}
//********************************
//*******************************
RisTriSpline(vDoc)
{
         //dtTri=2.1*PI/NTri;//ширина шага, 2,1 - круг
   dtTri=4*PI/NTri;//ширина шага, 2,1 - круг
         tTri=0;

         for (k=0;k<NTri;k++)//N - количество итераций
{
              tTri=tTri+dtTri;//ширина шага dt
f=250;
                  x = (cos(tTri));
                   y = (sin(tTri));
                   z =0;

            qSplinTri->SetPoint(k,vector(x*f,z*f,y*f));
}
qSplinTri#ID_BASEOBJECT_REL_POSITION:VECTOR_X=Trix;
qSplinTri#ID_BASEOBJECT_REL_POSITION:VECTOR_Y=Triy;
qSplinTri#ID_BASEOBJECT_REL_POSITION:VECTOR_Z=Triz;
//qSplinTri#ID_BASEOBJECT_REL_ROTATION:VECTOR_X=0.785;
//qSplinTri#ID_BASEOBJECT_REL_ROTATION:VECTOR_Y=1.571;
//qSplinTri#ID_BASEOBJECT_REL_ROTATION:VECTOR_Z=1.571;
 pipeit(qSplinTri,vDoc);//Пипеитировать сплайны!
}
//*******************************
RisSpline(vDoc)
{
f=250;
         dt=4*PI/N;//ширина шага, 2,1 - круг
         t=0;
         for (i=0;i<N;i++)//N - количество итераций
{
              t=t+dt;//ширина шага dt
             
                   x = (cos(t));
                   y =(sin(t));
                   z =0;
              //qSplin->SetPoint(i,vector(x*f,z*f,y*f));
//*************************
UstTriDoc(vDoc);
Trix=x*f;
Triy=y*f;
Triz=z*f;
RisTriSpline(vDoc);
}
}
// ******************************************************************
class MyDialog : GeModalDialog
{
   public:
      CreateLayout();
      Command(vID,vMSG);
}
  MyDialog::CreateLayout()
   {  
       SetTitle(cPlugName);
       AddDlgGroup(DR_DLGGROUP_OK);
      return TRUE;
   }
   MyDialog::Command(vID,vMSG)
   {
     StopAllThreads();
      switch (vID)
    {
      case 1 : // Start OK
    {
                       vDoc = GetActiveDocument();
                       if (!vDoc) return FALSE;
UstDoc(vDoc);
RisSpline(vDoc);
//SerchMassiv(vDoc);
   }
   }
      return TRUE;
   }
//***************
main(doc,op)
{
gDial=new(MyDialog);
gDial->Open(-1,-1);
}
//*****************************

1 комментарий:

  1. Получилось, но только копированием текста в скрипт-менеджер. Вобще, у меня в 13-ой версии, в скрипт-менеджере ничего не открывается почему-то, как будто не видит файла. Так что только копированием-вставкой работает.

    ОтветитьУдалить