Вот ещё один интересный скрипт:
Нажимаем кнопку "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);
}
//*****************************
Нажимаем кнопку "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);
}
//*****************************
Получилось, но только копированием текста в скрипт-менеджер. Вобще, у меня в 13-ой версии, в скрипт-менеджере ничего не открывается почему-то, как будто не видит файла. Так что только копированием-вставкой работает.
ОтветитьУдалить