понедельник, 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);
}
//*****************************

суббота, 14 июля 2012 г.

Читает ли кто-нибудь этот блог, нужно ли мне его вести? Материала у меня много, но надо ли это кому-нибудь? На русском языке, вообще-то мало кто пишет о коффее, может и читать некому? А какие замечательные графические скрипты у меня есть...Пальчики оближешь!
Например такой:

Этот скрипт создаёт красивую параметрическую фигуру из нескольких параллельных "узлов".
Скрипт работает только в Скрипт-менеджере, так, как главная функция main(doc,op) содержит операнды "doc" и "op".
Проверено на 12 и 13 версии СИНЕМЫ.
После нажатия на кнопку "Execute", должна под курсором мыши появиться кнопка "OK", надо её нажать, появится картинка.
В 13 версии СИНЕМЫ кнопка "ОК" появляется в левом, верхнем углу экрана.
Если процессор слабый, то надо подождать пока идут расчёты, у меня это длится секунды три.

//*************************************
//This Script was made by senior 14.07.12


       const var cPluginID = 1000777;
       const var cPlugName = "ParaObject";
       const var cPlugHelp = "ParaObject";
       const var cObjName = "ParaObject";
      var cMaxFloat=10000000000;
      var cMaxInt=100000000;
      var para;
      var gDial;
      var Nu = 100;//Субдивайдинг (итерации) по u -Количество полигонов
      var Nv = 100;//Субдивайдинг (итерации) по v -Количество полигоно
      var i,j,k,m;//Индексы      
      var zz;        
      var du;        
      var dv;      
      var SP;      
      var SQ;      
      var x,y,z;      
      var u,v;      
      var P1,P2,P3,P4;
      var vObj,        
      vSP,            
      vPointAry,      
      vSQ,            
      vPolyAry;
//****************************
var Tri;    //Количество групп
var Quart;//Количество итераций в группе
var Trii;//Индекс
var Trij;//Индекс
var Trix=0;//Смещение объекта по x
var Triy=0;//Смещение объекта по y
var Triz=0;//Смещение объекта по z
var TriNu=8;//Субдивайдинг (ширина шага) по u
var TriNv=8;//Субдивайдинг (длина шага) по v
var povtor;//"родитель"
var fTri;
//***************
var mat;
var texTag;
var starttime;//Возвращает время от старта работы CINEMA_4D
var random;//Переменная со значением от Random-псевдо-случайная функция
var rd;//Инициализация красного цвета
var gr;//Инициализация зелёного цвета
var bl;//Инициализация синего цвета
var vOp;
var vDoc;
//Функции:************************************
//*************
RandCol(vDoc)//Функция выбора случайного цвета
{
starttime = time();//Возвращает время от старта работы CINEMA_4D
random = new(Random);//Переменная со значением от Random-псевдо-случайная функция
random->Init(starttime);//Инициализация Random-псевдо-случайной функции
rd=(random->Get01());//Инициализация красного цвета
gr=(random->Get01());//Инициализация зелёного цвета
bl=(random->Get01());//Инициализация синего цвета
}
//*************
CreaMat(vDoc)//Функция создания нового материала
{
mat = new(Material); //Create a new material in memory
mat->SetName("par"); // Имя материала
RandCol(vDoc);//Вызов Random-псевдо-случайной функции
mat#MATERIAL_COLOR_COLOR = vector(rd,gr,bl); // Установка цвета в red-green-blue
vDoc->InsertMaterial( mat, NULL ); // Установка нового материала в Material Manager

//mat#MATERIAL_USE_REFLECTION=TRUE;
//mat#MATERIAL_USE_REFLECTION = COLOR, vector(rd,gr,bl) ; // Установка цвета в red-green-blue

mat#MATERIAL_PREVIEWSIZE=10; // Higher number=higher editor resolution setting
texTag = AllocTag( Ttexture ); //Create a texture tag for the new sphere
texTag#TEXTURETAG_MATERIAL = mat; //links the newly created material to the texture's Material input field
vOp=vDoc->GetActiveObject(); //Load Selected object into memory
vOp->InsertTag(texTag , NULL); //Add it to the scene
}
//*************
RisPol(vDoc)//Главный рисователь полигонов по x,y,z
{
                  zz=0;
                  for (i=0;i<Nu-1;i++)
{
                  for (j=0;j<Nv-1;j++)
{
                    P1=i*Nv+j;
                    P2=i*Nv+j+1;
                    P4=(i+1)*Nv+j;
                    P3=(i+1)*Nv+j+1;
                    para->SetPolygon(zz,P1,P2,P3,P4);
                    zz=zz+1;
}
}
            for (i=0;i<Nu-1;i++)
{
             P1=i*Nv;
             P2=(i+1)*Nv-1;
             P4=(i+1)*Nv;
             P3=(i+2)*Nv-1;
             para->SetPolygon(zz,P4,P3,P2,P1);
             zz=zz+1;
}
}
//*******************************Конец Главного рисователя полигонов по x,y,z, координатам 2048 точек!
            RisPolDop(vDoc)//Дополнительный рисователь полигонов по x,y,z.(кое-где он не нужен)
{
             for (j=0;j<Nv;j++)
{
             P1=j;
             P2=j+1;
             P4=Nv*(Nu-1)+j;
             P3=Nv*(Nu-1)+j+1;
             para->SetPolygon(zz,P4,P3,P2,P1);
             zz=zz+1;
}
             P1=0;
             P2=Nv-1;
             P3=Nv*Nu-1;
             P4=Nv*(Nu-1);
             para->SetPolygon(zz,P1,P2,P3,P4);
}
//*************************************Конец дополнительного рисователя полигонов по x,y,z
    UstDoc(vDoc)//Функция установки документа
{
      var vVarChanged,vBackupTags;
      para=new(PolygonObject);
      if (!para) return NULL;
      para->SetName(cObjName);
      vDoc->StartUndo();
      vDoc->AddUndo(UNDO_OBJECT_NEW,para);
      vDoc->EndUndo();
 vVarChanged = new(VariableChanged);
      vBackupTags = new(BackupTags);
      SP=Nu*Nv;
      SQ=Nu*Nv+1;
      vPointAry = new(array, SP);
      para->SetPoints(vPointAry);
      vBackupTags->Init(para);
      vVarChanged->Init(0, SP);
      if (!para->Message(MSG_POINTS_CHANGED, vVarChanged))
   {
 vBackupTags->Restore();
      return NULL;
      }
      vPolyAry = new(array, SQ*4);
      para->SetPolygons(vPolyAry);
      vBackupTags->Init(para);//Init-Бэкапит таги para(предохранитель нехватки памяти)
      vVarChanged->Init(0, SQ);//Init-Бэкапит все точки SQ(предохранитель нехватки памяти)
      if (!para->Message(MSG_POLYGONS_CHANGED, vVarChanged))//Если нет изменений в para-возврат
      {
      vBackupTags->Restore();
      return NULL;//(это нуль, но в адресном пространстве)
      }
      vDoc->InsertObject(para,povtor,NULL);// Вставить объект "детку"в "родителя"
      GeEventAdd(DOCUMENT_CHANGED);
}//****************************конец функции установки документа
   fSetActiveObject(vDoc,vObj)//Функция активирования (выделения) объекта
{
        var vAObj = GetActiveObject(vDoc);
        if (vAObj) vAObj->DelBit(BIT_AOBJ);
        vObj->SetBit(BIT_AOBJ);
        GeEventAdd(NEW_ACTIVE_OBJECT);
}//************************************************
         fPara(vDoc)
{
        fSetActiveObject(vDoc,para);//Вызов функции fSetActiveObject //Функция активирования (выделения) объекта
        GeEventAdd(DOCUMENT_CHANGED);//Вызов функции GeEventAdd с аргументом NEW_ACTIVE_OBJECT с изменением в активном документе
        para->Message(MSG_UPDATE);//Принять изменения в документе
        return TRUE;
}//***********************************************
             Form(vDoc)//Функция формулы объекта
{
      var uMin = 0.0;
      var uMax = pi2;
      var vMin = 0.0;
      var vMax = pi2;
var f = .5;//Увеличение-Scale
var r=10;
du=(uMax-uMin)/Nu;//-ширина полигона
dv=(vMax-vMin)/Nv;//-длина полигона
             zz=0;
             for (i=0;i<Nu;i++)//64 колонны
{
             for (j=0;j<Nv;j++)//32 ряда
{
              u=uMin+i*du;//64 колонны по ширине полигона
              v=vMin+j*dv;//32 ряда по длине полигона
var t=u;
                   x = 88*cos(t) + 115*sin(t) - 475*cos(2*t) - 127*sin(2*t) - 87*cos(3*t) + 36*sin(3*t) + 11*cos(4*t) - 19*sin(4*t);
                   y = 89*cos(t) - 32*sin(t) - 172*cos(2*t) + 294*sin(2*t) + 76*cos(3*t) + 102*sin(3*t) - 61*cos(4*t) + 113*sin(4*t);
                   z = r*cos(v) - 69*sin(t) + 34*cos(2*t) + 223*sin(2*t) + 16*cos(3*t)+ 120*sin(3*t) + 42*cos(4*t) - 125*sin(4*t);
x = x+Trix;
y = y+Triy ;
z = z+Triz;
//println("x = ",x);
                para->SetPoint(zz,vector(x*f,y*f,z*f));
                zz=zz+1;
}
}
}//конец функции формулы объекта
//*****************************************
Povtor(vDoc)//Функция изменения положения объекта
{
var Quart=35;//Количество итераций, 35=круг
var TriNu=8;//Сужение между кольцами после=8 - расширение по u до =8
var TriNv=8;//Сужение между кольцами после=8 - расширение по v до =8
var fTri = 400;//Увеличитель расстояния между шагами (объектами))
var TriuMin = -pi2;
var TriuMax = pi2;
var TrivMin = -pi/9;
var TrivMax = pi/9;
var Tridu=(TriuMax-TriuMin)/TriNu;//-ширина полигона
var Tridv=(TrivMax-TrivMin)/TriNv;//-длина полигона
k=1;
for (m=0;m<Quart;m++)// //Количество итераций
{
u=TriuMin+k*Tridu;//-ширина полигона
v=TrivMin+m*Tridv;//-длина полигона
                    x= sin(u)*cos(v);//Формула перемещения объекта по x
//x= cos(v);
                    y= pow((sin(u)),2);         //Формула перемещения объекта по y
                    //z= sin(u)*sin(v); //Формула перемещения объекта по z
 z= cos(v/2)*sin(v);
//z=0;
Trix=x*fTri;  //Координата повтора по x
Triy=y*fTri; //Координата повтора по y
Triz=z*fTri; //Координата повтора по z

                         UstDoc(vDoc);//Установка объекта повтора в документ
                         Form(vDoc);//Функция формулы повтора
                         RisPol(vDoc);//Главный рисователь полигонов повтора по x,y,z
                         RisPolDop(vDoc);//Дополнительный рисователь полигонов повтора по x,y,z.(кое-где он не нужен)
//fPara(vDoc);//Активировать объект
//CreaMat(vDoc);//Функция создания нового материала
}
}
//**********************Коней функции изменения положения объекта
         class MyDialog :GeModalDialog
{
         public:
         CreateLayout();// определить расположение диалога.
         Command(vID,vMSG);//Всякий раз, когда пользователь нажимает на гаджет, и / или изменяет его значения эта функция будет вызвана.
}
         MyDialog::CreateLayout()
{  
        SetTitle(cPlugName);  //Установить имя диалога плагина
        AddDlgGroup(DR_DLGGROUP_OK); //  Кнопка OK, начало Расчета (Старт)
         return TRUE;//Возвращает значение=1
}
        MyDialog::Command(vID,vMSG)
{
        var vDoc;//Переменная vDoc
       StopAllThreads();//Приостановить все процессы перед исполнением
        switch (vID)//Опрос ячеек диалога,
{
        case 1 : // нажатие кнопки OK (Start)
{
                         vDoc = GetActiveDocument();
                         if (!vDoc) return FALSE;
povtor=new(PolygonObject);//Создать "родительский" объект
vDoc->InsertObject(povtor,NULL,NULL);//Вставить "родительский" объект в документ
povtor#ID_BASEOBJECT_REL_POSITION:VECTOR_X=34;
povtor#ID_BASEOBJECT_REL_POSITION:VECTOR_Y=-136;
povtor#ID_BASEOBJECT_REL_POSITION:VECTOR_Z=-185;
povtor#ID_BASEOBJECT_REL_ROTATION:VECTOR_X=0.284;
povtor#ID_BASEOBJECT_REL_ROTATION:VECTOR_Y=0;
povtor#ID_BASEOBJECT_REL_ROTATION:VECTOR_Z=0;
Povtor(vDoc);
}
}
                          return TRUE;
}
    main(doc,op)//Это главная функция, с которой начинается работа программы-Главпродукт
{
     gDial=new(MyDialog);//Вызвать меню диалога
     gDial->Open(-1,-1);//Запустить меню в позиции мыши
}

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