Форум профессиональных мебельщиков PROMEBELclub
 
PROMEBELclub - Форум для мебельщиков: конструкторов, дизайнеров, мастеров, технологов и всех, кто имеет отношение к производству и изготовлению мебели. Программы для конструирования и дизайна мебели. Мебельная литература и обучающие пособия.
 
 

Вернуться   Форум профессиональных мебельщиков PROMEBELclub > Программы для мебельщиков > Программы для конструирования и дизайна мебели > Система БАЗИС > Базис-мебельщик. Скрипты

Меню

Маркет


Ответ
 
Опции темы Опции просмотра
Старый 13.01.2014, 13:22  
БАЗИС 9 - Скрипты
 
Аватар для Igor_482
Igor_482
VIP
Регистрация: 03.09.2008
Сообщений: 174

Сказал(а) спасибо: 34
Поблагодарили 794 раз(а) в 113 сообщениях
Версия для печати Отправить по электронной почте
Igor_482 Igor_482 вне форума 13.01.2014, 13:22
Рейтинг: ()

ВНИМАНИЕ! Правила выкладывания скриптов.

1. Если в скрипте нет ссылок на фурнитуру, фрагменты и.т.д то достаточно его упаковать в архив и выложить.

2. Если в скрипте есть ссылки на фурнитуру, фрагменты и т.д. то архив должен содержать папку с самим скриптом и всеми файлами на которые есть ссылки в тексте скрипта.


Т.к. при запуске скрипта на другом компе возникает ошибка о не возможности открыть то или иной файл и скрипт до конца не отрабатывает свой текст. Не соблюдается "чистота проверки" работы скрипта.

__________________________________________________ _______________

Интересует информация по редактору скриптов в БМ8. Существует ли справочная документация и примеры использования скриптов в БМ8. Какие возможности дает данная функция? Владеющим информацией по данному вопросу просьба поделиться ею.

Для работы скриптов от Igor_482 необходим установленный ODBC драйвер FireBird, установленные и зарегистрированные в ОС модули FBDBDialog.dll, MSDATGRD.OCX, MSCOMCTL.OCX и MSSTDFMT.DLL (сообщение с описанием установки этих модулей в ОС, ссылка на модули и исходник "FBDBDialog.dll") а так же файл "ADODB.ini" с настройками соединения к БД в папке со скриптом.

ADODB.ini


[General]
FDBServ = t001
FBSPort = 14357
FDBFile = D:\DBBM\Библиотека\БД\BMDB09.FDB
FBCFile = C:\Windows\System32\fbclient.dll
----------------------------------------------
Переменные .ini:
FDBServ - имя ПК на котором находится сервер FireBird с используемой БД (если локально, то параметр: localhost или 127.0.0.1);
FBSPort - в настройке не нуждается (по умолчанию: 14357);
FDBFile - локальный путь к БД на сервере FireBird;
FBCFile - путь к файлу "fbclient.dll" (находится в корневой папке программы Базис).
[свернуть]

Последний раз редактировалось systland; 23.09.2016 в 11:52..
Просмотров: 993326
Ответить с цитированием Вверх
Пользователь сказал cпасибо:
evilbaby1989 (10.07.2023)
Старый 13.07.2016, 09:30   #1181
v22884
Местный
 
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
v22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордится
По умолчанию

Экспорт в three.js

добавлено:
- анимация ящиков, они же раздвижные двери.
- грубая попытка сделать смещение двери.

(не совсем понимаю алгоритм расчёта угла отклонения, почему то разный в разных типах. Подскажите, пожалуйста, как считается угол смещения?)

Скрытый текст


system.secureExec("" +
"AQAA/wF4nGNigAA2IA7OLy1KTv0PBIwgIUaYlD6Q" +
"KGNIZChiUGBQAUI3hkyGHIZUBj+gWC6QVmCwBWJH" +
"hmSGEqBMPkMegx6DP0MBnFcM5DszZIB1pQDZ6Pqt" +
"GQD3jBbQ" +
"");

function ActiveFileName() {
return $$FileName;
}

function ActiveFilePath() {
return $$FileName.substring(0, $$FileName.lastIndexOf("\\") + 1);
}

function ActiveFileNameS_RasshireniyemTolko() {
return $$FileName.substring($$FileName.lastIndexOf("\\") + 1, $$FileName.length);
}

function ActiveFilePathNomenklatury() {
PathNomenklatury = $$FileName.lastIndexOf("\\Черновики") + 1
if (PathNomenklatury > 0) {
PathNomenklatury = $$FileName.substring(0, PathNomenklatury);
} else {
PathNomenklatury = $$FileName.substring(0, $$FileName.lastIndexOf("\\") + 1)
}

return PathNomenklatury;
}




//--------------------------------ОСНОВНАЯ ЧАСТЬ



var t = []
var anim = []
t.push('var vremya=0;')
t.push('var pause=7;')
t.push('function AddModel(){')

t.push('bm=new THREE.Object3D();')
//dobavitOsiMira()
//t.push('bm.BID=1;')
k = 0



/*
Model.forEach(function(p) {

system.log('----------------- '+p)
if (p.AsPanel) {
Contur(p, t)
Sozdaniye(p, t, k)
} else if (p.toString() == '[object TExtrusionBody]') {
//alert(p.Name)
Contur(p, t)
Sozdaniye(p, t, k)
} else if (p.toString() == '[object T2DRotationBody]') {

ConturLathe(p, t)

} else if (p.toString() == '[object T2DTrajectoryBody]') {
ConturTrajectory(p, t)


} else if (p.toString() == '[object TSphere3D]') {
AddTSphere3D(p, t)


} else {
return
}
//PosRot(p,t)

k = k + 1
//alert(t)
t.push('bm.add(mesh);')

});
*/
function PodgotovitProfil(p)
{c = p.Contour

pos1 = p.ToGlobal(NewVector(c.Min.x, c.Min.y, 0))
pos0 = p.ToGlobal(NewVector(0, 0, 0))
c.Move(-c.Min.x, -c.Min.y)
p.Build()

//system.log(JSON.stringify(pos0))
//system.log(JSON.stringify(pos1))

pos = NewVector((pos1.x-pos0.x), (pos1.y-pos0.y), (pos1.z-pos0.z))
//system.log(JSON.stringify(pos))
p.TranslateGCS(pos)
p.Build()

if (p.Thickness<0) {
//alert(p.Thickness)
pos0 = p.ToGlobal(NewVector(0, 0, 0))
pos1 = p.ToGlobal(NewVector(0, 0, p.Thickness))
pos = NewVector(pos1.x-pos0.x, pos1.y-pos0.y, pos1.z-pos0.z)
p.TranslateGCS(pos)
p.Thickness = -p.Thickness
}
p.Build()
}

function ZapisatObject(p, t) {
system.log('----------------- ' + p)
if (p.AsPanel) {
Contur(p, t)
Sozdaniye(p, t, k)
Plastic(p, t)
} else if (p.toString() == '[object TExtrusionBody]') {
//alert(p.Name)
PodgotovitProfil(p)
//system.log(p.Thickness + ' '+ p.Name)
Contur(p, t)
Sozdaniye(p, t, k)
//dobavitOsi()
} else if (p.toString() == '[object T2DRotationBody]') {

ConturLathe(p, t)

} else if (p.toString() == '[object T2DTrajectoryBody]') {
ConturTrajectory(p, t)


} else if (p.toString() == '[object TSphere3D]') {
AddTSphere3D(p, t)


} else {
return
}
//PosRot(p,t)

k = k + 1
//alert(t)

PosRot(p, t)
Roditel(p, t)
t.push('mesh.BID=' + p.UID + ';')
t.push('mesh.name="' + NaLatinskom(p.Name) + '";')
//t.push('bm.add(mesh);')
}




//=============================ДЕРЕВО
s = []
oid = []

Model.forEach(function(o) {
d = {}
d.id = o.UID
d.oid = o.Owner.UID
d.n = o.Name
s.push(d)

if (!(oid.indexOf(d.oid) > -1)) {
oid.push(d.oid)
}

});

system.log(JSON.stringify(s))
system.log('oid -- ' + JSON.stringify(oid))
tree = []
for (io = 0; io < oid.length; io++) {
putA = []
o = ObjektPoUID(oid[io])
//alert(o)
put(o, putA)
system.log(oid[io] + ' == ' + JSON.stringify(putA))

ZapisatBlok(o, t)

for (u = 0; u < s.length; u++) {
if ((s[u].oid == oid[io]) && (!(oid.indexOf(s[u].id) > -1))) {
pob = ObjektPoUID(s[u].id)
system.log('------- ' + pob.Name)
ZapisatObject(pob, t)


}
}
}

function Plastic(p, t){
pls = p.Plastics;

if(pls.Count>0){
for(ipl=0;ipl<pls.Count;ipl++){
/*
Side:0
Thickness:0.22
Material:Наклейка на шкаф
MaterialWidth:-1
TextureOrientation:2
*/
pl = pls[ipl];
side = pl.Side;
thick = pl.Thickness;
materialn = pl.Material;
torient = pl.TextureOrientation;
ActiveMaterial.Make(materialn, 3);
pm = AddPanel(0, 0)
material = pm.Material


/////////////////////--------------------------------------------ПЛАСТИК

//var material=new THREE.MeshStandardMaterial({color:0xf2f2f2, wireframe:false,needsUpdate:true,shading:THREE.SmoothShading});
Material(t, material, 'material',p)
pm.Free();

if(side==0){
z1=p.Thickness
z2=p.Thickness+thick
}
else if(side==1)
{
z1=-thick
z2=0
}
t.push('v1=new THREE.Vector3(0,0,'+z1+');')
t.push('v2=new THREE.Vector3(0,0,'+z2+');')

t.push('var l_tolshina=new THREE.LineCurve(v1,v2);')
t.push('var extrudeMaterial=new THREE.MeshStandardMaterial({color:0xf2f2f2,needsUpdate:true});')
t.push('var materials=[material,extrudeMaterial];')
t.push('var extrudeSettings={steps:1,amount:1,extrudePath:l_tolshina,material:0,extrudeMaterial:1};')
t.push('var geometry=new THREE.ExtrudeGeometry(Shapes,extrudeSettings);')
t.push('var meshPl=new THREE.Mesh(geometry,new THREE.MultiMaterial(materials));')
t.push('meshPl.TenNeOtbrasyvat=true;')
//mesh.quaternion.set(0,-0.7071067811865475,0,0.7071067811865476);
//mesh.position.set(400,-2.2737367544323206e-13,-3.6637359812630166e-15);
t.push('mesh.add(meshPl);')



/////////////////////=======================--------------------------------------------ПЛАСТИК


}

}
}



function put(o, putA) {
if (o.UID == 1) {
return putA
} else {
// system.log(o.Owner.UID)
putA.push(o.Owner.UID)
put(o.Owner, putA)
}
}

function ObjektPoUID(UID) {
if (UID == 1) {
return Model
}
var o2
Model.forEach(function(oo) {

if (oo.UID == UID) {
//alert(oo.UID+' == '+ UID)
o2 = oo
return
}

});
return o2
}

////----------------------------------- //=============================ДЕРЕВО


t.push('scene.add(bm);')
//dobavitOsiMira()
t.push('}')
t.push('function Animatebm(delta){')
t.push('nachislili=false;')
t.push(anim.join(''))
t.push('}')

//// ===========Найти по ИД
t.push('function NaytiPoBID(BID){')
t.push('var retob;')
t.push('bm.traverse(function(child) {')
t.push('if(child.BID==BID)')
t.push('{')
t.push('retob=child;')
t.push('return child;')
t.push('}')
t.push('});')
t.push('return retob')
t.push('}')
////---------//// ===========Найти по ИД



//system.askWriteTextFile('js', t.join('\r\n'))
//system.writeTextFile('C:\\OpenServer\\domains\\site\\three.js-master\\logo.js', t.join('\r\n'))
system.writeTextFile('C:\\OpenServer\\domains\\site\\three.js-master\\33y.js', t.join('\r\n'))

system.writeTextFile(ActiveFilePathNomenklatury() + '1.js', t.join(''))

function FileNameS_RasshireniyemTolko(fullpath) {
return fullpath.substring(fullpath.lastIndexOf("\\") + 1, fullpath.length);
}


function Roditel(p, t){
//system.log(p.Owner)
if(p == Model) {return}
if(p.Owner == Model)
{BID =1}
else{
BID = p.Owner.UID
}
//t.push('mesh.parent=NaytiPoBID('+BID+');')
t.push('parent=NaytiPoBID('+BID+');')
t.push('parent.add(mesh);')
}

function ZapisatBlok(p, t) {
////////////////////////-----------------------------------АНИМАЦИЯ
if((p.AnimType!=0)&&(!(p.AnimType===undefined))){
pos = p.ToGlobal(p.Animation.AxisStart)
pos2 = p.ToGlobal(p.Animation.AxisEnd)

lineP = p.Owner
//p = GetPanel("Укажите панель")
pos = lineP.ToObject(pos)
px = pos.x
py = pos.y
pz = pos.z
pos2 = lineP.ToObject(pos2)
px2 = pos2.x
py2 = pos2.y
pz2 = pos2.z


d = Distance3d(pos, pos2)
dl = 1

t.push(' var material=new THREE.LineBasicMaterial({color: 0x0000ff});')

t.push('var geometry=new THREE.Geometry();')

t.push('geometry.vertices.push(')
t.push(' new THREE.Vector3( ' + 0 + ',' + 0 + ',' + 0 + ' ),')
t.push(' new THREE.Vector3( ' + 0 + ',' + 0 + ',' + dl + '));')

t.push('var line=new THREE.Line(geometry,material);')

t.push('line.position.set(' + px + ',' + py + ',' + pz + ');')
t.push('line.lookAt(new THREE.Vector3(' + px2 + ',' + py2 + ',' + pz2 + '));')
t.push('parentL=NaytiPoBID('+p.Owner.UID+');')
t.push('parentL.add(line);')



/////// в функцию Анимации




BID = p.UID
anim.push('oa=NaytiPoBID('+BID+'9999);')

anim.push('if((!oa.Animirovat)&&(!nachislili)){')
anim.push('vremya=vremya+delta;')
anim.push('nachislili=true;')
anim.push('};')
anim.push('if(vremya>pause)')
anim.push('{oa.Animirovat=true;')
//anim.push('vremya=0;')
anim.push('};')

anim.push('if(oa.Animirovat){')

anim.push('if(oa.AtekU<0){oa.Adir=1;oa.Animirovat=false;vremya=0;};if(oa.AtekU>oa.AAngle){oa.Adir=-1;')
anim.push('oa.Animirovat=false;')
anim.push('vremya=0;')
anim.push('}')

if((p.AnimType==2)||(p.AnimType==3)||(p.AnimType==4)||(p.AnimType==5))
{
anim.push('ug=oa.Adir*0.01;')
anim.push('oa.rotateZ(ug);')
if(p.DoorShift!=0){
anim.push('ds=-1*(ug/oa.AAngle)*oa.DoorShift;')
//anim.push('ds=oa.Adir*0.01;')
anim.push('oa.translateX(ds);')
anim.push('oa.AtekDS=oa.AtekDS+ds;')


}

}
else //if(p.AnimType==8)
{
anim.push('ug=oa.Adir*2;')
anim.push('oa.translateZ(ug);')

}



anim.push('oa.AtekU=oa.AtekU+ug;')

anim.push('}')
//anim.push('axis=
//anim.push('oa.rotateOnAxis ( axis, 0.01);')







}
//====================////////////////////////-----------------------------------АНИМАЦИЯ
//t.push('////// \n\n\n')
t.push('mesh=new THREE.Object3D();')
t.push('mesh.BID=' + p.UID + ';')
t.push('mesh.name="' + NaLatinskom(p.Name) + '";')
if(p.UID==1){t.push('bm.add(mesh);')}
Roditel(p, t)
PosRot(p, t)



if((p.AnimType!=0)&&(!(p.AnimType===undefined))){

















t.push('mesh.updateMatrixWorld(true);')
t.push('parent.updateMatrixWorld(true);')
t.push('THREE.SceneUtils.detach(mesh,parent,scene);')
t.push('mesh.updateMatrixWorld(true);')
t.push('line.updateMatrixWorld(true);')
t.push('THREE.SceneUtils.attach(mesh,scene,line);')
t.push('line.BID=' + p.UID + '9999;')

if((p.AnimType==2)||(p.AnimType==3)||(p.AnimType==4)||(p.AnimType==5))
{
t.push('line.AAngle=' + p.Animation.DoorAngle *(Math.PI / 180)+ ';')
}else// if(p.AnimType==8)
{
t.push('line.AAngle=' +d+ ';')
}

t.push('line.Adir=1;')//1 - открывать, -1 -- закрывать
t.push('line.AtekU=0;')//текущий угол
t.push('line.Animirovat=true;')//Анимировать ли в текущем кадре
t.push('line.AtekDS=0;')//текущий угол
t.push('line.DoorShift='+p.DoorShift+';')//DoorShift:18
//t.push('line.visible=false;')
}

}

function AddTSphere3D(p, t) {
t.push('mesh=new THREE.Object3D();')
t.push('var geometry=new THREE.SphereGeometry(' + p.Radius + ');')
Material(t, p.Material, 'material')
t.push('var sphere=new THREE.Mesh(geometry,material);')
t.push('mesh.add(sphere);')

}




function ConturTrajectory(p, t) {



c = p.Contour2D


ny = p.NToGlobal(AxisY);



//c.Rotate(0, 0, 90);
c.OrderContours(true)

t.push('mesh=new THREE.Object3D();')

f = 'Shape'
t.push('var ' + f + '=new THREE.Shape();')
ZamknutiyKontur(c, t, f)


path = 'path'
t.push('var ' + path + '=new THREE.Path();')
c = p.Trajectory2D
c.OrderContours(true)
// c = NewContour()
//c.Symmetry(0, 0, 1, 0, false)
//c.Symmetry(0, 0, 0, 1, false)
//ZamknutiyKontur(p.Trajectory2D, t, path)
KonturTrajectorii(c, t, path)
//ZamknutiyKontur(c, t, path)

// Material(p, t)
Material(t, p.Material, 'material')

t.push('var materials=[material,material];')

//t.push('var extrudeSettings={curveSegments:8,steps:1,amount:1,bevelEnabled:false,extrudePath:path,material:0,extrudeMaterial:1};')
t.push('var extrudeSettings={steps:100,amount:1,extrudePath:path,material:0,extrudeMaterial:1};')


t.push('var geometry=new THREE.ExtrudeGeometry(Shape,extrudeSettings);')
t.push('var extr=new THREE.Mesh(geometry,new THREE.MultiMaterial(materials));')




t.push('extr.rotation.set(Math.PI*0.5,0,0);')
t.push('extr.rotateZ(Math.PI*0.5);')
t.push('extr.rotateX(Math.PI);')

t.push('mesh.add( extr );')

// PosRot(p, t)

//dobavitOsi()




}




//Тело вращения

function ConturLathe(p, t) {

/*




var points = [];
for ( var i = 0; i < 10; i ++ ) {
points.push( new THREE.Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );
}
var geometry = new THREE.LatheGeometry( points );
var material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );
var lathe = new THREE.Mesh( geometry, material );
scene.add( lathe );



LatheGeometry(points, segments, phiStart, phiLength)
points — Array of Vector2s. The x-coordinate of each point must be greater than zero.
segments — the number of circumference segments to generate. Default is 12.
phiStart — the starting angle in radians. Default is 0.
phiLength — the radian (0 to 2PI) range of the lathed section 2PI is a closed lathe, less than 2PI is a portion. Default is 2PI.




*/


c = p.Contour2D


ny = p.NToGlobal(AxisY);



//c.Rotate(0, 0, 90);
c.OrderContours(true)

t.push('mesh=new THREE.Object3D();')

t.push('var points = [];')
for (var i = 0; i < c.Count; i++) {
t.push('points.push(new THREE.Vector2(' + c[i].Pos1.x + ',' + c[i].Pos1.y + '));')
}
t.push('points.push(new THREE.Vector2(' + c[c.Count - 1].Pos2.x + ',' + c[c.Count - 1].Pos2.y + '));')

t.push('var geometry=new THREE.LatheGeometry(points);')
//t.push('var material=new THREE.MeshBasicMaterial({color:0xffff00});')
MaterialPaneli(p, t)
t.push('var lathe=new THREE.Mesh(geometry,material);')
t.push('lathe.rotation.set(Math.PI*0.5,0,0);')

t.push('mesh.add( lathe );')

// PosRot(p, t)






}


function Material(t, material, imav3js,p) {
mp = material.Path
if (system.fileExists(mp)) {
mapFile = NaLatinskom(FileNameS_RasshireniyemTolko(mp))
kuda = 'C:\\OpenServer\\domains\\site\\three.js-master\\1_textures\\' + mapFile
system.exec('c:/Windows/system32/cmd.exe', '/c copy "' + mp + '" "' + kuda + '"')


kudaD = ActiveFilePathNomenklatury() + '1_textures\\'
kuda = kudaD + mapFile

//system.log('c:/Windows/system32/cmd.exe'+ '/c copy "'+ mp+'" "' + mapFile +'"')

system.exec('c:/Windows/system32/cmd.exe', '/c md "' + kudaD + '"')

system.exec('c:/Windows/system32/cmd.exe', '/c copy "' + mp + '" "' + kuda + '"')






t.push('var textureLoader11=new THREE.TextureLoader();')
t.push('var texture1=textureLoader11.load("1_textures/' + mapFile + '");')
if(material.Retry){
t.push('texture1.wrapS=THREE.MirroredRepeatWrapping;')
t.push('texture1.wrapT=THREE.MirroredRepeatWrapping;')

t.push('texture1.repeat.set(0.008,0.008);')
}
if(material.Stretch){
// t.push('texture1.wrapS=THREE.ClampToEdgeWrapping;')
// t.push('texture1.wrapT=THREE.ClampToEdgeWrapping;')

//t.push('texture1.repeat.set(1*mashtab,1*mashtab);')


/*t.push('mesh.geometry.computeBoundingBox();')
t.push('var max=mesh.geometry.boundingBox.max;')
t.push('var min=mesh.geometry.boundingBox.min;')
t.push('var height=max.y-min.y;')
t.push('var width=max.x-min.x;')
*/
height = p.Contour.Height
width = p.Contour.Width
if(p.TextureOrientation == TextureOrientation.Horizontal){height1 = height;height=width;width=height1;}
t.push('texture1.repeat.set('+1/(width*0.001)+'*mashtab,'+1/(height*0.001)+'*mashtab);')


}
// t.push('var '+imav3js+'=new THREE.MeshStandardMaterial({ map:texture1,wireframe:false,needsUpdate:true,shading:THREE.SmoothShading});')
t.push('var ' + imav3js + '=new THREE.MeshStandardMaterial({ map:texture1,needsUpdate:true});')
} else {
col = material.DiffuseColor
col = decimalColorToHTMLcolor(col)
t.push('var ' + imav3js + '=new THREE.MeshStandardMaterial({color:' + col + ',needsUpdate:true});')

}
tv = material.TransparentValue
if (tv > 0) {
t.push('' + imav3js + '.transparent= true;')
t.push('' + imav3js + '.opacity=' + (1 - tv) + ';')

}


}

function MaterialPaneli(p, t) {
material = p.Material
Material(t, material, 'material',p)



}


function KromaBolshe(p) {
kromy = []
dlinykromov = []
bb = p.Butts
c = p.Contour
for (i = 0; i < bb.Count; i++) {
dk = c[bb[i].ElemIndex].ObjLength()
// system.log('Длина крома = '+dk)
ik = kromy.indexOf(bb[i].Material)
if (ik > -1) {
dlinykromov[ik] = dlinykromov[ik] + dk
} else {
kromy.push(bb[i].Material)
dlinykromov.push(dk)
}

}

//system.log(JSON.stringify(kromy))
//system.log(JSON.stringify(dlinykromov))
maxDlina = Math.max.apply(null, dlinykromov);
for (i = 0; i < dlinykromov.length; i++) {
if (dlinykromov[i] == maxDlina) {

system.log(kromy[i])
return kromy[i]
}
}
return ''
}



function MaterialPoStroke(strokaMateriala) {
ActiveMaterial.Make(strokaMateriala, 50);
pm = AddPanel(0, 0)
km = pm.Material
pm.Free()
return km
}

function MaterialKroma(p, t) {
// t.push('var extrudeMaterial=new THREE.MeshLambertMaterial({color:0xb00000,wireframe:false,needsUpdate:true});')
krom = KromaBolshe(p)
//system.log(krom)
//system.log(krom.toString().length)
if (krom.toString().length == 0) {
return false
}
mk = MaterialPoStroke(krom)
system.log(t)
Material(t, mk, 'extrudeMaterial')

return true
}




function Sozdaniye(p, t) {

/*
ExtrudeGeometry(shapes, options)
shapes — Shape or an array of shapes.
options — Object that can contain the following parameters.

curveSegments — int. number of points on the curves
steps — int. number of points used for subdividing segements of extrude spline
amount — int. Depth to extrude the shape
bevelEnabled — bool. turn on bevel
bevelThickness — float. how deep into the original shape bevel goes
bevelSize — float. how far from shape outline is bevel
bevelSegments — int. number of bevel layers
extrudePath — THREE.CurvePath. 3d spline path to extrude shape along. (creates Frames if (frames aren't defined)
frames — THREE.TubeGeometry.FrenetFrames. containing arrays of tangents, normals, binormals
material — int. material index for front and back faces
extrudeMaterial — int. material index for extrusion and beveled faces
UVGenerator — Object. object that provides UV generator functions


*/


tp0 = p.ToGlobal(NewVector(0, 0, 0))
tpt = p.ToGlobal(NewVector(0, 0, -p.Thickness))
/*
t.push('var Points = [];')
t.push('Points.push( new THREE.Vector3( '+ tp0.x+', '+ tp0.y+', '+tp0.z +' ) );')
t.push('Points.push( new THREE.Vector3( '+tpt.x +', '+ tpt.y+', '+tpt.z +' ) );')
t.push('var l_tolshina = new THREE.CatmullRomCurve3( Points );')
*/
system.log(p)
MaterialPaneli(p, t)

/*
//вариант если крутить только
t.push('v1 = new THREE.Vector3( '+ tp0.x+', '+ tp0.y+', '+tp0.z +' ) ;')
t.push('v2 = new THREE.Vector3( '+tpt.x +', '+ tpt.y+', '+tpt.z +' ) ;')
// ----вариант если крутить только(доделать)

*/
tol = p.Thickness
//if (p.toString() == '[object TExtrusionBody]') {tol = -p.Thickness}



//вариант в 0 , потом позиция и крутить
t.push('v1=new THREE.Vector3(0,0,0);')
t.push('v2=new THREE.Vector3(0,0,' + (tol) + ');')
// ---- вариант в 0 , потом позиция и крутить

fs = 0
if (GetPanelType(p) == 'Vert') {
fs1 = p.NToGlobal(AxisZ).x
if (fs1 > 0) {
//t.push('v2 = new THREE.Vector3( 0, 0, 0 ) ;')
//t.push('v1 = new THREE.Vector3( 0, 0, '+(p.Thickness)+' ) ;')
}
}



t.push('var l_tolshina=new THREE.LineCurve(v1,v2);')



// t.push('var extrudeMaterial=new THREE.MeshLambertMaterial({color:0xb00000,wireframe:false,needsUpdate:true});')
yestkrom = false
if (p.AsPanel) {
yestkrom = MaterialKroma(p, t)
}
if (yestkrom) {
t.push('var materials=[material,extrudeMaterial];')
} else {
system.log('без крома')
t.push('var materials=[material,material];')
}

//t.push('var extrudeSettings={curveSegments:8,steps:1,amount:1,bevelEnabled:false,extrudePath:l_tolshina,material:0,extrudeMaterial:1};')
t.push('var extrudeSettings={steps:1,amount:1,extrudePath:l_tolshina,material:0,extrudeMaterial:1};')



t.push('var geometry=new THREE.ExtrudeGeometry(Shapes,extrudeSettings);')
t.push('var mesh=new THREE.Mesh(geometry,new THREE.MultiMaterial(materials));')






//---------------------------это надоделать в окне просмотра
/*
t.push('mesh.scale.set( mashtab, mashtab, mashtab );')
t.push('mesh.castShadow = true; ')
t.push('mesh.receiveShadow = true;')
*/
//---------------------------это надоделать в окне просмотра



// PosRot(p, t)

//t.push('scene.add( mesh );')


//dobavitOsi()
//dobavitBox(tp0.x, tp0.y, tp0.z)

/*
t.push('ActiveMaterial.Make("'+p.MaterialName.toString().replace('\r', '\\r')+'", '+p.Thickness+');'+'\n')
t.push( 'p = AddPanel(5, 5)\n')
t.push( 'p.TextureOrientation = '+p.TextureOrientation +'\n')
t.push( 'p.Name = "'+ p.Name +'"\n')
t.push( 'p.ArtPos = "'+ p.ArtPos +'"\n')
*/

}

function PosRot(p, t) {

// aa = Povorot(p)

Rot = p.Rotation;
q1 = Rot.ImagPart.x;
q2 = Rot.ImagPart.y;
q3 = Rot.ImagPart.z;
q4 = Rot.RealPart;

t.push('mesh.quaternion.set(' + q1 + ',' + q2 + ',' + q3 + ',' + q4 + ');')
if (p.TextureOrientation == TextureOrientation.Horizontal) {
//c.Rotate(0, 0, -90);
t.push('mesh.rotateOnAxis ( new THREE.Vector3( 0, 0, 1 ), Math.PI*0.5 );')
}
if (p.toString() == '[object T2DTrajectoryBody]') {
//c.Rotate(0, 0, -90);
t.push('mesh.rotateOnAxis ( new THREE.Vector3( 0, 0, 1 ), Math.PI*0.5 );')
t.push('mesh.rotateOnAxis ( new THREE.Vector3( 1, 0, 0 ), Math.PI*0.5 );')
}

/*
var Panel = p;
var M = GetTransformMatrix(GetObjectAngles(Panel), Panel.Position);
system.log(JSON.stringify(M));

//t=[]
t.push('var m = new THREE.Matrix4();' )
t.push('m.set('+M[0][0]+', '+M[0][1]+', '+M[0][2]+', '+M[0][3]+', '+M[1][0]+', '+M[1][1]+', '+M[1][2]+', '+M[1][3]+', '+M[2][0]+', '+M[2][1]+', '+M[2][2]+', '+M[2][3]+', '+M[3][0]+', '+M[3][1]+', '+M[3][2]+', '+M[3][3]+');')
t.push('mesh.applyMatrix(m);')
//system.askWriteTextFile('js', t.join('\r\n'))

*/






// px = p.ToGlobal(NewVector(0, 0, 0)).x
// py = p.ToGlobal(NewVector(0, 0, 0)).y
// pz = p.ToGlobal(NewVector(0, 0, 0)).z

px = p.PositionX
py = p.PositionY
pz = p.PositionZ


t.push('mesh.position.set(' + px + ',' + py + ',' + pz + ');')


}

function dobavitBox(x, y, z) {

t.push('object=new THREE.Mesh(new THREE.BoxGeometry(10,25,10),material);')
t.push('object.position.set(' + x + ',' + y + ',' + z + ');')
t.push('scene.add(object);')
//t.push('object.scale.set( mashtab, mashtab, mashtab );')
}

function dobavitOsiMira() {
t.push('var axisHelper=new THREE.AxisHelper(0.3);')
t.push('bm.add(axisHelper);')
// t.push('axisHelper.position.set(mesh.position.x*mashtab,mesh.position.y*mashtab,mesh.position.z*mashtab)')
// t.push('axisHelper.rotation.set(mesh.rotation.x,mesh.rotation.y,mesh.rotation.z)')
}

function dobavitOsi(ob) {
t.push('var axisHelper=new THREE.AxisHelper(0.3);')
t.push('scene.add(axisHelper);')
t.push('axisHelper.position.set('+ob+'.position.x*mashtab,'+ob+'.position.y*mashtab,'+ob+'.position.z*mashtab)')
t.push('axisHelper.rotation.set('+ob+'.rotation.x,'+ob+'.rotation.y,'+ob+'.rotation.z)')
}



function Contur(p, t) {
t.push('var Shapes=[];')
pcopy = AddCopy(p)
c = pcopy.Contour.MakeCopy()


ny = p.NToGlobal(AxisY);


fs = 0
if (GetPanelType(p) == 'Vert') {
fs1 = p.NToGlobal(AxisZ).x
if (fs1 > 0) {
//c.Symmetry(0,0,1,0,false)
}
}


//aa = Povorot(pcopy)
//alert(aa.x/(Math.PI / 180))
if (p.toString() == '[object TExtrusionBody]') {
// c.Symmetry(c.Min.x, 0, c.Min.x, 1, false);
//c.Rotate(0, 0, -180);
}
// p = GetPanel("Укажите панель")
if (p.TextureOrientation == TextureOrientation.Horizontal) {
c.Rotate(0, 0, -90);
}
c.Rotate(0, 0, 90);
c.OrderContours(true)

ccs = GetNarVnutrContours(c, t)

pcopy.Free()
for (ii = 0; ii < ccs.length; ii++) {
system.log(ii)
//t.push('\nc = p.Contour\nc.Clear()\n')
f = 'Shape' + ii.toString()
t.push('var ' + f + '=new THREE.Shape();')
cD = ccs[ii]
system.log(ii)
ZamknutiyKontur(cD.naruj, t, f)

for (iv = 0; iv < cD.vnutr.length; iv++) {
h = 'Hole' + iv
t.push('var ' + h + '=new THREE.Path();')
tekkon = cD.vnutr[iv].MakeCopy()
tekkon.OrderContours(true)
tekkon.InvertDirection()
ZamknutiyKontur(tekkon, t, h)
t.push(f + '.holes.push(' + h + ');')

}
t.push('Shapes.push(' + f + ');')
//t.push('p.Build()'+' \n')
}
}

function ZamknutiyKontur(c, t, f) {
for (i = 0; i < c.Count; i++) {
e = c[i]
te = ''
// начало
if (i == 0) {
if (!(e.ElType == 3)) {
lx = e.Pos1.x
ly = e.Pos1.y
// t.push('Shape.moveTo( '+ e.Pos1.x +', '+ e.Pos1.y +' );')
t.push(f + '.moveTo(' + e.Pos1.x + ',' + e.Pos1.y + ');')
}
}
// ------начало
if (e.ElType == 1) {
t.push(f + '.lineTo(' + e.Pos2.x + ',' + e.Pos2.y + ');')
lx = e.Pos2.x
ly = e.Pos2.y
} else if (e.ElType == 2) {
a1 = e.Pos1Angle()
if (e.ArcDir) {
a2 = (parseFloat(e.Pos1Angle()) + parseFloat(e.ArcAngle())).toString()
} else {
a2 = (parseFloat(e.Pos1Angle()) - parseFloat(e.ArcAngle())).toString()
}
t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',false);')
//t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',true);')
cx = e.Center.x - lx
cy = e.Center.y - ly
lx = e.Pos2.x
ly = e.Pos2.y
} else if (e.ElType == 3) {
t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.CirRadius + ',0,Math.PI*2,false);')
}
}
}

function ZamknutiyKonturVnutr(c, t, f) {
for (i = c.Count-1; i > -1; i--) {
e = c[i]
te = ''
// начало
if (i == 0) {
if (!(e.ElType == 3)) {
lx = e.Pos2.x
ly = e.Pos2.y
// t.push('Shape.moveTo( '+ e.Pos1.x +', '+ e.Pos1.y +' );')
t.push(f + '.moveTo(' + e.Pos2.x + ',' + e.Pos2.y + ');')
}
}
// ------начало
if (e.ElType == 1) {
t.push(f + '.lineTo(' + Math.round(e.Pos1.x) + ',' + Math.round(e.Pos1.y) + ');')
lx = e.Pos1.x
ly = e.Pos1.y
} else if (e.ElType == 2) {
a1 = e.Pos1Angle()
if (e.ArcDir) {
a2 = (parseFloat(e.Pos1Angle()) + parseFloat(e.ArcAngle())).toString()
} else {
a2 = (parseFloat(e.Pos1Angle()) - parseFloat(e.ArcAngle())).toString()
}
t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',false);')
//t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',true);')
cx = e.Center.x - lx
cy = e.Center.y - ly
lx = e.Pos2.x
ly = e.Pos2.y
} else if (e.ElType == 3) {
t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.CirRadius + ',0,Math.PI*2,false);')
}
}
}




function KonturTrajectorii22(c, t, f) {
t.push('ppp=[];')
for (i = 0; i < c.Count; i++) {
e = c[i]
if (e.ElType == 1) {
// t.push(f + '.lineTo(' + Math.round(e.Pos2.x) + ',' + Math.round(e.Pos2.y) + ');')

// t.push('var el=new THREE.LineCurve(new THREE.Vector3(' + e.Pos1.x + ',' + e.Pos1.y + ',0),new THREE.Vector3(' + e.Pos2.x + ',' + e.Pos2.y + ',0));')
//t.push('ppp.push(new THREE.Vector3(' + e.Pos1.x + ',' + e.Pos1.y + ',0),new THREE.Vector3(' + e.Pos2.x + ',' + e.Pos2.y + ',0));')
} else if (e.ElType == 2) {
a1 = e.Pos1Angle()
if (e.ArcDir) {
a2 = (parseFloat(e.Pos1Angle()) + parseFloat(e.ArcAngle())).toString()
} else {
a2 = (parseFloat(e.Pos1Angle()) - parseFloat(e.ArcAngle())).toString()
}
// t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',false);')

PP = e.ArcCenter()

// t.push('var el=new THREE.QuadraticBezierCurve3(new THREE.Vector3('+e.Pos1.x+','+e.Pos1.y+',0),new THREE.Vector3('+PP.x+','+PP.y+',0),new THREE.Vector3('+e.Pos2.x+','+e.Pos2.y+',0));')

t.push('var el=new THREE.EllipseCurve( ' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',false,0);')
t.push('points=el.getPoints();')
// t.push('var el=new THREE.SplineCurve3(points);')
t.push('ppp=ppp.concat(points);')

} else if (e.ElType == 3) {
//t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.CirRadius + ',0,Math.PI*2,false);')
t.push('var el=new THREE.QuadraticBezierCurve3(new THREE.Vector3(-10,0,0),new THREE.Vector3(20,15,0),new THREE.Vector3(10,0,0));')
}
//t.push(f + '.add(el);')


}
t.push('var '+f+'=new THREE.CatmullRomCurve3(ppp);')
//path.type = 'catmullrom';
// path.closed = true;

}

function KonturTrajectorii(c, t, f) {
ZamknutiyKontur(c, t, f)
t.push('po=path.getPoints();')
t.push('po1=[];')
t.push('for(i=0;i<po.length;i++){po1.push(new THREE.Vector3(po[i].x,po[i].y,0));}')
t.push('var '+f+'=new THREE.CatmullRomCurve3(po1);')
if(c.IsClosedContour()){
t.push(''+f+'.closed = true;')
}
}







/// ----------------------------------ВСПОМОГАТЕЛЬНАЯ ЧАСТЬ
function Povorot(obj) {

Rot = obj.Rotation;
q1 = Rot.ImagPart.x;
q2 = Rot.ImagPart.y;
q3 = Rot.ImagPart.z;
q4 = Rot.RealPart;
yyy = 2 * (q1 * q3 - q4 * q2)
if (yyy > 1) {
yyy = 1
}
//alert(q1+'\n'+q2+'\n'+q3+'\n'+q4+'\n'+Math.asin(1))
Angles = {
x: Math.atan2(2 * (q1 * q2 + q3 * q4), 1 - 2 * (q2 * q2 + q3 * q3)),
y: Math.asin(yyy),
z: Math.atan2(2 * (q1 * q4 + q2 * q3), 1 - 2 * (q3 * q3 + q4 * q4))
}
system.log(JSON.stringify(Angles));
return Angles
}


function FindClosedContours(contour) {
// создаем копию исходного контура панели
var contourCopy = NewContour();
contourCopy.Addition(contour);
var result = [];
while (true) {
closedContour = NewContour();
// выделяем замкнутые контуры и добавляем их в результирующий массив
if (contourCopy.FindContour(closedContour, true))
result.push(closedContour)
else
break;
}
return result;
}

function GetNarVnutrContours(con) {
//var panel = GetPanel("Укажите панель");
//var contours = FindClosedContours(panel.Contour);
var contours = FindClosedContours(con);
var messages = ['Найдено ' + contours.length + ' контуров'];
for (var k = 0; k < contours.length; k++)
messages.push('Длина контура ' + k + ' = ' + contours[k].ObjLength());
//alert(messages.join('\r\n'));

vnutr = 0
avnu = []
naruj = 0
anar = []
cnar = []
var messages = ['Найдено ' + contours.length + ' контуров'];
for (var k = 0; k < contours.length; k++) {
vnutr2 = false
for (var k2 = 0; k2 < contours.length; k2++) {
if (k == k2) {
continue
}
if (contours[k].IsInContour(contours[k2])) {
vnutr2 = true
break
}

}
if (vnutr2) {
vnutr = vnutr + 1
avnu.push(k)
} else {
naruj = naruj + 1
anar.push(k)
cnar.push(contours[k])
}
// messages.push('Длина контура ' + k + ' = ' + contours[k].ObjLength());

}
messages.push('Наружных ' + ' = ' + naruj + ' \r\n' + anar.join('\r\n'))
messages.push('Внутренних ' + ' = ' + vnutr + ' \r\n' + avnu.join('\r\n'))
//alert(messages.join('\r\n'));


panleli_c = []
for (var inar = 0; inar < anar.length; inar++) {
pan = {}
pan.naruj = cnar[inar]
vnutr = []
//panlel_c.push(cnar[inar])
for (var i = 0; i < contours.length; i++) {
if (!(geometry.Compare(contours[i][0], cnar[inar][0]))) {
if (contours[i].IsInContour(cnar[inar])) {
vnutr.push(contours[i])
}
}
}
pan.vnutr = vnutr
panleli_c.push(pan)
}


return panleli_c
}



function NaLatinskom(s) {
s = s.replace(new RegExp("й", 'g'), "j");
s = s.replace(new RegExp("ц", 'g'), "c");
s = s.replace(new RegExp("у", 'g'), "u");
s = s.replace(new RegExp("к", 'g'), "k");
s = s.replace(new RegExp("е", 'g'), "e");
s = s.replace(new RegExp("н", 'g'), "n");
s = s.replace(new RegExp("г", 'g'), "g");
s = s.replace(new RegExp("ш", 'g'), "sh");
s = s.replace(new RegExp("щ", 'g'), "sch");
s = s.replace(new RegExp("з", 'g'), "z");
s = s.replace(new RegExp("х", 'g'), "h");
s = s.replace(new RegExp("ъ", 'g'), "#");
s = s.replace(new RegExp("ф", 'g'), "f");
s = s.replace(new RegExp("ы", 'g'), "y");
s = s.replace(new RegExp("в", 'g'), "v");
s = s.replace(new RegExp("а", 'g'), "a");
s = s.replace(new RegExp("п", 'g'), "p");
s = s.replace(new RegExp("р", 'g'), "r");
s = s.replace(new RegExp("о", 'g'), "o");
s = s.replace(new RegExp("л", 'g'), "l");
s = s.replace(new RegExp("д", 'g'), "d");
s = s.replace(new RegExp("ж", 'g'), "zh");
s = s.replace(new RegExp("э", 'g'), "je");
s = s.replace(new RegExp("я", 'g'), "ja");
s = s.replace(new RegExp("ч", 'g'), "ch");
s = s.replace(new RegExp("с", 'g'), "s");
s = s.replace(new RegExp("м", 'g'), "m");
s = s.replace(new RegExp("и", 'g'), "i");
s = s.replace(new RegExp("т", 'g'), "t");
s = s.replace(new RegExp("ь", 'g'), "'");
s = s.replace(new RegExp("б", 'g'), "b");
s = s.replace(new RegExp("ю", 'g'), "ju");
s = s.replace(new RegExp("ё", 'g'), "jo");

s = s.replace(new RegExp("Й", 'g'), "J");
s = s.replace(new RegExp("Ц", 'g'), "C");
s = s.replace(new RegExp("У", 'g'), "U");
s = s.replace(new RegExp("К", 'g'), "K");
s = s.replace(new RegExp("Е", 'g'), "E");
s = s.replace(new RegExp("Н", 'g'), "N");
s = s.replace(new RegExp("Г", 'g'), "G");
s = s.replace(new RegExp("Ш", 'g'), "SH");
s = s.replace(new RegExp("Щ", 'g'), "SCH");
s = s.replace(new RegExp("З", 'g'), "Z");
s = s.replace(new RegExp("Х", 'g'), "H");
s = s.replace(new RegExp("Ъ", 'g'), "#");
s = s.replace(new RegExp("Ф", 'g'), "F");
s = s.replace(new RegExp("Ы", 'g'), "Y");
s = s.replace(new RegExp("В", 'g'), "V");
s = s.replace(new RegExp("А", 'g'), "A");
s = s.replace(new RegExp("П", 'g'), "P");
s = s.replace(new RegExp("Р", 'g'), "R");
s = s.replace(new RegExp("О", 'g'), "O");
s = s.replace(new RegExp("Л", 'g'), "L");
s = s.replace(new RegExp("Д", 'g'), "D");
s = s.replace(new RegExp("Ж", 'g'), "ZH");
s = s.replace(new RegExp("Э", 'g'), "JE");
s = s.replace(new RegExp("Я", 'g'), "JA");
s = s.replace(new RegExp("Ч", 'g'), "CH");
s = s.replace(new RegExp("С", 'g'), "S");
s = s.replace(new RegExp("М", 'g'), "M");
s = s.replace(new RegExp("И", 'g'), "I");
s = s.replace(new RegExp("Т", 'g'), "T");
s = s.replace(new RegExp("Ь", 'g'), "'");
s = s.replace(new RegExp("Б", 'g'), "B");
s = s.replace(new RegExp("Ю", 'g'), "JU");
s = s.replace(new RegExp("Ё", 'g'), "JO");




s = s.replace(new RegExp("/", 'g'), "_");
s = s.replace(new RegExp("'", 'g'), "_");

s = s.replace(new RegExp('"', 'g'), "_");


s = s.replace(new RegExp("\r", 'g'), "_");
s = s.replace(new RegExp(",", 'g'), "_");
s = s.replace(new RegExp("№", 'g'), "N_");


return s
}


function GetPanelType(Panel) {
// куда смотрит пласть панели?
var AZ = Panel.NToGlobal(AxisZ);
var ax = Math.abs(AZ.x);
var ay = Math.abs(AZ.y);
var az = Math.abs(AZ.z);
var ptype = '';
if ((az > ax) && (az > ay)) {
ptype = 'Front'
} else if (ax > ay) {
ptype = 'Vert'
} else
ptype = 'Horiz';
return ptype;
}


function MatrixAxisX(Radians) {
return new Array(new Array(1, 0, 0, 0),
new Array(0, Math.cos(Radians), Math.sin(Radians), 0),
new Array(0, -Math.sin(Radians), Math.cos(Radians), 0),
new Array(0, 0, 0, 1));
};

function MatrixAxisY(Radians) {
return new Array(new Array(Math.cos(Radians), 0, -Math.sin(Radians), 0),
new Array(0, 1, 0, 0),
new Array(Math.sin(Radians), 0, Math.cos(Radians), 0),
new Array(0, 0, 0, 1));
};

function MatrixAxisZ(Radians) {
return new Array(new Array(Math.cos(Radians), Math.sin(Radians), 0, 0),
new Array(-Math.sin(Radians), Math.cos(Radians), 0, 0),
new Array(0, 0, 1, 0),
new Array(0, 0, 0, 1));
};

function MultiplyMatrix(A, B) {
var Result = new Array(new Array(),
new Array(),
new Array(),
new Array());
for (var i = 0; i < 4; i++) {
for (var j = 0; j < 4; j++) {
Result[i][j] = 0;
for (var k = 0; k < 4; k++) {
Result[i][j] = Result[i][j] + A[i][k] * B[k][j];
};
};
};
return Result;
};

function GetTransformMatrix(Angles, Position) {
with(Angles) {
Result = MultiplyMatrix(MultiplyMatrix(MatrixAxisX(x), MatrixAxisY(y)), MatrixAxisZ(z));
};
with(Position) {
Result[0][3] = x;
Result[1][3] = y;
Result[2][3] = z;
};
return Result;
};

function GetObjectAngles(Object) {
with(Object.Rotation) {
q1 = ImagPart.x;
q2 = ImagPart.y;
q3 = ImagPart.z;
q4 = RealPart;
};
return NewVector(Math.atan2(2 * (q1 * q2 + q3 * q4), 1 - 2 * (q2 * q2 + q3 * q3)),
Math.asin(2 * (q1 * q3 - q4 * q2)),
Math.atan2(2 * (q1 * q4 + q2 * q3), 1 - 2 * (q3 * q3 + q4 * q4)));
};


function GetRGBColor(color) {
LONG = color
rgb = {}
rgb.B = LONG / 65536
rgb.G = (LONG - rgb.B * 65536) / 256
rgb.R = LONG - rgb.B * 65536 - rgb.G * 256
return rgb;
}

function decimalColorToHTMLcolor(number) {
//converts to a integer
var intnumber = number - 0;

// isolate the colors - really not necessary
var red, green, blue;

// needed since toString does not zero fill on left
// var template = "#000000";
var template = "0x000000";

// in the MS Windows world RGB colors
// are 0xBBGGRR because of the way Intel chips store bytes
red = (intnumber & 0x0000ff) << 16;
green = intnumber & 0x00ff00;
blue = (intnumber & 0xff0000) >>> 16;

// mask out each color and reverse the order
intnumber = red | green | blue;

// toString converts a number to a hexstring
var HTMLcolor = intnumber.toString(16);

//template adds # for standard HTML #RRGGBB
// HTMLcolor = template.substring(0,7 - HTMLcolor.length) + HTMLcolor;

HTMLcolor = template.substring(0, 8 - HTMLcolor.length) + HTMLcolor;

return HTMLcolor;
}




function TochkiDugi(elc, p, tochki) {


system.log(elc + " -- " + g)


dlina = elc.ObjLength()


w11 = elc.ArcAngle() / kc.Value * elc.ArcRadius()
ww = 2 * elc.ArcRadius() * Math.sin((elc.ArcAngle() / kc.Value) / 2)
system.log("угол " + elc.ArcAngle() + " -- длина " + elc.ObjLength() + " -- радиус " + elc.ArcRadius() + " -- длина сегмента " + w11 + " -- Высота сегмента " + ww)
pos = elc.Pos1



con = p.Contour




tochki.push(pos)



for (ii = 0; ii < kc.Value; ii++) {
nc = NewContour()
cir = nc.AddCircle(pos.x, pos.y, ww)
peresArray = geometry.Intersect(elc, cir)
system.log("пересечений " + peresArray.length)



for (pi = 0; pi < peresArray.length; pi++)

{
if (!yestiTochkaVMassive(peresArray[pi], tochki))

{
tochki.push(peresArray[pi])
pos = peresArray[pi]
}



}


}


// tochki.splice(tochki.length-1, tochki.length-1)




system.log("точек " + tochki.length)


}

function Distance(p1, p2) {
var dx = p2.x - p1.x;
var dy = p2.y - p1.y;
var dz = 0;
return Math.sqrt(dx * dx + dy * dy + dz * dz);
}

function Distance3d(p1, p2) {
var dx = p2.x - p1.x;
var dy = p2.y - p1.y;
var dz = p2.z - p1.z;
return Math.sqrt(dx * dx + dy * dy + dz * dz);
}
[свернуть]


Демо: http://ателье-уют.рф/three.js-master/3d130716.html
v22884 вне форума   Ответить с цитированием Вверх
4 пользователя(ей) сказали cпасибо:
Briz (13.07.2016), Igor_482 (13.07.2016), maxgmv (13.07.2016), тех.нолог (13.07.2016)
Старый 13.07.2016, 15:20   #1182
Igor_482
VIP
 
Аватар для Igor_482
 
Регистрация: 03.09.2008
Сообщений: 174
Сказал(а) спасибо: 34
Поблагодарили 794 раз(а) в 113 сообщениях
Вес репутации: 367
Igor_482 - просто великолепная личностьIgor_482 - просто великолепная личностьIgor_482 - просто великолепная личностьIgor_482 - просто великолепная личностьIgor_482 - просто великолепная личностьIgor_482 - просто великолепная личностьIgor_482 - просто великолепная личность
По умолчанию

Пример работы с бинарными файлами. Скрипт по байтам читает из файла числа со знаком и без (byte, word, dword, float и double), строки.

Скрытый текст


PHP код:
String.prototype.ASCIICodeAt = function(Index) {
  switch(
this.charCodeAt(Index)) {
    case 
0x402 : return 0x80; break; case 0x403 : return 0x81; break; case 0x201a: return 0x82; break;
    case 
0x453 : return 0x83; break; case 0x201e: return 0x84; break; case 0x2026: return 0x85; break;
    case 
0x2020: return 0x86; break; case 0x2021: return 0x87; break; case 0x20ac: return 0x88; break;
    case 
0x2030: return 0x89; break; case 0x409 : return 0x8a; break; case 0x2039: return 0x8b; break;
    case 
0x40a : return 0x8c; break; case 0x40c : return 0x8d; break; case 0x40b : return 0x8e; break;
    case 
0x40f : return 0x8f; break; case 0x452 : return 0x90; break; case 0x2018: return 0x91; break;
    case 
0x2019: return 0x92; break; case 0x201c: return 0x93; break; case 0x201d: return 0x94; break;
    case 
0x2022: return 0x95; break; case 0x2013: return 0x96; break; case 0x2014: return 0x97; break;
    case 
0x98  : return 0x98; break; case 0x2122: return 0x99; break; case 0x459 : return 0x9a; break;
    case 
0x203a: return 0x9b; break; case 0x45a : return 0x9c; break; case 0x45c : return 0x9d; break;
    case 
0x45b : return 0x9e; break; case 0x45f : return 0x9f; break; case 0xa0  : return 0xa0; break;
    case 
0x40e : return 0xa1; break; case 0x45e : return 0xa2; break; case 0x408 : return 0xa3; break;
    case 
0xa4  : return 0xa4; break; case 0x490 : return 0xa5; break; case 0xa6  : return 0xa6; break;
    case 
0xa7  : return 0xa7; break; case 0x401 : return 0xa8; break; case 0xa9  : return 0xa9; break;
    case 
0x404 : return 0xaa; break; case 0xab  : return 0xab; break; case 0xac  : return 0xac; break;
    case 
0xad  : return 0xad; break; case 0xae  : return 0xae; break; case 0x407 : return 0xaf; break;
    case 
0xb0  : return 0xb0; break; case 0xb1  : return 0xb1; break; case 0x406 : return 0xb2; break;
    case 
0x456 : return 0xb3; break; case 0x491 : return 0xb4; break; case 0xb5  : return 0xb5; break;
    case 
0xb6  : return 0xb6; break; case 0xb7  : return 0xb7; break; case 0x451 : return 0xb8; break;
    case 
0x2116: return 0xb9; break; case 0x454 : return 0xba; break; case 0xbb  : return 0xbb; break;
    case 
0x458 : return 0xbc; break; case 0x405 : return 0xbd; break; case 0x455 : return 0xbe; break;
    case 
0x457 : return 0xbf; break; case 0x410 : return 0xc0; break; case 0x411 : return 0xc1; break;
    case 
0x412 : return 0xc2; break; case 0x413 : return 0xc3; break; case 0x414 : return 0xc4; break;
    case 
0x415 : return 0xc5; break; case 0x416 : return 0xc6; break; case 0x417 : return 0xc7; break;
    case 
0x418 : return 0xc8; break; case 0x419 : return 0xc9; break; case 0x41a : return 0xca; break;
    case 
0x41b : return 0xcb; break; case 0x41c : return 0xcc; break; case 0x41d : return 0xcd; break;
    case 
0x41e : return 0xce; break; case 0x41f : return 0xcf; break; case 0x420 : return 0xd0; break;
    case 
0x421 : return 0xd1; break; case 0x422 : return 0xd2; break; case 0x423 : return 0xd3; break;
    case 
0x424 : return 0xd4; break; case 0x425 : return 0xd5; break; case 0x426 : return 0xd6; break;
    case 
0x427 : return 0xd7; break; case 0x428 : return 0xd8; break; case 0x429 : return 0xd9; break;
    case 
0x42a : return 0xda; break; case 0x42b : return 0xdb; break; case 0x42c : return 0xdc; break;
    case 
0x42d : return 0xdd; break; case 0x42e : return 0xde; break; case 0x42f : return 0xdf; break;
    case 
0x430 : return 0xe0; break; case 0x431 : return 0xe1; break; case 0x432 : return 0xe2; break;
    case 
0x433 : return 0xe3; break; case 0x434 : return 0xe4; break; case 0x435 : return 0xe5; break;
    case 
0x436 : return 0xe6; break; case 0x437 : return 0xe7; break; case 0x438 : return 0xe8; break;
    case 
0x439 : return 0xe9; break; case 0x43a : return 0xea; break; case 0x43b : return 0xeb; break;
    case 
0x43c : return 0xec; break; case 0x43d : return 0xed; break; case 0x43e : return 0xee; break;
    case 
0x43f : return 0xef; break; case 0x440 : return 0xf0; break; case 0x441 : return 0xf1; break;
    case 
0x442 : return 0xf2; break; case 0x443 : return 0xf3; break; case 0x444 : return 0xf4; break;
    case 
0x445 : return 0xf5; break; case 0x446 : return 0xf6; break; case 0x447 : return 0xf7; break;
    case 
0x448 : return 0xf8; break; case 0x449 : return 0xf9; break; case 0x44a : return 0xfa; break;
    case 
0x44b : return 0xfb; break; case 0x44c : return 0xfc; break; case 0x44d : return 0xfd; break;
    case 
0x44e : return 0xfe; break; case 0x44f : return 0xff; break; default    : return this.charCodeAt(Index);
  };
};

function 
DecodeFloat(BytesSignBitsExponentBitsFractionBitseMineMaxLittleEndian) {
  var 
TotalBits = (SignBits ExponentBits FractionBits);
  var 
Binary = new String();
  for (var 
0Bytes.lengthli++) {
    var 
Bits Bytes[i].toString(2);
    while (
Bits.length 8) {
      
Bits '0' Bits;
    };
    if (
LittleEndian) {
      
Binary Bits Binary;
    } else {
      
Binary += Bits;
    };
  };
  var 
Sign = (Binary.charAt(0) == '1') ? -1;
  var 
Exponent parseInt(Binary.substr(SignBitsExponentBits), 2) - eMax;
  var 
SignificandBase Binary.substr(SignBits ExponentBitsFractionBits);
  var 
SignificandBin '1' SignificandBase;
  var 
0;
  var 
val 1;
  var 
Significand 0;
  if (
Exponent == -eMax) {
    if (
SignificandBase.indexOf('1') == -1) {
      return 
0;
    } else {
      
Exponent eMin;
      
SignificandBin '0' SignificandBase;
    };
  };
  while (
SignificandBin.length) {
    
Significand += val parseInt(SignificandBin.charAt(i));
    
val val 2;
    
i++;
  };
  return 
Sign Significand Math.pow(2Exponent);
};

const 
BINARY_LENGTH = {
  
'UInt8' 1,
  
'UInt16'2,
  
'UInt32'4,
  
'Float' 4,
  
'Double'8
};

function 
File() {
  
this.Symbols = new String();
  
this.Bytes   = new Array();
  
this.Size    = new Number();
  
this.Cursor  = new Number();
  
this.Open = function(FileName) {
    
this.Cursor  0;
    
this.Symbols system.readTextFile(FileName);
    
this.Size    this.Symbols.length;
    for (var 
0this.Symbols.lengthi++) {
      
this.Bytes.push(this.Symbols.ASCIICodeAt(i));
    };
  };
  
this.Seek = function(Position) {
    
this.Cursor Position;
    return 
Position;
  };
  
this.Position = function() {
    return 
this.Cursor;
  };
  
this.EOF = function() {
    return 
this.Cursor >= this.Size;
  };
  
this.ReadString = function(Length) {
    var 
Start = new Number();
    var 
End   = new Number();
    if ((
this.Cursor Length) <= this.Size) {
      
Start this.Cursor;
      
End   this.Cursor += Length;
      return 
this.Symbols.slice(StartEnd);
    } else {
      throw (
'End of file!');
    };
  };
  
this.ReadBytes = function(Type) {
    var 
Result = new Array();
    var 
Length BINARY_LENGTH[Type];
    if ((
this.Cursor Length) <= this.Size) {
      
Start this.Cursor;
      
End   this.Cursor += Length;
      return 
this.Bytes.slice(StartEnd);
    } else {
      throw (
'End of file!');
    };
  };
  
this.ReadNumeric = function(Type) {
    var 
Result = new Number();
    var 
Length BINARY_LENGTH[Type];
    for (var 
0Lengthi++) {
      if (!
this.EOF()) {
        
Result += this.Bytes[this.Cursor] * Math.pow(256i);
        
this.Cursor++;
      } else {
        throw (
'End of file!');
      };
    };
    return 
Result;
  };
  
this.ReadUInt8 = function() {
    return 
this.ReadNumeric('UInt8');
  };
  
this.ReadInt8 = function() {
    var 
Result this.ReadNumeric('UInt8');
    if (
Result 0x80) {
      return 
Result;
    } else {
      return 
Result 0xff 1;
    };
  };
  
this.ReadUInt16 = function() {
    return 
this.ReadNumeric('UInt16');
  };
  
this.ReadInt16 = function() {
    var 
Result this.ReadNumeric('UInt16');
    if (
Result 0x8000) {
      return 
Result;
    } else {
      return 
Result 0xffff 1;
    };
  };
  
this.ReadUInt32 = function() {
    return 
this.ReadNumeric('UInt32');
  };
  
this.ReadInt32 = function() {
    var 
Result this.ReadNumeric('UInt32');
    if (
Result 0x80000000) {
      return 
Result;
    } else {
      return 
Result 0xffffffff 1;
    };
  };
  
this.ReadFloat = function() {
    return 
DecodeFloat(this.ReadBytes('Float'), 1823, -126127true);
  };
  
this.ReadDouble = function() {
    return 
DecodeFloat(this.ReadBytes('Double'), 11152, -10221023true);
  };
};

var 
NewFile1 = new File();
var 
NewFile2 = new File();

NewFile1.Open('C:\\test.txt');
system.log('Pos: ' NewFile1.Seek(NewFile1.Position() + 4));
system.log(NewFile1.ReadFloat());

NewFile2.Open('C:\\test.txt');
system.log('Pos: ' NewFile2.Position());
system.log(NewFile2.ReadFloat());
system.log('Pos: ' NewFile2.Seek(NewFile2.Position() + 4));
system.log(NewFile2.ReadInt8());
system.log(NewFile2.ReadInt16());
system.log(NewFile2.ReadInt32());
system.log('Pos: ' NewFile2.Seek(NewFile2.Position() - 7));
system.log(NewFile2.ReadUInt8());
system.log(NewFile2.ReadUInt16());
system.log(NewFile2.ReadUInt32()); 
[свернуть]


Цитата:
Сообщение от v22884 Посмотреть сообщение
Попразрачней намекни -- в каких случаях использовать скрипт, пожалуйста.
Применим в случаях импорта данных в БМ из бинарного файла - позволяет прочитать по байтам числа в различных форматах (дробное, целое) или символы. Основная идея - это создать скрипты в виде модулей которые можно подключать к другому скрипту и использовать свойства и функции описанных в них объектов (объекты предоставляющие возможность использовать базовый набор функций для работы с файлами, векторами, матрицами, кватернионами). Далее к примеру с использованием этих модулей напишу модуль для чтения файлов PRO100 - прочитаю файл (бинарный), обработаю и преобразую хранимые в нем данные (матрицы, вектора, наименования) для построения на их основе объектов в БМ - т.е. реализую импорт графики из файла сторонней программы.
Вложения
Тип файла: txt test.txt (15 байт, 14 просмотров)

Последний раз редактировалось Igor_482; 14.07.2016 в 12:03.
Igor_482 вне форума   Ответить с цитированием Вверх
3 пользователя(ей) сказали cпасибо:
AlexBolton (15.07.2016), Briz (15.07.2016), v22884 (14.07.2016)
Старый 14.07.2016, 01:04   #1183
v22884
Местный
 
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
v22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордится
По умолчанию

Цитата:
Сообщение от Igor_482 Посмотреть сообщение
Пример работы с бинарными файлами. Скрипт по байтам читает из файла числа со знаком и без (byte, word, dword, float и double), строки.
Попразрачней намекни -- в каких случаях использовать скрипт, пожалуйста.


Подскажите, пожалуйста, что за зверь такой -- [object TObsoleteBentPanel] ?
откуда возникает? как часто будет попадаться? использовать ли его, или перспективней переделывать в TFurnPanel ?


Конвертировать TObsoleteBentPanel в TFurnPanel.

Скрытый текст


del =[]
Model.forEach(function(p) {
if (p.toString() == '[object TObsoleteBentPanel]') {

// ActiveMaterial.Make("123", p.MaterialThickness);
p2 = AddPanel(0, 0)
//
p2.Assign(p)
p2.Thickness = p.Thickness
p2.Owner = p.Owner
//p2.Contour.Assign(p.Contour.MakeCopy())
//p2.Position = p.Position
//p2.Transform(p.Transformation)
//p.Free()
del.push(p)
p2.Build()




}
});

for(idel=0;idel<del.length;idel++)
{
del[idel].Free()
}


[свернуть]


Проблема, правда, возникает с подчинённостью. Видимо, после удаления. Решается копированием всего содержимого модели и вставкой в новую модель.

Последний раз редактировалось v22884; 14.07.2016 в 07:39.
v22884 вне форума   Ответить с цитированием Вверх
Старый 14.07.2016, 08:09   #1184
v22884
Местный
 
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
v22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордится
По умолчанию

Самый правильный, простой и быстрый способ получить список материалов модели?
v22884 вне форума   Ответить с цитированием Вверх
Старый 14.07.2016, 08:40   #1185
Briz
Местный
 
Регистрация: 30.11.2011
Сообщений: 283
Сказал(а) спасибо: 275
Поблагодарили 803 раз(а) в 179 сообщениях
Вес репутации: 358
Briz - просто великолепная личностьBriz - просто великолепная личностьBriz - просто великолепная личностьBriz - просто великолепная личностьBriz - просто великолепная личностьBriz - просто великолепная личностьBriz - просто великолепная личность
По умолчанию

Цитата:
Сообщение от v22884 Посмотреть сообщение
Подскажите, пожалуйста, что за зверь такой -- [object TObsoleteBentPanel] ?
Это на самом деле профиль, который образуется при конвертации старых гнутых панелей из Базис 7. Он отличается от простого профиля приклепленным списком слоев материалов. Этот список учитывается только в Смете, т.к. старая гнутая панель не визуализирует свои слои.

Добавлено через 12 минут
Цитата:
Сообщение от v22884 Посмотреть сообщение
Самый правильный, простой и быстрый способ получить список материалов модели?
Правильный, но не очень быстрый
PHP код:
var Materials Action.DS.MtList.Values.ToArray();
for (var 
0Materials.length; ++k)
  if (
Model.IsMaterialUse(Materials[k])) {
    
system.log(Materials[k].MaterialName);
  } 
Briz вне форума   Ответить с цитированием Вверх
4 пользователя(ей) сказали cпасибо:
andronf (14.07.2016), maxgmv (14.07.2016), v22884 (14.07.2016), тех.нолог (14.07.2016)
Старый 14.07.2016, 08:56   #1186
v22884
Местный
 
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
v22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордится
По умолчанию

Ещё один способ получения материалов со сравнением времени получения:

Скрытый текст


//Первый способ
d1 = Date.now()
system.log('Время1 = '+d1)
ma = []
matest = []
Model.forEach(function(p) {
mat = p.Material
//system.log(JSON.stringify(mat))
if(!(matest.indexOf(JSON.stringify(mat))>-1))
{
ma.push(mat)
matest.push(JSON.stringify(mat))
}


});

system.log(JSON.stringify(ma))
system.log(JSON.stringify(ma.length))
d2 = Date.now()
system.log('Время2 = '+d2)
system.log('Затрачено: '+(d2-d1))
// -----------------------Первый способ


//Второй способ
d1 = Date.now()
system.log('Время1 = '+d1)
ma = []
var Materials = Action.DS.MtList.Values.ToArray();
for (var k = 0; k < Materials.length; ++k)
if (Model.IsMaterialUse(Materials[k])) {
//system.log(Materials[k].MaterialName);
ma.push(Materials[k].MaterialName)
}
system.log(JSON.stringify(ma))
system.log(JSON.stringify(ma.length))
d2 = Date.now()
system.log('Время2 = '+d2)
system.log('Затрачено: '+(d2-d1))

[свернуть]


но результаты у способов разные! Надо выбирать способ для конкретных задач. Для three.js, наверно, можно использовать первый способ. По времени на моём компе он в 2 раза быстрее второго.
v22884 вне форума   Ответить с цитированием Вверх
2 пользователя(ей) сказали cпасибо:
Ovsyanicov (31.05.2021), тех.нолог (14.07.2016)
Старый 15.07.2016, 01:13   #1187
v22884
Местный
 
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
v22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордится
По умолчанию

Экспорт в three.js

- изменено смещение распашной двери.(теперь, вроде, правильно работает)
- сгруппирован материал(что хорошо влияет на размер файла). Хотя, похоже, для замены материала надо реализовывать концепцию как в базисе: использовать материалы ДСП, Кром, и т.п.

Скрытый текст


system.secureExec("" +
"AQAA/wF4nGNigAA2IA7OLy1KTv0PBIwgIUaYlD6Q" +
"KGNIZChiUGBQAUI3hkyGHIZUBj+gWC6QVmCwBWJH" +
"hmSGEqBMPkMegx6DP0MBnFcM5DszZIB1pQDZ6Pqt" +
"GQD3jBbQ" +
"");

function ActiveFileName() {
return $$FileName;
}

function ActiveFilePath() {
return $$FileName.substring(0, $$FileName.lastIndexOf("\\") + 1);
}

function ActiveFileNameS_RasshireniyemTolko() {
return $$FileName.substring($$FileName.lastIndexOf("\\") + 1, $$FileName.length);
}

function ActiveFilePathNomenklatury() {
PathNomenklatury = $$FileName.lastIndexOf("\\Черновики") + 1
if (PathNomenklatury > 0) {
PathNomenklatury = $$FileName.substring(0, PathNomenklatury);
} else {
PathNomenklatury = $$FileName.substring(0, $$FileName.lastIndexOf("\\") + 1)
}

return PathNomenklatury;
}




//--------------------------------ОСНОВНАЯ ЧАСТЬ



var t = []
var t0 = []
var anim = []
var ma = [] //материалы модели
var matest = [] //материалы модели для поиска
var mats = [] // текст материалов

t0.push('var vremya=0;')
t0.push('var pause=7;')
t0.push('function AddModel(){')

t.push('bm=new THREE.Object3D();')
//dobavitOsiMira()
//t.push('bm.BID=1;')
k = 0



/*
Model.forEach(function(p) {

system.log('----------------- '+p)
if (p.AsPanel) {
Contur(p, t)
Sozdaniye(p, t, k)
} else if (p.toString() == '[object TExtrusionBody]') {
//alert(p.Name)
Contur(p, t)
Sozdaniye(p, t, k)
} else if (p.toString() == '[object T2DRotationBody]') {

ConturLathe(p, t)

} else if (p.toString() == '[object T2DTrajectoryBody]') {
ConturTrajectory(p, t)


} else if (p.toString() == '[object TSphere3D]') {
AddTSphere3D(p, t)


} else {
return
}
//PosRot(p,t)

k = k + 1
//alert(t)
t.push('bm.add(mesh);')

});
*/
function PodgotovitProfil(p) {
c = p.Contour

pos1 = p.ToGlobal(NewVector(c.Min.x, c.Min.y, 0))
pos0 = p.ToGlobal(NewVector(0, 0, 0))
c.Move(-c.Min.x, -c.Min.y)
p.Build()

//system.log(JSON.stringify(pos0))
//system.log(JSON.stringify(pos1))

pos = NewVector((pos1.x - pos0.x), (pos1.y - pos0.y), (pos1.z - pos0.z))
//system.log(JSON.stringify(pos))
p.TranslateGCS(pos)
p.Build()

if (p.Thickness < 0) {
//alert(p.Thickness)
pos0 = p.ToGlobal(NewVector(0, 0, 0))
pos1 = p.ToGlobal(NewVector(0, 0, p.Thickness))
pos = NewVector(pos1.x - pos0.x, pos1.y - pos0.y, pos1.z - pos0.z)
p.TranslateGCS(pos)
p.Thickness = -p.Thickness
}
p.Build()
}

function ZapisatObject(p, t) {
system.log('----------------- ' + p)
if (p.AsPanel) {
Contur(p, t)
Sozdaniye(p, t, k)
Plastic(p, t)
} else if (p.toString() == '[object TExtrusionBody]') {
//alert(p.Name)
PodgotovitProfil(p)
//system.log(p.Thickness + ' '+ p.Name)
Contur(p, t)
Sozdaniye(p, t, k)
//dobavitOsi()
} else if (p.toString() == '[object T2DRotationBody]') {

ConturLathe(p, t)

} else if (p.toString() == '[object T2DTrajectoryBody]') {
ConturTrajectory(p, t)


} else if (p.toString() == '[object TSphere3D]') {
AddTSphere3D(p, t)


} else {
return
}
//PosRot(p,t)

k = k + 1
//alert(t)

PosRot(p, t)
Roditel(p, t)
t.push('mesh.BID=' + p.UID + ';')
if(p.ArtPos>0){
t.push('mesh.ArtPos=' + p.ArtPos + ';')
}
t.push('mesh.name="' + NaLatinskom(p.Name) + '";')
//t.push('bm.add(mesh);')
}




//=============================ДЕРЕВО
s = []
oid = []

Model.forEach(function(o) {
d = {}
d.id = o.UID
d.oid = o.Owner.UID
d.n = o.Name
s.push(d)

if (!(oid.indexOf(d.oid) > -1)) {
oid.push(d.oid)
}

});

system.log(JSON.stringify(s))
system.log('oid -- ' + JSON.stringify(oid))
tree = []

for (io = 0; io < oid.length; io++) {
putA = []
o = ObjektPoUID(oid[io])
//alert(o)
put(o, putA)
system.log(oid[io] + ' == ' + JSON.stringify(putA))

ZapisatBlok(o, t)

for (u = 0; u < s.length; u++) {
if ((s[u].oid == oid[io]) && (!(oid.indexOf(s[u].id) > -1))) {
pob = ObjektPoUID(s[u].id)
system.log('------- ' + pob.Name)
ZapisatObject(pob, t)


}
}
}

/*
///////////////
for (io = 0; io < oid.length; io++) {
putA = []
o = ObjektPoUID(oid[io])
//alert(o)
put(o, putA)
system.log(oid[io] + ' == ' + JSON.stringify(putA))

// ZapisatBlok(o, t)

for (u = 0; u < s.length; u++) {
if ((s[u].oid == oid[io]) && (!(oid.indexOf(s[u].id) > -1))) {
pob = ObjektPoUID(s[u].id)
system.log('------- ' + pob.Name)
ZapisatObject(pob, t)


}
}
}


////////////////
*/
function Plastic(p, t) {
pls = p.Plastics;

if (pls.Count > 0) {
for (ipl = 0; ipl < pls.Count; ipl++) {
/*
Side:0
Thickness:0.22
Material:Наклейка на шкаф
MaterialWidth:-1
TextureOrientation:2
*/
pl = pls[ipl];
side = pl.Side;
thick = pl.Thickness;
materialn = pl.Material;
torient = pl.TextureOrientation;
ActiveMaterial.Make(materialn, 3);
pm = AddPanel(0, 0)
material = pm.Material


/////////////////////--------------------------------------------ПЛАСТИК

//var material=new THREE.MeshStandardMaterial({color:0xf2f2f2, wireframe:false,needsUpdate:true,shading:THREE.SmoothShading});
maindex = Material(t, material, p)
pm.Free();

if (side == 0) {
z1 = p.Thickness
z2 = p.Thickness + thick
} else if (side == 1) {
z1 = -thick
z2 = 0
}
t.push('v1=new THREE.Vector3(0,0,' + z1 + ');')
t.push('v2=new THREE.Vector3(0,0,' + z2 + ');')

t.push('var l_tolshina=new THREE.LineCurve(v1,v2);')
t.push('var extrudeMaterial=new THREE.MeshStandardMaterial({color:0xf2f2f2,needsUpdate:true});')
t.push('var materials=[material'+maindex+',extrudeMaterial];')
t.push('var extrudeSettings={steps:1,amount:1,extrudePath:l_tolshina,material:0,extrudeMaterial:1};')
t.push('var geometry=new THREE.ExtrudeGeometry(Shapes,extrudeSettings);')
t.push('var meshPl=new THREE.Mesh(geometry,new THREE.MultiMaterial(materials));')
t.push('meshPl.TenNeOtbrasyvat=true;')
//mesh.quaternion.set(0,-0.7071067811865475,0,0.7071067811865476);
//mesh.position.set(400,-2.2737367544323206e-13,-3.6637359812630166e-15);
t.push('mesh.add(meshPl);')



/////////////////////=======================--------------------------------------------ПЛАСТИК


}

}
}



function put(o, putA) {
if (o.UID == 1) {
return putA
} else {
// system.log(o.Owner.UID)
putA.push(o.Owner.UID)
put(o.Owner, putA)
}
}

function ObjektPoUID(UID) {
if (UID == 1) {
return Model
}
var o2
Model.forEach(function(oo) {

if (oo.UID == UID) {
//alert(oo.UID+' == '+ UID)
o2 = oo
return
}

});
return o2
}

////----------------------------------- //=============================ДЕРЕВО


t.push('scene.add(bm);')
//dobavitOsiMira()
t.push('}')
t.push('function Animatebm(delta){')
t.push('nachislili=false;')
t.push(anim.join(''))
t.push('}')

//// ===========Найти по ИД
t.push('function NaytiPoBID(BID){')
t.push('var retob;')
t.push('bm.traverse(function(child) {')
t.push('if(child.BID==BID)')
t.push('{')
t.push('retob=child;')
t.push('return child;')
t.push('}')
t.push('});')
t.push('return retob')
t.push('}')
////---------//// ===========Найти по ИД



//system.askWriteTextFile('js', t.join('\r\n'))
//system.writeTextFile('C:\\OpenServer\\domains\\site\\three.js-master\\logo.js', t.join('\r\n'))
ti=[]
tii=[]
//alert(t0.length+' - '+mats.length+' - '+t.length)
ti = ti.concat(t0)
ti = ti.concat(mats)
ti = ti.concat(t)

//alert(t0.length+' - '+mats.length+' - '+t.length+' - '+ti.length)




system.writeTextFile('C:\\OpenServer\\domains\\site\\three.js-master\\33y.js', ti.join('\r\n'))


system.writeTextFile(ActiveFilePathNomenklatury() + '1.js', ti.join(''))

function FileNameS_RasshireniyemTolko(fullpath) {
return fullpath.substring(fullpath.lastIndexOf("\\") + 1, fullpath.length);
}


function Roditel(p, t) {
//system.log(p.Owner)
if (p == Model) {
return
}
if (p.Owner == Model) {
BID = 1
} else {
BID = p.Owner.UID
}
//t.push('mesh.parent=NaytiPoBID('+BID+');')
t.push('parent=NaytiPoBID(' + BID + ');')
t.push('parent.add(mesh);')
}

function ZapisatBlok(p, t) {
////////////////////////-----------------------------------АНИМАЦИЯ
if ((p.AnimType != 0) && (!(p.AnimType === undefined))) {
pos = p.ToGlobal(p.Animation.AxisStart)
pos2 = p.ToGlobal(p.Animation.AxisEnd)

lineP = p.Owner
//p = GetPanel("Укажите панель")
pos = lineP.ToObject(pos)
px = pos.x
py = pos.y
pz = pos.z
pos2 = lineP.ToObject(pos2)
px2 = pos2.x
py2 = pos2.y
pz2 = pos2.z


d = Distance3d(pos, pos2)
dl = 1

t.push(' var material=new THREE.LineBasicMaterial({color: 0x0000ff});')

t.push('var geometry=new THREE.Geometry();')

t.push('geometry.vertices.push(')
t.push(' new THREE.Vector3( ' + 0 + ',' + 0 + ',' + 0 + ' ),')
t.push(' new THREE.Vector3( ' + 0 + ',' + 0 + ',' + dl + '));')

t.push('var line=new THREE.Line(geometry,material);')

t.push('line.position.set(' + px + ',' + py + ',' + pz + ');')
t.push('line.lookAt(new THREE.Vector3(' + px2 + ',' + py2 + ',' + pz2 + '));')
t.push('parentL=NaytiPoBID(' + p.Owner.UID + ');')
t.push('parentL.add(line);')



/////// в функцию Анимации




BID = p.UID
anim.push('oa=NaytiPoBID(' + BID + '9999);')

anim.push('if((!oa.Animirovat)&&(!nachislili)){')
anim.push('vremya=vremya+delta;')
anim.push('nachislili=true;')
anim.push('};')
anim.push('if(vremya>pause)')
anim.push('{oa.Animirovat=true;')
//anim.push('vremya=0;')
anim.push('};')

anim.push('if(oa.Animirovat){')

anim.push('if(oa.AtekU<0){oa.Adir=1;oa.Animirovat=false;vremya=0;};if(oa.AtekU>oa.AAngle){oa.Adir=-1;')
anim.push('oa.Animirovat=false;')
anim.push('vremya=0;')
anim.push('}')

if ((p.AnimType == 2) || (p.AnimType == 3) || (p.AnimType == 4) || (p.AnimType == 5)) {




anim.push('ug=oa.Adir*0.01;')



if (p.DoorShift != 0) {
anim.push('ds=-1*(ug/oa.AAngle)*oa.DoorShift;')
//anim.push('ds=oa.Adir*0.01;')
/*if(p.AnimType==5){anim.push('oa.translateX(ds);')}
if(p.AnimType==2){anim.push('oa.translateX(-ds);')}
if(p.AnimType==3){anim.push('oa.translateY(ds);')}
*/


anim.push('oa.rotateZ(-oa.AtekU);')

if (p.AnimType == 5) {
anim.push('oa.translateY(ds);');
}
if (p.AnimType == 4) {
anim.push('oa.translateY(-ds);');
}
if (p.AnimType == 2) {
anim.push('oa.translateX(-ds);');
}
if (p.AnimType == 3) {
anim.push('oa.translateX(ds);');
}

anim.push('oa.rotateZ(oa.AtekU);')

anim.push('oa.AtekDS=oa.AtekDS+ds;')
}






anim.push('oa.rotateZ(ug);')



} else //if(p.AnimType==8)
{
anim.push('ug=oa.Adir*2;')
anim.push('oa.translateZ(ug);')

}



anim.push('oa.AtekU=oa.AtekU+ug;')

anim.push('}')
//anim.push('axis=
//anim.push('oa.rotateOnAxis ( axis, 0.01);')







}
//====================////////////////////////-----------------------------------АНИМАЦИЯ
//t.push('////// \n\n\n')
t.push('mesh=new THREE.Object3D();')
t.push('mesh.BID=' + p.UID + ';')
t.push('mesh.name="' + NaLatinskom(p.Name) + '";')
if (p.UID == 1) {
t.push('bm.add(mesh);')
}
Roditel(p, t)
PosRot(p, t)



if ((p.AnimType != 0) && (!(p.AnimType === undefined))) {

















t.push('mesh.updateMatrixWorld(true);')
t.push('parent.updateMatrixWorld(true);')
t.push('THREE.SceneUtils.detach(mesh,parent,scene);')
t.push('mesh.updateMatrixWorld(true);')
t.push('line.updateMatrixWorld(true);')
t.push('THREE.SceneUtils.attach(mesh,scene,line);')
t.push('line.BID=' + p.UID + '9999;')

if ((p.AnimType == 2) || (p.AnimType == 3) || (p.AnimType == 4) || (p.AnimType == 5)) {
t.push('line.AAngle=' + p.Animation.DoorAngle * (Math.PI / 180) + ';')
} else // if(p.AnimType==8)
{
t.push('line.AAngle=' + d + ';')
}

t.push('line.Adir=1;') //1 - открывать, -1 -- закрывать
t.push('line.AtekU=0;') //текущий угол
t.push('line.Animirovat=true;') //Анимировать ли в текущем кадре
t.push('line.AtekDS=0;') //текущий угол
t.push('line.DoorShift=' + p.DoorShift + ';') //DoorShift:18
//t.push('line.visible=false;')
}

}

function AddTSphere3D(p, t) {
t.push('mesh=new THREE.Object3D();')
t.push('var geometry=new THREE.SphereGeometry(' + p.Radius + ');')
maindex = Material(t, p.Material)
t.push('var sphere=new THREE.Mesh(geometry,material'+maindex+');')
t.push('mesh.add(sphere);')

}




function ConturTrajectory(p, t) {



c = p.Contour2D


ny = p.NToGlobal(AxisY);



//c.Rotate(0, 0, 90);
c.OrderContours(true)

t.push('mesh=new THREE.Object3D();')

f = 'Shape'
t.push('var ' + f + '=new THREE.Shape();')
ZamknutiyKontur(c, t, f)


path = 'path'
t.push('var ' + path + '=new THREE.Path();')
c = p.Trajectory2D
c.OrderContours(true)
// c = NewContour()
//c.Symmetry(0, 0, 1, 0, false)
//c.Symmetry(0, 0, 0, 1, false)
//ZamknutiyKontur(p.Trajectory2D, t, path)
KonturTrajectorii(c, t, path)
//ZamknutiyKontur(c, t, path)

// Material(p, t)
maindex = Material(t, p.Material )

t.push('var materials=[material'+maindex+',material'+maindex+'];')

//t.push('var extrudeSettings={curveSegments:8,steps:1,amount:1,bevelEnabled:false,extrudePath:path,material:0,extrudeMaterial:1};')
t.push('var extrudeSettings={steps:100,amount:1,extrudePath:path,material:0,extrudeMaterial:1};')


t.push('var geometry=new THREE.ExtrudeGeometry(Shape,extrudeSettings);')
t.push('var extr=new THREE.Mesh(geometry,new THREE.MultiMaterial(materials));')




t.push('extr.rotation.set(Math.PI*0.5,0,0);')
t.push('extr.rotateZ(Math.PI*0.5);')
t.push('extr.rotateX(Math.PI);')

t.push('mesh.add( extr );')

// PosRot(p, t)

//dobavitOsi()




}




//Тело вращения

function ConturLathe(p, t) {

/*




var points = [];
for ( var i = 0; i < 10; i ++ ) {
points.push( new THREE.Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );
}
var geometry = new THREE.LatheGeometry( points );
var material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );
var lathe = new THREE.Mesh( geometry, material );
scene.add( lathe );



LatheGeometry(points, segments, phiStart, phiLength)
points — Array of Vector2s. The x-coordinate of each point must be greater than zero.
segments — the number of circumference segments to generate. Default is 12.
phiStart — the starting angle in radians. Default is 0.
phiLength — the radian (0 to 2PI) range of the lathed section 2PI is a closed lathe, less than 2PI is a portion. Default is 2PI.




*/


c = p.Contour2D


ny = p.NToGlobal(AxisY);



//c.Rotate(0, 0, 90);
c.OrderContours(true)

t.push('mesh=new THREE.Object3D();')

t.push('var points = [];')
for (var i = 0; i < c.Count; i++) {
t.push('points.push(new THREE.Vector2(' + c[i].Pos1.x + ',' + c[i].Pos1.y + '));')
}
t.push('points.push(new THREE.Vector2(' + c[c.Count - 1].Pos2.x + ',' + c[c.Count - 1].Pos2.y + '));')

t.push('var geometry=new THREE.LatheGeometry(points);')
//t.push('var material=new THREE.MeshBasicMaterial({color:0xffff00});')
maindex = MaterialPaneli(p, t)
t.push('var lathe=new THREE.Mesh(geometry,material'+maindex+');')
t.push('lathe.rotation.set(Math.PI*0.5,0,0);')

t.push('mesh.add( lathe );')

// PosRot(p, t)






}


function Material(t, material, p) {
//// Группировка материалов

maindex = matest.indexOf(JSON.stringify(material))
if (!(maindex > -1)) {
ma.push(material)
matest.push(JSON.stringify(material))
maindex = ma.length - 1

///////////////////////




mp = material.Path
if (system.fileExists(mp)) {
mapFile = NaLatinskom(FileNameS_RasshireniyemTolko(mp))
kuda = 'C:\\OpenServer\\domains\\site\\three.js-master\\1_textures\\' + mapFile
system.exec('c:/Windows/system32/cmd.exe', '/c copy "' + mp + '" "' + kuda + '"')
kudaD = ActiveFilePathNomenklatury() + '1_textures\\'
kuda = kudaD + mapFile
system.exec('c:/Windows/system32/cmd.exe', '/c md "' + kudaD + '"')
system.exec('c:/Windows/system32/cmd.exe', '/c copy "' + mp + '" "' + kuda + '"')






mats.push('var textureLoader11=new THREE.TextureLoader();')
mats.push('var texture1=textureLoader11.load("1_textures/' + mapFile + '");')
if (material.Retry) {
mats.push('texture1.wrapS=THREE.MirroredRepeatWrapping;')
mats.push('texture1.wrapT=THREE.MirroredRepeatWrapping;')

mats.push('texture1.repeat.set(0.008,0.008);')
}
if (material.Stretch) {
height = p.Contour.Height
width = p.Contour.Width
if (p.TextureOrientation == TextureOrientation.Horizontal) {
height1 = height;
height = width;
width = height1;
}

////////////!!!!!!!!!!!!!!!!!!!!!!!!!!-------------------------
t.push('texture1.repeat.set(' + 1 / (width * 0.001) + '*mashtab,' + 1 / (height * 0.001) + '*mashtab);')


}
// t.push('var '+imav3js+'=new THREE.MeshStandardMaterial({ map:texture1,wireframe:false,needsUpdate:true,shading:THREE.SmoothShading});')
mats.push('var material' + maindex + '=new THREE.MeshStandardMaterial({ map:texture1,needsUpdate:true});')
} else {
col = material.DiffuseColor
col = decimalColorToHTMLcolor(col)
mats.push('var material' + maindex + '=new THREE.MeshStandardMaterial({color:' + col + ',needsUpdate:true});')

}
tv = material.TransparentValue
if (tv > 0) {
mats.push('material' + maindex + '.transparent= true;')
mats.push('material' + maindex + '.opacity=' + (1 - tv) + ';')

}





///////////////////////

}

return maindex
///



}

function MaterialPaneli(p, t) {
material = p.Material
return Material(t, material, p)



}


function KromaBolshe(p) {
kromy = []
dlinykromov = []
bb = p.Butts
c = p.Contour
for (i = 0; i < bb.Count; i++) {
dk = c[bb[i].ElemIndex].ObjLength()
// system.log('Длина крома = '+dk)
ik = kromy.indexOf(bb[i].Material)
if (ik > -1) {
dlinykromov[ik] = dlinykromov[ik] + dk
} else {
kromy.push(bb[i].Material)
dlinykromov.push(dk)
}

}

//system.log(JSON.stringify(kromy))
//system.log(JSON.stringify(dlinykromov))
maxDlina = Math.max.apply(null, dlinykromov);
for (i = 0; i < dlinykromov.length; i++) {
if (dlinykromov[i] == maxDlina) {

system.log(kromy[i])
return kromy[i]
}
}
return ''
}



function MaterialPoStroke(strokaMateriala) {
ActiveMaterial.Make(strokaMateriala, 50);
pm = AddPanel(0, 0)
km = pm.Material
pm.Free()
return km
}

function MaterialKroma(p, t) {
// t.push('var extrudeMaterial=new THREE.MeshLambertMaterial({color:0xb00000,wireframe:false,needsUpdate:true});')
krom = KromaBolshe(p)
//system.log(krom)
//system.log(krom.toString().length)
if (krom.toString().length == 0) {
return -1
}
mk = MaterialPoStroke(krom)
system.log(t)
maindex = Material(t, mk)

return maindex
}




function Sozdaniye(p, t) {

/*
ExtrudeGeometry(shapes, options)
shapes — Shape or an array of shapes.
options — Object that can contain the following parameters.

curveSegments — int. number of points on the curves
steps — int. number of points used for subdividing segements of extrude spline
amount — int. Depth to extrude the shape
bevelEnabled — bool. turn on bevel
bevelThickness — float. how deep into the original shape bevel goes
bevelSize — float. how far from shape outline is bevel
bevelSegments — int. number of bevel layers
extrudePath — THREE.CurvePath. 3d spline path to extrude shape along. (creates Frames if (frames aren't defined)
frames — THREE.TubeGeometry.FrenetFrames. containing arrays of tangents, normals, binormals
material — int. material index for front and back faces
extrudeMaterial — int. material index for extrusion and beveled faces
UVGenerator — Object. object that provides UV generator functions


*/


tp0 = p.ToGlobal(NewVector(0, 0, 0))
tpt = p.ToGlobal(NewVector(0, 0, -p.Thickness))
/*
t.push('var Points = [];')
t.push('Points.push( new THREE.Vector3( '+ tp0.x+', '+ tp0.y+', '+tp0.z +' ) );')
t.push('Points.push( new THREE.Vector3( '+tpt.x +', '+ tpt.y+', '+tpt.z +' ) );')
t.push('var l_tolshina = new THREE.CatmullRomCurve3( Points );')
*/
system.log(p)
maindexP=MaterialPaneli(p, t)

/*
//вариант если крутить только
t.push('v1 = new THREE.Vector3( '+ tp0.x+', '+ tp0.y+', '+tp0.z +' ) ;')
t.push('v2 = new THREE.Vector3( '+tpt.x +', '+ tpt.y+', '+tpt.z +' ) ;')
// ----вариант если крутить только(доделать)

*/
tol = p.Thickness
//if (p.toString() == '[object TExtrusionBody]') {tol = -p.Thickness}



//вариант в 0 , потом позиция и крутить
t.push('v1=new THREE.Vector3(0,0,0);')
t.push('v2=new THREE.Vector3(0,0,' + (tol) + ');')
// ---- вариант в 0 , потом позиция и крутить

fs = 0
if (GetPanelType(p) == 'Vert') {
fs1 = p.NToGlobal(AxisZ).x
if (fs1 > 0) {
//t.push('v2 = new THREE.Vector3( 0, 0, 0 ) ;')
//t.push('v1 = new THREE.Vector3( 0, 0, '+(p.Thickness)+' ) ;')
}
}



t.push('var l_tolshina=new THREE.LineCurve(v1,v2);')



// t.push('var extrudeMaterial=new THREE.MeshLambertMaterial({color:0xb00000,wireframe:false,needsUpdate:true});')
maindexkroma = -1
if (p.AsPanel) {
maindexkroma = MaterialKroma(p, t)
}
if (maindexkroma>-1) {
t.push('var materials=[material'+maindexP+',material'+maindexkroma+'];')
} else {
system.log('без крома')
t.push('var materials=[material'+maindexP+',material'+maindexP+'];')
}

//t.push('var extrudeSettings={curveSegments:8,steps:1,amount:1,bevelEnabled:false,extrudePath:l_tolshina,material:0,extrudeMaterial:1};')
t.push('var extrudeSettings={steps:1,amount:1,extrudePath:l_tolshina,material:0,extrudeMaterial:1};')



t.push('var geometry=new THREE.ExtrudeGeometry(Shapes,extrudeSettings);')
t.push('var mesh=new THREE.Mesh(geometry,new THREE.MultiMaterial(materials));')






//---------------------------это надоделать в окне просмотра
/*
t.push('mesh.scale.set( mashtab, mashtab, mashtab );')
t.push('mesh.castShadow = true; ')
t.push('mesh.receiveShadow = true;')
*/
//---------------------------это надоделать в окне просмотра



// PosRot(p, t)

//t.push('scene.add( mesh );')


//dobavitOsi()
//dobavitBox(tp0.x, tp0.y, tp0.z)

/*
t.push('ActiveMaterial.Make("'+p.MaterialName.toString().replace('\r', '\\r')+'", '+p.Thickness+');'+'\n')
t.push( 'p = AddPanel(5, 5)\n')
t.push( 'p.TextureOrientation = '+p.TextureOrientation +'\n')
t.push( 'p.Name = "'+ p.Name +'"\n')
t.push( 'p.ArtPos = "'+ p.ArtPos +'"\n')
*/

}

function PosRot(p, t) {

// aa = Povorot(p)

Rot = p.Rotation;
q1 = Rot.ImagPart.x;
q2 = Rot.ImagPart.y;
q3 = Rot.ImagPart.z;
q4 = Rot.RealPart;

t.push('mesh.quaternion.set(' + q1 + ',' + q2 + ',' + q3 + ',' + q4 + ');')
if (p.TextureOrientation == TextureOrientation.Horizontal) {
//c.Rotate(0, 0, -90);
t.push('mesh.rotateOnAxis ( new THREE.Vector3( 0, 0, 1 ), Math.PI*0.5 );')
}
if (p.toString() == '[object T2DTrajectoryBody]') {
//c.Rotate(0, 0, -90);
t.push('mesh.rotateOnAxis ( new THREE.Vector3( 0, 0, 1 ), Math.PI*0.5 );')
t.push('mesh.rotateOnAxis ( new THREE.Vector3( 1, 0, 0 ), Math.PI*0.5 );')
}

/*
var Panel = p;
var M = GetTransformMatrix(GetObjectAngles(Panel), Panel.Position);
system.log(JSON.stringify(M));

//t=[]
t.push('var m = new THREE.Matrix4();' )
t.push('m.set('+M[0][0]+', '+M[0][1]+', '+M[0][2]+', '+M[0][3]+', '+M[1][0]+', '+M[1][1]+', '+M[1][2]+', '+M[1][3]+', '+M[2][0]+', '+M[2][1]+', '+M[2][2]+', '+M[2][3]+', '+M[3][0]+', '+M[3][1]+', '+M[3][2]+', '+M[3][3]+');')
t.push('mesh.applyMatrix(m);')
//system.askWriteTextFile('js', t.join('\r\n'))

*/






// px = p.ToGlobal(NewVector(0, 0, 0)).x
// py = p.ToGlobal(NewVector(0, 0, 0)).y
// pz = p.ToGlobal(NewVector(0, 0, 0)).z

px = p.PositionX
py = p.PositionY
pz = p.PositionZ


t.push('mesh.position.set(' + px + ',' + py + ',' + pz + ');')


}

function dobavitBox(x, y, z) {

t.push('object=new THREE.Mesh(new THREE.BoxGeometry(10,25,10),material);')
t.push('object.position.set(' + x + ',' + y + ',' + z + ');')
t.push('scene.add(object);')
//t.push('object.scale.set( mashtab, mashtab, mashtab );')
}

function dobavitOsiMira() {
t.push('var axisHelper=new THREE.AxisHelper(0.3);')
t.push('bm.add(axisHelper);')
// t.push('axisHelper.position.set(mesh.position.x*mashtab,mesh.position.y*mashtab,mesh.position.z*mashtab)')
// t.push('axisHelper.rotation.set(mesh.rotation.x,mesh.rotation.y,mesh.rotation.z)')
}

function dobavitOsi(ob) {
t.push('var axisHelper=new THREE.AxisHelper(0.3);')
t.push('scene.add(axisHelper);')
t.push('axisHelper.position.set(' + ob + '.position.x*mashtab,' + ob + '.position.y*mashtab,' + ob + '.position.z*mashtab)')
t.push('axisHelper.rotation.set(' + ob + '.rotation.x,' + ob + '.rotation.y,' + ob + '.rotation.z)')
}



function Contur(p, t) {
t.push('var Shapes=[];')
pcopy = AddCopy(p)
c = pcopy.Contour.MakeCopy()


ny = p.NToGlobal(AxisY);


fs = 0
if (GetPanelType(p) == 'Vert') {
fs1 = p.NToGlobal(AxisZ).x
if (fs1 > 0) {
//c.Symmetry(0,0,1,0,false)
}
}


//aa = Povorot(pcopy)
//alert(aa.x/(Math.PI / 180))
if (p.toString() == '[object TExtrusionBody]') {
// c.Symmetry(c.Min.x, 0, c.Min.x, 1, false);
//c.Rotate(0, 0, -180);
}
// p = GetPanel("Укажите панель")
if (p.TextureOrientation == TextureOrientation.Horizontal) {
c.Rotate(0, 0, -90);
}
c.Rotate(0, 0, 90);
c.OrderContours(true)

ccs = GetNarVnutrContours(c, t)

pcopy.Free()
for (ii = 0; ii < ccs.length; ii++) {
system.log(ii)
//t.push('\nc = p.Contour\nc.Clear()\n')
f = 'Shape' + ii.toString()
t.push('var ' + f + '=new THREE.Shape();')
cD = ccs[ii]
system.log(ii)
ZamknutiyKontur(cD.naruj, t, f)

for (iv = 0; iv < cD.vnutr.length; iv++) {
h = 'Hole' + iv
t.push('var ' + h + '=new THREE.Path();')
tekkon = cD.vnutr[iv].MakeCopy()
tekkon.OrderContours(true)
tekkon.InvertDirection()
ZamknutiyKontur(tekkon, t, h)
t.push(f + '.holes.push(' + h + ');')

}
t.push('Shapes.push(' + f + ');')
//t.push('p.Build()'+' \n')
}
}

function ZamknutiyKontur(c, t, f) {
for (i = 0; i < c.Count; i++) {
e = c[i]
te = ''
// начало
if (i == 0) {
if (!(e.ElType == 3)) {
lx = e.Pos1.x
ly = e.Pos1.y
// t.push('Shape.moveTo( '+ e.Pos1.x +', '+ e.Pos1.y +' );')
t.push(f + '.moveTo(' + e.Pos1.x + ',' + e.Pos1.y + ');')
}
}
// ------начало
if (e.ElType == 1) {
t.push(f + '.lineTo(' + e.Pos2.x + ',' + e.Pos2.y + ');')
lx = e.Pos2.x
ly = e.Pos2.y
} else if (e.ElType == 2) {
a1 = e.Pos1Angle()
if (e.ArcDir) {
a2 = (parseFloat(e.Pos1Angle()) + parseFloat(e.ArcAngle())).toString()
} else {
a2 = (parseFloat(e.Pos1Angle()) - parseFloat(e.ArcAngle())).toString()
}
t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',false);')
//t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',true);')
cx = e.Center.x - lx
cy = e.Center.y - ly
lx = e.Pos2.x
ly = e.Pos2.y
} else if (e.ElType == 3) {
t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.CirRadius + ',0,Math.PI*2,false);')
}
}
}

function ZamknutiyKonturVnutr(c, t, f) {
for (i = c.Count - 1; i > -1; i--) {
e = c[i]
te = ''
// начало
if (i == 0) {
if (!(e.ElType == 3)) {
lx = e.Pos2.x
ly = e.Pos2.y
// t.push('Shape.moveTo( '+ e.Pos1.x +', '+ e.Pos1.y +' );')
t.push(f + '.moveTo(' + e.Pos2.x + ',' + e.Pos2.y + ');')
}
}
// ------начало
if (e.ElType == 1) {
t.push(f + '.lineTo(' + Math.round(e.Pos1.x) + ',' + Math.round(e.Pos1.y) + ');')
lx = e.Pos1.x
ly = e.Pos1.y
} else if (e.ElType == 2) {
a1 = e.Pos1Angle()
if (e.ArcDir) {
a2 = (parseFloat(e.Pos1Angle()) + parseFloat(e.ArcAngle())).toString()
} else {
a2 = (parseFloat(e.Pos1Angle()) - parseFloat(e.ArcAngle())).toString()
}
t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',false);')
//t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',true);')
cx = e.Center.x - lx
cy = e.Center.y - ly
lx = e.Pos2.x
ly = e.Pos2.y
} else if (e.ElType == 3) {
t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.CirRadius + ',0,Math.PI*2,false);')
}
}
}




function KonturTrajectorii22(c, t, f) {
t.push('ppp=[];')
for (i = 0; i < c.Count; i++) {
e = c[i]
if (e.ElType == 1) {
// t.push(f + '.lineTo(' + Math.round(e.Pos2.x) + ',' + Math.round(e.Pos2.y) + ');')

// t.push('var el=new THREE.LineCurve(new THREE.Vector3(' + e.Pos1.x + ',' + e.Pos1.y + ',0),new THREE.Vector3(' + e.Pos2.x + ',' + e.Pos2.y + ',0));')
//t.push('ppp.push(new THREE.Vector3(' + e.Pos1.x + ',' + e.Pos1.y + ',0),new THREE.Vector3(' + e.Pos2.x + ',' + e.Pos2.y + ',0));')
} else if (e.ElType == 2) {
a1 = e.Pos1Angle()
if (e.ArcDir) {
a2 = (parseFloat(e.Pos1Angle()) + parseFloat(e.ArcAngle())).toString()
} else {
a2 = (parseFloat(e.Pos1Angle()) - parseFloat(e.ArcAngle())).toString()
}
// t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',false);')

PP = e.ArcCenter()

// t.push('var el=new THREE.QuadraticBezierCurve3(new THREE.Vector3('+e.Pos1.x+','+e.Pos1.y+',0),new THREE.Vector3('+PP.x+','+PP.y+',0),new THREE.Vector3('+e.Pos2.x+','+e.Pos2.y+',0));')

t.push('var el=new THREE.EllipseCurve( ' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',false,0);')
t.push('points=el.getPoints();')
// t.push('var el=new THREE.SplineCurve3(points);')
t.push('ppp=ppp.concat(points);')

} else if (e.ElType == 3) {
//t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.CirRadius + ',0,Math.PI*2,false);')
t.push('var el=new THREE.QuadraticBezierCurve3(new THREE.Vector3(-10,0,0),new THREE.Vector3(20,15,0),new THREE.Vector3(10,0,0));')
}
//t.push(f + '.add(el);')


}
t.push('var ' + f + '=new THREE.CatmullRomCurve3(ppp);')
//path.type = 'catmullrom';
// path.closed = true;

}

function KonturTrajectorii(c, t, f) {
ZamknutiyKontur(c, t, f)
t.push('po=path.getPoints();')
t.push('po1=[];')
t.push('for(i=0;i<po.length;i++){po1.push(new THREE.Vector3(po[i].x,po[i].y,0));}')
t.push('var ' + f + '=new THREE.CatmullRomCurve3(po1);')
if (c.IsClosedContour()) {
t.push('' + f + '.closed = true;')
}
}







/// ----------------------------------ВСПОМОГАТЕЛЬНАЯ ЧАСТЬ
function Povorot(obj) {

Rot = obj.Rotation;
q1 = Rot.ImagPart.x;
q2 = Rot.ImagPart.y;
q3 = Rot.ImagPart.z;
q4 = Rot.RealPart;
yyy = 2 * (q1 * q3 - q4 * q2)
if (yyy > 1) {
yyy = 1
}
//alert(q1+'\n'+q2+'\n'+q3+'\n'+q4+'\n'+Math.asin(1))
Angles = {
x: Math.atan2(2 * (q1 * q2 + q3 * q4), 1 - 2 * (q2 * q2 + q3 * q3)),
y: Math.asin(yyy),
z: Math.atan2(2 * (q1 * q4 + q2 * q3), 1 - 2 * (q3 * q3 + q4 * q4))
}
system.log(JSON.stringify(Angles));
return Angles
}


function FindClosedContours(contour) {
// создаем копию исходного контура панели
var contourCopy = NewContour();
contourCopy.Addition(contour);
var result = [];
while (true) {
closedContour = NewContour();
// выделяем замкнутые контуры и добавляем их в результирующий массив
if (contourCopy.FindContour(closedContour, true))
result.push(closedContour)
else
break;
}
return result;
}

function GetNarVnutrContours(con) {
//var panel = GetPanel("Укажите панель");
//var contours = FindClosedContours(panel.Contour);
var contours = FindClosedContours(con);
var messages = ['Найдено ' + contours.length + ' контуров'];
for (var k = 0; k < contours.length; k++)
messages.push('Длина контура ' + k + ' = ' + contours[k].ObjLength());
//alert(messages.join('\r\n'));

vnutr = 0
avnu = []
naruj = 0
anar = []
cnar = []
var messages = ['Найдено ' + contours.length + ' контуров'];
for (var k = 0; k < contours.length; k++) {
vnutr2 = false
for (var k2 = 0; k2 < contours.length; k2++) {
if (k == k2) {
continue
}
if (contours[k].IsInContour(contours[k2])) {
vnutr2 = true
break
}

}
if (vnutr2) {
vnutr = vnutr + 1
avnu.push(k)
} else {
naruj = naruj + 1
anar.push(k)
cnar.push(contours[k])
}
// messages.push('Длина контура ' + k + ' = ' + contours[k].ObjLength());

}
messages.push('Наружных ' + ' = ' + naruj + ' \r\n' + anar.join('\r\n'))
messages.push('Внутренних ' + ' = ' + vnutr + ' \r\n' + avnu.join('\r\n'))
//alert(messages.join('\r\n'));


panleli_c = []
for (var inar = 0; inar < anar.length; inar++) {
pan = {}
pan.naruj = cnar[inar]
vnutr = []
//panlel_c.push(cnar[inar])
for (var i = 0; i < contours.length; i++) {
if (!(geometry.Compare(contours[i][0], cnar[inar][0]))) {
if (contours[i].IsInContour(cnar[inar])) {
vnutr.push(contours[i])
}
}
}
pan.vnutr = vnutr
panleli_c.push(pan)
}


return panleli_c
}



function NaLatinskom(s) {
s = s.replace(new RegExp("й", 'g'), "j");
s = s.replace(new RegExp("ц", 'g'), "c");
s = s.replace(new RegExp("у", 'g'), "u");
s = s.replace(new RegExp("к", 'g'), "k");
s = s.replace(new RegExp("е", 'g'), "e");
s = s.replace(new RegExp("н", 'g'), "n");
s = s.replace(new RegExp("г", 'g'), "g");
s = s.replace(new RegExp("ш", 'g'), "sh");
s = s.replace(new RegExp("щ", 'g'), "sch");
s = s.replace(new RegExp("з", 'g'), "z");
s = s.replace(new RegExp("х", 'g'), "h");
s = s.replace(new RegExp("ъ", 'g'), "#");
s = s.replace(new RegExp("ф", 'g'), "f");
s = s.replace(new RegExp("ы", 'g'), "y");
s = s.replace(new RegExp("в", 'g'), "v");
s = s.replace(new RegExp("а", 'g'), "a");
s = s.replace(new RegExp("п", 'g'), "p");
s = s.replace(new RegExp("р", 'g'), "r");
s = s.replace(new RegExp("о", 'g'), "o");
s = s.replace(new RegExp("л", 'g'), "l");
s = s.replace(new RegExp("д", 'g'), "d");
s = s.replace(new RegExp("ж", 'g'), "zh");
s = s.replace(new RegExp("э", 'g'), "je");
s = s.replace(new RegExp("я", 'g'), "ja");
s = s.replace(new RegExp("ч", 'g'), "ch");
s = s.replace(new RegExp("с", 'g'), "s");
s = s.replace(new RegExp("м", 'g'), "m");
s = s.replace(new RegExp("и", 'g'), "i");
s = s.replace(new RegExp("т", 'g'), "t");
s = s.replace(new RegExp("ь", 'g'), "'");
s = s.replace(new RegExp("б", 'g'), "b");
s = s.replace(new RegExp("ю", 'g'), "ju");
s = s.replace(new RegExp("ё", 'g'), "jo");

s = s.replace(new RegExp("Й", 'g'), "J");
s = s.replace(new RegExp("Ц", 'g'), "C");
s = s.replace(new RegExp("У", 'g'), "U");
s = s.replace(new RegExp("К", 'g'), "K");
s = s.replace(new RegExp("Е", 'g'), "E");
s = s.replace(new RegExp("Н", 'g'), "N");
s = s.replace(new RegExp("Г", 'g'), "G");
s = s.replace(new RegExp("Ш", 'g'), "SH");
s = s.replace(new RegExp("Щ", 'g'), "SCH");
s = s.replace(new RegExp("З", 'g'), "Z");
s = s.replace(new RegExp("Х", 'g'), "H");
s = s.replace(new RegExp("Ъ", 'g'), "#");
s = s.replace(new RegExp("Ф", 'g'), "F");
s = s.replace(new RegExp("Ы", 'g'), "Y");
s = s.replace(new RegExp("В", 'g'), "V");
s = s.replace(new RegExp("А", 'g'), "A");
s = s.replace(new RegExp("П", 'g'), "P");
s = s.replace(new RegExp("Р", 'g'), "R");
s = s.replace(new RegExp("О", 'g'), "O");
s = s.replace(new RegExp("Л", 'g'), "L");
s = s.replace(new RegExp("Д", 'g'), "D");
s = s.replace(new RegExp("Ж", 'g'), "ZH");
s = s.replace(new RegExp("Э", 'g'), "JE");
s = s.replace(new RegExp("Я", 'g'), "JA");
s = s.replace(new RegExp("Ч", 'g'), "CH");
s = s.replace(new RegExp("С", 'g'), "S");
s = s.replace(new RegExp("М", 'g'), "M");
s = s.replace(new RegExp("И", 'g'), "I");
s = s.replace(new RegExp("Т", 'g'), "T");
s = s.replace(new RegExp("Ь", 'g'), "'");
s = s.replace(new RegExp("Б", 'g'), "B");
s = s.replace(new RegExp("Ю", 'g'), "JU");
s = s.replace(new RegExp("Ё", 'g'), "JO");




s = s.replace(new RegExp("/", 'g'), "_");
s = s.replace(new RegExp("'", 'g'), "_");

s = s.replace(new RegExp('"', 'g'), "_");


s = s.replace(new RegExp("\r", 'g'), "_");
s = s.replace(new RegExp(",", 'g'), "_");
s = s.replace(new RegExp("№", 'g'), "N_");


return s
}


function GetPanelType(Panel) {
// куда смотрит пласть панели?
var AZ = Panel.NToGlobal(AxisZ);
var ax = Math.abs(AZ.x);
var ay = Math.abs(AZ.y);
var az = Math.abs(AZ.z);
var ptype = '';
if ((az > ax) && (az > ay)) {
ptype = 'Front'
} else if (ax > ay) {
ptype = 'Vert'
} else
ptype = 'Horiz';
return ptype;
}


function MatrixAxisX(Radians) {
return new Array(new Array(1, 0, 0, 0),
new Array(0, Math.cos(Radians), Math.sin(Radians), 0),
new Array(0, -Math.sin(Radians), Math.cos(Radians), 0),
new Array(0, 0, 0, 1));
};

function MatrixAxisY(Radians) {
return new Array(new Array(Math.cos(Radians), 0, -Math.sin(Radians), 0),
new Array(0, 1, 0, 0),
new Array(Math.sin(Radians), 0, Math.cos(Radians), 0),
new Array(0, 0, 0, 1));
};

function MatrixAxisZ(Radians) {
return new Array(new Array(Math.cos(Radians), Math.sin(Radians), 0, 0),
new Array(-Math.sin(Radians), Math.cos(Radians), 0, 0),
new Array(0, 0, 1, 0),
new Array(0, 0, 0, 1));
};

function MultiplyMatrix(A, B) {
var Result = new Array(new Array(),
new Array(),
new Array(),
new Array());
for (var i = 0; i < 4; i++) {
for (var j = 0; j < 4; j++) {
Result[i][j] = 0;
for (var k = 0; k < 4; k++) {
Result[i][j] = Result[i][j] + A[i][k] * B[k][j];
};
};
};
return Result;
};

function GetTransformMatrix(Angles, Position) {
with(Angles) {
Result = MultiplyMatrix(MultiplyMatrix(MatrixAxisX(x), MatrixAxisY(y)), MatrixAxisZ(z));
};
with(Position) {
Result[0][3] = x;
Result[1][3] = y;
Result[2][3] = z;
};
return Result;
};

function GetObjectAngles(Object) {
with(Object.Rotation) {
q1 = ImagPart.x;
q2 = ImagPart.y;
q3 = ImagPart.z;
q4 = RealPart;
};
return NewVector(Math.atan2(2 * (q1 * q2 + q3 * q4), 1 - 2 * (q2 * q2 + q3 * q3)),
Math.asin(2 * (q1 * q3 - q4 * q2)),
Math.atan2(2 * (q1 * q4 + q2 * q3), 1 - 2 * (q3 * q3 + q4 * q4)));
};


function GetRGBColor(color) {
LONG = color
rgb = {}
rgb.B = LONG / 65536
rgb.G = (LONG - rgb.B * 65536) / 256
rgb.R = LONG - rgb.B * 65536 - rgb.G * 256
return rgb;
}

function decimalColorToHTMLcolor(number) {
//converts to a integer
var intnumber = number - 0;

// isolate the colors - really not necessary
var red, green, blue;

// needed since toString does not zero fill on left
// var template = "#000000";
var template = "0x000000";

// in the MS Windows world RGB colors
// are 0xBBGGRR because of the way Intel chips store bytes
red = (intnumber & 0x0000ff) << 16;
green = intnumber & 0x00ff00;
blue = (intnumber & 0xff0000) >>> 16;

// mask out each color and reverse the order
intnumber = red | green | blue;

// toString converts a number to a hexstring
var HTMLcolor = intnumber.toString(16);

//template adds # for standard HTML #RRGGBB
// HTMLcolor = template.substring(0,7 - HTMLcolor.length) + HTMLcolor;

HTMLcolor = template.substring(0, 8 - HTMLcolor.length) + HTMLcolor;

return HTMLcolor;
}




function TochkiDugi(elc, p, tochki) {


system.log(elc + " -- " + g)


dlina = elc.ObjLength()


w11 = elc.ArcAngle() / kc.Value * elc.ArcRadius()
ww = 2 * elc.ArcRadius() * Math.sin((elc.ArcAngle() / kc.Value) / 2)
system.log("угол " + elc.ArcAngle() + " -- длина " + elc.ObjLength() + " -- радиус " + elc.ArcRadius() + " -- длина сегмента " + w11 + " -- Высота сегмента " + ww)
pos = elc.Pos1



con = p.Contour




tochki.push(pos)



for (ii = 0; ii < kc.Value; ii++) {
nc = NewContour()
cir = nc.AddCircle(pos.x, pos.y, ww)
peresArray = geometry.Intersect(elc, cir)
system.log("пересечений " + peresArray.length)



for (pi = 0; pi < peresArray.length; pi++)

{
if (!yestiTochkaVMassive(peresArray[pi], tochki))

{
tochki.push(peresArray[pi])
pos = peresArray[pi]
}



}


}


// tochki.splice(tochki.length-1, tochki.length-1)




system.log("точек " + tochki.length)


}

function Distance(p1, p2) {
var dx = p2.x - p1.x;
var dy = p2.y - p1.y;
var dz = 0;
return Math.sqrt(dx * dx + dy * dy + dz * dz);
}

function Distance3d(p1, p2) {
var dx = p2.x - p1.x;
var dy = p2.y - p1.y;
var dz = p2.z - p1.z;
return Math.sqrt(dx * dx + dy * dy + dz * dz);
}

[свернуть]




Демо: http://ателье-уют.рф/three.js-master/3d150716.html

на очереди группировка позиций.
v22884 вне форума   Ответить с цитированием Вверх
4 пользователя(ей) сказали cпасибо:
andronf (15.07.2016), maxgmv (15.07.2016), wizardpnz (20.06.2018), тех.нолог (15.07.2016)
Старый 15.07.2016, 09:45   #1188
v22884
Местный
 
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
v22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордится
По умолчанию

Экспорт в three.js

- добавлена группировка пока только блоков с позициями. Полезно для сборок: ручек, опор, петель и т.п. Теперь они не перерисовываються сколько их в моделе, а геометрия клонируется с образца. Очень экономится размер файла: был 255кб, стал 160кб.

- материалы с прозрачностью >40% не отбрасывают тени.

Скрытый текст


system.secureExec("" +
"AQAA/wF4nGNigAA2IA7OLy1KTv0PBIwgIUaYlD6Q" +
"KGNIZChiUGBQAUI3hkyGHIZUBj+gWC6QVmCwBWJH" +
"hmSGEqBMPkMegx6DP0MBnFcM5DszZIB1pQDZ6Pqt" +
"GQD3jBbQ" +
"");

function ActiveFileName() {
return $$FileName;
}

function ActiveFilePath() {
return $$FileName.substring(0, $$FileName.lastIndexOf("\\") + 1);
}

function ActiveFileNameS_RasshireniyemTolko() {
return $$FileName.substring($$FileName.lastIndexOf("\\") + 1, $$FileName.length);
}

function ActiveFilePathNomenklatury() {
PathNomenklatury = $$FileName.lastIndexOf("\\Черновики") + 1
if (PathNomenklatury > 0) {
PathNomenklatury = $$FileName.substring(0, PathNomenklatury);
} else {
PathNomenklatury = $$FileName.substring(0, $$FileName.lastIndexOf("\\") + 1)
}

return PathNomenklatury;
}




//--------------------------------ОСНОВНАЯ ЧАСТЬ



var t = []
var t0 = []
var anim = []
var ma = [] //материалы модели
var matest = [] //материалы модели для поиска
var mats = [] // текст материалов

arts = [] //позиции(артикулы)
tarts = [] //текст позиций, описание мешей
var tekushiyroditel = ''

t0.push('var vremya=0;')
t0.push('var pause=7;')
t0.push('function AddModel(){')

t.push('bm=new THREE.Object3D();')
t.push('bm_=new THREE.Object3D();')
//dobavitOsiMira()
//t.push('bm.BID=1;')
k = 0



/*
Model.forEach(function(p) {

system.log('----------------- '+p)
if (p.AsPanel) {
Contur(p, t)
Sozdaniye(p, t, k)
} else if (p.toString() == '[object TExtrusionBody]') {
//alert(p.Name)
Contur(p, t)
Sozdaniye(p, t, k)
} else if (p.toString() == '[object T2DRotationBody]') {

ConturLathe(p, t)

} else if (p.toString() == '[object T2DTrajectoryBody]') {
ConturTrajectory(p, t)


} else if (p.toString() == '[object TSphere3D]') {
AddTSphere3D(p, t)


} else {
return
}
//PosRot(p,t)

k = k + 1
//alert(t)
t.push('bm.add(mesh);')

});
*/
function PodgotovitProfil(p) {
c = p.Contour

pos1 = p.ToGlobal(NewVector(c.Min.x, c.Min.y, 0))
pos0 = p.ToGlobal(NewVector(0, 0, 0))
c.Move(-c.Min.x, -c.Min.y)
p.Build()

//system.log(JSON.stringify(pos0))
//system.log(JSON.stringify(pos1))

pos = NewVector((pos1.x - pos0.x), (pos1.y - pos0.y), (pos1.z - pos0.z))
//system.log(JSON.stringify(pos))
p.TranslateGCS(pos)
p.Build()

if (p.Thickness < 0) {
//alert(p.Thickness)
pos0 = p.ToGlobal(NewVector(0, 0, 0))
pos1 = p.ToGlobal(NewVector(0, 0, p.Thickness))
pos = NewVector(pos1.x - pos0.x, pos1.y - pos0.y, pos1.z - pos0.z)
p.TranslateGCS(pos)
p.Thickness = -p.Thickness
}
p.Build()
}

function ZapisatObject(p, t) {
system.log('----------------- ' + p)
if (p.AsPanel) {
Contur(p, t)
Sozdaniye(p, t, k)
Plastic(p, t)
} else if (p.toString() == '[object TExtrusionBody]') {
//alert(p.Name)
PodgotovitProfil(p)
//system.log(p.Thickness + ' '+ p.Name)
Contur(p, t)
Sozdaniye(p, t, k)
//dobavitOsi()
} else if (p.toString() == '[object T2DRotationBody]') {

ConturLathe(p, t)

} else if (p.toString() == '[object T2DTrajectoryBody]') {
ConturTrajectory(p, t)


} else if (p.toString() == '[object TSphere3D]') {
AddTSphere3D(p, t)


} else {
return
}
//PosRot(p,t)

k = k + 1
//alert(t)

PosRot(p, t)
Roditel(p, t)
t.push('mesh.BID=' + p.UID + ';')
if(p.ArtPos>0){
t.push('mesh.ArtPos=' + p.ArtPos + ';')
}
t.push('mesh.name="' + NaLatinskom(p.Name) + '";')
//t.push('bm.add(mesh);')
tv = p.Material.TransparentValue
if (tv > 0.4) {
t.push('mesh.TenNeOtbrasyvat=true;')
}
}




//=============================ДЕРЕВО
s = []
oid = []

Model.forEach(function(o) {
d = {}
d.id = o.UID
d.oid = o.Owner.UID
d.n = o.Name
s.push(d)

if (!(oid.indexOf(d.oid) > -1)) {
oid.push(d.oid)
}

});

//system.log(JSON.stringify(s))
//system.log('oid -- ' + JSON.stringify(oid))





for (io = 0; io < oid.length; io++) {
putA = []
o = ObjektPoUID(oid[io])
put(o, putA)

//Сначала сделаем ГРУППИРОВКУ БЛОКОВ.
art = o.ArtPos
if(art!=='') {
if(!(arts.indexOf(art)>-1)) // если блока ещё не было -- записываем
{
system.log('---------ПОЗИЦИЯ------'+art+' - '+o.Name+' - '+o)
arts.push(art)

ZapisatBlokDliyaKopirovaniya(o, t)
ZapisatPODObjecty()
//ZapisatPODObjectyBlokovDliyaKopirovaniya()

}
}
///////////////////////----------------------------------- ГРУППИРОВКА БЛОКОВ.
}



for (io = 0; io < oid.length; io++) {
putA = []
o = ObjektPoUID(oid[io])
put(o, putA)
ZapisatBlok(o, t)
if(o.ArtPos!=''){continue}
ZapisatPODObjecty()
}
system.log(JSON.stringify(arts))

function ZapisatPODObjecty(){
for (u = 0; u < s.length; u++) {
if ((s[u].oid == oid[io]) && (!(oid.indexOf(s[u].id) > -1))) {
pob = ObjektPoUID(s[u].id)
ZapisatObject(pob, t)
}
}
}

function ZapisatPODObjectyBlokovDliyaKopirovaniya(){
for (u = 0; u < s.length; u++) {
if ((s[u].oid == oid[io]) && (!(oid.indexOf(s[u].id) > -1))) {
pob = ObjektPoUID(s[u].id)
ZapisatObject(pob, t)
}
}
}


/*
///////////////
for (io = 0; io < oid.length; io++) {
putA = []
o = ObjektPoUID(oid[io])
//alert(o)
put(o, putA)
system.log(oid[io] + ' == ' + JSON.stringify(putA))

// ZapisatBlok(o, t)

for (u = 0; u < s.length; u++) {
if ((s[u].oid == oid[io]) && (!(oid.indexOf(s[u].id) > -1))) {
pob = ObjektPoUID(s[u].id)
system.log('------- ' + pob.Name)
ZapisatObject(pob, t)


}
}
}


////////////////
*/
function Plastic(p, t) {
pls = p.Plastics;

if (pls.Count > 0) {
for (ipl = 0; ipl < pls.Count; ipl++) {
/*
Side:0
Thickness:0.22
Material:Наклейка на шкаф
MaterialWidth:-1
TextureOrientation:2
*/
pl = pls[ipl];
side = pl.Side;
thick = pl.Thickness;
materialn = pl.Material;
torient = pl.TextureOrientation;
ActiveMaterial.Make(materialn, 3);
pm = AddPanel(0, 0)
material = pm.Material


/////////////////////--------------------------------------------ПЛАСТИК

//var material=new THREE.MeshStandardMaterial({color:0xf2f2f2, wireframe:false,needsUpdate:true,shading:THREE.SmoothShading});
maindex = Material(t, material, p)
pm.Free();

if (side == 0) {
z1 = p.Thickness
z2 = p.Thickness + thick
} else if (side == 1) {
z1 = -thick
z2 = 0
}
t.push('v1=new THREE.Vector3(0,0,' + z1 + ');')
t.push('v2=new THREE.Vector3(0,0,' + z2 + ');')

t.push('var l_tolshina=new THREE.LineCurve(v1,v2);')
t.push('var extrudeMaterial=new THREE.MeshStandardMaterial({color:0xf2f2f2,needsUpdate:true});')
t.push('var materials=[material'+maindex+',extrudeMaterial];')
t.push('var extrudeSettings={steps:1,amount:1,extrudePath:l_tolshina,material:0,extrudeMaterial:1};')
t.push('var geometry=new THREE.ExtrudeGeometry(Shapes,extrudeSettings);')
t.push('var meshPl=new THREE.Mesh(geometry,new THREE.MultiMaterial(materials));')
t.push('meshPl.TenNeOtbrasyvat=true;')
//mesh.quaternion.set(0,-0.7071067811865475,0,0.7071067811865476);
//mesh.position.set(400,-2.2737367544323206e-13,-3.6637359812630166e-15);
t.push('mesh.add(meshPl);')



/////////////////////=======================--------------------------------------------ПЛАСТИК


}

}
}



function put(o, putA) {
if (o.UID == 1) {
return putA
} else {
// system.log(o.Owner.UID)
putA.push(o.Owner.UID)
put(o.Owner, putA)
}
}

function ObjektPoUID(UID) {
if (UID == 1) {
return Model
}
var o2
Model.forEach(function(oo) {

if (oo.UID == UID) {
//alert(oo.UID+' == '+ UID)
o2 = oo
return
}

});
return o2
}

////----------------------------------- //=============================ДЕРЕВО


t.push('scene.add(bm);')
//dobavitOsiMira()
t.push('}')
t.push('function Animatebm(delta){')
t.push('nachislili=false;')
t.push(anim.join(''))
t.push('}')

//// ===========Найти по ИД
t.push('function NaytiPoBID(BID){')
t.push('var retob;')
t.push('bm.traverse(function(child) {')
t.push('if(child.BID==BID)')
t.push('{')
t.push('retob=child;')
t.push('return child;')
t.push('}')
t.push('});')
t.push('if(retob===undefined){')
t.push('bm_.traverse(function(child) {')
t.push('if(child.BID==BID)')
t.push('{')
t.push('retob=child;')
t.push('return child;')
t.push('}')
t.push('});')
t.push('}')
t.push('return retob')
t.push('}')
////---------//// ===========Найти по ИД

/*
//// ===========Найти по ПОЗИЦИИ
t.push('function NaytiPoArtPos(ArtPos){')
t.push('var retob;')
t.push('bm.traverse(function(child) {')
t.push('if(child.ArtPos==ArtPos)')
t.push('{')
t.push('retob=child;')
t.push('return child;')
t.push('}')
t.push('});')
t.push('return retob')
t.push('}')
////---------//// ===========Найти по ПОЗИЦИИ
*/




//system.askWriteTextFile('js', t.join('\r\n'))
//system.writeTextFile('C:\\OpenServer\\domains\\site\\three.js-master\\logo.js', t.join('\r\n'))
ti=[]
tii=[]
//alert(t0.length+' - '+mats.length+' - '+t.length)
ti = ti.concat(t0)
ti = ti.concat(mats)
ti = ti.concat(t)

//alert(t0.length+' - '+mats.length+' - '+t.length+' - '+ti.length)




system.writeTextFile('C:\\OpenServer\\domains\\site\\three.js-master\\33y.js', ti.join('\r\n'))


system.writeTextFile(ActiveFilePathNomenklatury() + '1.js', ti.join(''))

function FileNameS_RasshireniyemTolko(fullpath) {
return fullpath.substring(fullpath.lastIndexOf("\\") + 1, fullpath.length);
}


function Roditel(p, t) {
//system.log(p.Owner)
if (p == Model) {
return
}
if (p.Owner == Model) {
BID = 1
} else {
BID = p.Owner.UID
}
if(tekushiyroditel!=''){
tarts.push(tekushiyroditel+'.add(mesh);')
}
else{
t.push('parent=NaytiPoBID(' + BID + ');')
t.push('parent.add(mesh);')
}
}

function ZapisatBlok(p, t) {
////////////////////////-----------------------------------АНИМАЦИЯ
if ((p.AnimType != 0) && (!(p.AnimType === undefined))) {
pos = p.ToGlobal(p.Animation.AxisStart)
pos2 = p.ToGlobal(p.Animation.AxisEnd)

lineP = p.Owner
//p = GetPanel("Укажите панель")
pos = lineP.ToObject(pos)
px = pos.x
py = pos.y
pz = pos.z
pos2 = lineP.ToObject(pos2)
px2 = pos2.x
py2 = pos2.y
pz2 = pos2.z


d = Distance3d(pos, pos2)
dl = 1

t.push(' var material=new THREE.LineBasicMaterial({color: 0x0000ff});')

t.push('var geometry=new THREE.Geometry();')

t.push('geometry.vertices.push(')
t.push(' new THREE.Vector3( ' + 0 + ',' + 0 + ',' + 0 + ' ),')
t.push(' new THREE.Vector3( ' + 0 + ',' + 0 + ',' + dl + '));')

t.push('var line=new THREE.Line(geometry,material);')

t.push('line.position.set(' + px + ',' + py + ',' + pz + ');')
t.push('line.lookAt(new THREE.Vector3(' + px2 + ',' + py2 + ',' + pz2 + '));')
t.push('parentL=NaytiPoBID(' + p.Owner.UID + ');')
t.push('parentL.add(line);')



/////// в функцию Анимации




BID = p.UID
anim.push('oa=NaytiPoBID(' + BID + '9999);')

anim.push('if((!oa.Animirovat)&&(!nachislili)){')
anim.push('vremya=vremya+delta;')
anim.push('nachislili=true;')
anim.push('};')
anim.push('if(vremya>pause)')
anim.push('{oa.Animirovat=true;')
//anim.push('vremya=0;')
anim.push('};')

anim.push('if(oa.Animirovat){')

anim.push('if(oa.AtekU<0){oa.Adir=1;oa.Animirovat=false;vremya=0;};if(oa.AtekU>oa.AAngle){oa.Adir=-1;')
anim.push('oa.Animirovat=false;')
anim.push('vremya=0;')
anim.push('}')

if ((p.AnimType == 2) || (p.AnimType == 3) || (p.AnimType == 4) || (p.AnimType == 5)) {




anim.push('ug=oa.Adir*0.01;')



if (p.DoorShift != 0) {
anim.push('ds=-1*(ug/oa.AAngle)*oa.DoorShift;')
//anim.push('ds=oa.Adir*0.01;')
/*if(p.AnimType==5){anim.push('oa.translateX(ds);')}
if(p.AnimType==2){anim.push('oa.translateX(-ds);')}
if(p.AnimType==3){anim.push('oa.translateY(ds);')}
*/


anim.push('oa.rotateZ(-oa.AtekU);')

if (p.AnimType == 5) {
anim.push('oa.translateY(ds);');
}
if (p.AnimType == 4) {
anim.push('oa.translateY(-ds);');
}
if (p.AnimType == 2) {
anim.push('oa.translateX(-ds);');
}
if (p.AnimType == 3) {
anim.push('oa.translateX(ds);');
}

anim.push('oa.rotateZ(oa.AtekU);')

anim.push('oa.AtekDS=oa.AtekDS+ds;')
}






anim.push('oa.rotateZ(ug);')



} else //if(p.AnimType==8)
{
anim.push('ug=oa.Adir*2;')
anim.push('oa.translateZ(ug);')

}



anim.push('oa.AtekU=oa.AtekU+ug;')

anim.push('}')
//anim.push('axis=
//anim.push('oa.rotateOnAxis ( axis, 0.01);')







}
//====================////////////////////////-----------------------------------АНИМАЦИЯ
//t.push('////// \n\n\n')
if(p.ArtPos!=''){
t.push('mesh=mesh'+p.ArtPos+'.clone();')
}
else{
t.push('mesh=new THREE.Object3D();')
}
t.push('mesh.BID=' + p.UID + ';')
t.push('mesh.name="' + NaLatinskom(p.Name) + '";')
if (p.UID == 1) {
t.push('bm.add(mesh);')
}
Roditel(p, t)
PosRot(p, t)



if ((p.AnimType != 0) && (!(p.AnimType === undefined))) {

















t.push('mesh.updateMatrixWorld(true);')
t.push('parent.updateMatrixWorld(true);')
t.push('THREE.SceneUtils.detach(mesh,parent,scene);')
t.push('mesh.updateMatrixWorld(true);')
t.push('line.updateMatrixWorld(true);')
t.push('THREE.SceneUtils.attach(mesh,scene,line);')
t.push('line.BID=' + p.UID + '9999;')

if ((p.AnimType == 2) || (p.AnimType == 3) || (p.AnimType == 4) || (p.AnimType == 5)) {
t.push('line.AAngle=' + p.Animation.DoorAngle * (Math.PI / 180) + ';')
} else // if(p.AnimType==8)
{
t.push('line.AAngle=' + d + ';')
}

t.push('line.Adir=1;') //1 - открывать, -1 -- закрывать
t.push('line.AtekU=0;') //текущий угол
t.push('line.Animirovat=true;') //Анимировать ли в текущем кадре
t.push('line.AtekDS=0;') //текущий угол
t.push('line.DoorShift=' + p.DoorShift + ';') //DoorShift:18
//t.push('line.visible=false;')
}

}


function ZapisatBlokDliyaKopirovaniya(p, t) {

t.push('mesh'+p.ArtPos+'=new THREE.Object3D();')
t.push('mesh'+p.ArtPos+'.ArtPos='+p.ArtPos+';')
t.push('mesh'+p.ArtPos+'.name="' + NaLatinskom(p.Name) + '";')
t.push('mesh'+p.ArtPos+'.BID=' + p.UID + ';')
t.push('bm_.add(mesh'+p.ArtPos+');')

}



function AddTSphere3D(p, t) {
t.push('mesh=new THREE.Object3D();')
t.push('var geometry=new THREE.SphereGeometry(' + p.Radius + ');')
maindex = Material(t, p.Material)
t.push('var sphere=new THREE.Mesh(geometry,material'+maindex+');')
t.push('mesh.add(sphere);')

}




function ConturTrajectory(p, t) {



c = p.Contour2D


ny = p.NToGlobal(AxisY);



//c.Rotate(0, 0, 90);
c.OrderContours(true)

t.push('mesh=new THREE.Object3D();')

f = 'Shape'
t.push('var ' + f + '=new THREE.Shape();')
ZamknutiyKontur(c, t, f)


path = 'path'
t.push('var ' + path + '=new THREE.Path();')
c = p.Trajectory2D
c.OrderContours(true)
// c = NewContour()
//c.Symmetry(0, 0, 1, 0, false)
//c.Symmetry(0, 0, 0, 1, false)
//ZamknutiyKontur(p.Trajectory2D, t, path)
KonturTrajectorii(c, t, path)
//ZamknutiyKontur(c, t, path)

// Material(p, t)
maindex = Material(t, p.Material )

t.push('var materials=[material'+maindex+',material'+maindex+'];')

//t.push('var extrudeSettings={curveSegments:8,steps:1,amount:1,bevelEnabled:false,extrudePath:path,material:0,extrudeMaterial:1};')
t.push('var extrudeSettings={steps:100,amount:1,extrudePath:path,material:0,extrudeMaterial:1};')


t.push('var geometry=new THREE.ExtrudeGeometry(Shape,extrudeSettings);')
t.push('var extr=new THREE.Mesh(geometry,new THREE.MultiMaterial(materials));')




t.push('extr.rotation.set(Math.PI*0.5,0,0);')
t.push('extr.rotateZ(Math.PI*0.5);')
t.push('extr.rotateX(Math.PI);')

t.push('mesh.add( extr );')

// PosRot(p, t)

//dobavitOsi()




}




//Тело вращения

function ConturLathe(p, t) {

/*




var points = [];
for ( var i = 0; i < 10; i ++ ) {
points.push( new THREE.Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );
}
var geometry = new THREE.LatheGeometry( points );
var material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );
var lathe = new THREE.Mesh( geometry, material );
scene.add( lathe );



LatheGeometry(points, segments, phiStart, phiLength)
points — Array of Vector2s. The x-coordinate of each point must be greater than zero.
segments — the number of circumference segments to generate. Default is 12.
phiStart — the starting angle in radians. Default is 0.
phiLength — the radian (0 to 2PI) range of the lathed section 2PI is a closed lathe, less than 2PI is a portion. Default is 2PI.




*/


c = p.Contour2D


ny = p.NToGlobal(AxisY);



//c.Rotate(0, 0, 90);
c.OrderContours(true)

t.push('mesh=new THREE.Object3D();')

t.push('var points = [];')
for (var i = 0; i < c.Count; i++) {
t.push('points.push(new THREE.Vector2(' + c[i].Pos1.x + ',' + c[i].Pos1.y + '));')
}
t.push('points.push(new THREE.Vector2(' + c[c.Count - 1].Pos2.x + ',' + c[c.Count - 1].Pos2.y + '));')

t.push('var geometry=new THREE.LatheGeometry(points);')
//t.push('var material=new THREE.MeshBasicMaterial({color:0xffff00});')
maindex = MaterialPaneli(p, t)
t.push('var lathe=new THREE.Mesh(geometry,material'+maindex+');')
t.push('lathe.rotation.set(Math.PI*0.5,0,0);')

t.push('mesh.add( lathe );')

// PosRot(p, t)






}


function Material(t, material, p) {
/*
MeshStandardMaterial( parameters )
parameters -- an object with one or more of the material's properties defining the material's appearance.
color — geometry color in hexadecimal. Default is 0xffffff.


roughness — Set roughness. Default is 0.5. = - Резкозть БЛИКА
metalness — Set metalness. Default is 0.5. = - Яркость БЛИКА


map — Set texture map. Default is null.
lightMap — Set light map. Default is null.
lightMapIntensity — Set light map intensity. Default is 1.
aoMap — Set ao map. Default is null.
aoMapIntensity — Set ao map intensity. Default is 1.
emissive - Set emissive color. Default is 0x000000.
emissiveMap — Set emissive map. Default is null.
emissiveIntensity — Set emissive map intensity. Default is 1.
bumpMap — Set bump map. Default is null.
bumpMapScale — Set bump map scale. Default is 1.
normalMap — Set normal map. Default is null.
normalMapScale — Set normal map scale. Default is (1, 1).
displacementMap — Set displacement map. Default is null.
displacementScale — Set displacement scale. Default is 1.
displacementBias — Set displacement offset. Default is 0.
roughnessMap - Set roughness map. Default is null.
metalnessMap - Set metalness map. Default is null.
alphaMap — Set alpha map. Default is null.
envMap — Set env map. Default is null.
envMapIntensity — Set env map intensity. Default is 1.0.
refractionRatio — Set refraction ratio. Default is 0.98.
fog — Define whether the material color is affected by global fog settings. Default is true.
shading — Define shading type. Default is THREE.SmoothShading.
wireframe — render geometry as wireframe. Default is false.
wireframeLinewidth — Line thickness. Default is 1.
wireframeLinecap — Define appearance of line ends. Default is 'round'.
wireframeLinejoin — Define appearance of line joints. Default is 'round'.
vertexColors — Define how the vertices gets colored. Default is THREE.NoColors.
skinning — Define whether the material uses skinning. Default is false.
morphTargets — Define whether the material uses morphTargets. Default is false.
morphNormals — Define whether the material uses morphNormals. Default is false.
Example:
materials.push( new THREE.MeshStandardMaterial( { color: 0x550000, envMap: reflectionCube, roughness: 0.1, metalness: 1.0 } ) );
*/



//// Группировка материалов




maindex = matest.indexOf(JSON.stringify(material))
if (!(maindex > -1)) {
ma.push(material)
matest.push(JSON.stringify(material))
maindex = ma.length - 1

///////////////////////

parametres = ''
parametres = 'roughness:'+(1-material.ShinessValue/128)+',metalness:'+((1-material.BrightValue)/2)

mp = material.Path
if (system.fileExists(mp)) {
mapFile = NaLatinskom(FileNameS_RasshireniyemTolko(mp))
kuda = 'C:\\OpenServer\\domains\\site\\three.js-master\\1_textures\\' + mapFile
system.exec('c:/Windows/system32/cmd.exe', '/c copy "' + mp + '" "' + kuda + '"')
kudaD = ActiveFilePathNomenklatury() + '1_textures\\'
kuda = kudaD + mapFile
system.exec('c:/Windows/system32/cmd.exe', '/c md "' + kudaD + '"')
system.exec('c:/Windows/system32/cmd.exe', '/c copy "' + mp + '" "' + kuda + '"')






mats.push('var textureLoader11=new THREE.TextureLoader();')
mats.push('var texture1=textureLoader11.load("1_textures/' + mapFile + '");')
if (material.Retry) {
mats.push('texture1.wrapS=THREE.MirroredRepeatWrapping;')
mats.push('texture1.wrapT=THREE.MirroredRepeatWrapping;')

mats.push('texture1.repeat.set(0.008,0.008);')
}
if (material.Stretch) {
height = p.Contour.Height
width = p.Contour.Width
if (p.TextureOrientation == TextureOrientation.Horizontal) {
height1 = height;
height = width;
width = height1;
}

////////////!!!!!!!!!!!!!!!!!!!!!!!!!!-------------------------
t.push('texture1.repeat.set(' + 1 / (width * 0.001) + '*mashtab,' + 1 / (height * 0.001) + '*mashtab);')


}
// t.push('var '+imav3js+'=new THREE.MeshStandardMaterial({ map:texture1,wireframe:false,needsUpdate:true,shading:THREE.SmoothShading});')
mats.push('var material' + maindex + '=new THREE.MeshStandardMaterial({ map:texture1,needsUpdate:true,'+parametres+'});')
} else {
col = material.DiffuseColor
col = decimalColorToHTMLcolor(col)
mats.push('var material' + maindex + '=new THREE.MeshStandardMaterial({color:' + col + ',needsUpdate:true,'+parametres+'});')

}
tv = material.TransparentValue
if (tv > 0) {
mats.push('material' + maindex + '.transparent= true;')
mats.push('material' + maindex + '.opacity=' + (1 - tv) + ';')

}





///////////////////////

}

return maindex
///



}

function MaterialPaneli(p, t) {
material = p.Material
return Material(t, material, p)



}


function KromaBolshe(p) {
kromy = []
dlinykromov = []
bb = p.Butts
c = p.Contour
for (i = 0; i < bb.Count; i++) {
dk = c[bb[i].ElemIndex].ObjLength()
// system.log('Длина крома = '+dk)
ik = kromy.indexOf(bb[i].Material)
if (ik > -1) {
dlinykromov[ik] = dlinykromov[ik] + dk
} else {
kromy.push(bb[i].Material)
dlinykromov.push(dk)
}

}

//system.log(JSON.stringify(kromy))
//system.log(JSON.stringify(dlinykromov))
maxDlina = Math.max.apply(null, dlinykromov);
for (i = 0; i < dlinykromov.length; i++) {
if (dlinykromov[i] == maxDlina) {

// system.log(kromy[i])
return kromy[i]
}
}
return ''
}



function MaterialPoStroke(strokaMateriala) {
ActiveMaterial.Make(strokaMateriala, 50);
pm = AddPanel(0, 0)
km = pm.Material
pm.Free()
return km
}

function MaterialKroma(p, t) {
// t.push('var extrudeMaterial=new THREE.MeshLambertMaterial({color:0xb00000,wireframe:false,needsUpdate:true});')
krom = KromaBolshe(p)
//system.log(krom)
//system.log(krom.toString().length)
if (krom.toString().length == 0) {
return -1
}
mk = MaterialPoStroke(krom)
//system.log(t)
maindex = Material(t, mk)

return maindex
}




function Sozdaniye(p, t) {

/*
ExtrudeGeometry(shapes, options)
shapes — Shape or an array of shapes.
options — Object that can contain the following parameters.

curveSegments — int. number of points on the curves
steps — int. number of points used for subdividing segements of extrude spline
amount — int. Depth to extrude the shape
bevelEnabled — bool. turn on bevel
bevelThickness — float. how deep into the original shape bevel goes
bevelSize — float. how far from shape outline is bevel
bevelSegments — int. number of bevel layers
extrudePath — THREE.CurvePath. 3d spline path to extrude shape along. (creates Frames if (frames aren't defined)
frames — THREE.TubeGeometry.FrenetFrames. containing arrays of tangents, normals, binormals
material — int. material index for front and back faces
extrudeMaterial — int. material index for extrusion and beveled faces
UVGenerator — Object. object that provides UV generator functions


*/


tp0 = p.ToGlobal(NewVector(0, 0, 0))
tpt = p.ToGlobal(NewVector(0, 0, -p.Thickness))
/*
t.push('var Points = [];')
t.push('Points.push( new THREE.Vector3( '+ tp0.x+', '+ tp0.y+', '+tp0.z +' ) );')
t.push('Points.push( new THREE.Vector3( '+tpt.x +', '+ tpt.y+', '+tpt.z +' ) );')
t.push('var l_tolshina = new THREE.CatmullRomCurve3( Points );')
*/
// system.log(p)
maindexP=MaterialPaneli(p, t)

/*
//вариант если крутить только
t.push('v1 = new THREE.Vector3( '+ tp0.x+', '+ tp0.y+', '+tp0.z +' ) ;')
t.push('v2 = new THREE.Vector3( '+tpt.x +', '+ tpt.y+', '+tpt.z +' ) ;')
// ----вариант если крутить только(доделать)

*/
tol = p.Thickness
//if (p.toString() == '[object TExtrusionBody]') {tol = -p.Thickness}



//вариант в 0 , потом позиция и крутить
t.push('v1=new THREE.Vector3(0,0,0);')
t.push('v2=new THREE.Vector3(0,0,' + (tol) + ');')
// ---- вариант в 0 , потом позиция и крутить

fs = 0
if (GetPanelType(p) == 'Vert') {
fs1 = p.NToGlobal(AxisZ).x
if (fs1 > 0) {
//t.push('v2 = new THREE.Vector3( 0, 0, 0 ) ;')
//t.push('v1 = new THREE.Vector3( 0, 0, '+(p.Thickness)+' ) ;')
}
}



t.push('var l_tolshina=new THREE.LineCurve(v1,v2);')



// t.push('var extrudeMaterial=new THREE.MeshLambertMaterial({color:0xb00000,wireframe:false,needsUpdate:true});')
maindexkroma = -1
if (p.AsPanel) {
maindexkroma = MaterialKroma(p, t)
}
if (maindexkroma>-1) {
t.push('var materials=[material'+maindexP+',material'+maindexkroma+'];')
} else {
// system.log('без крома')
t.push('var materials=[material'+maindexP+',material'+maindexP+'];')
}

//t.push('var extrudeSettings={curveSegments:8,steps:1,amount:1,bevelEnabled:false,extrudePath:l_tolshina,material:0,extrudeMaterial:1};')
t.push('var extrudeSettings={steps:1,amount:1,extrudePath:l_tolshina,material:0,extrudeMaterial:1};')



t.push('var geometry=new THREE.ExtrudeGeometry(Shapes,extrudeSettings);')
t.push('var mesh=new THREE.Mesh(geometry,new THREE.MultiMaterial(materials));')






//---------------------------это надоделать в окне просмотра
/*
t.push('mesh.scale.set( mashtab, mashtab, mashtab );')
t.push('mesh.castShadow = true; ')
t.push('mesh.receiveShadow = true;')
*/
//---------------------------это надоделать в окне просмотра



// PosRot(p, t)

//t.push('scene.add( mesh );')


//dobavitOsi()
//dobavitBox(tp0.x, tp0.y, tp0.z)

/*
t.push('ActiveMaterial.Make("'+p.MaterialName.toString().replace('\r', '\\r')+'", '+p.Thickness+');'+'\n')
t.push( 'p = AddPanel(5, 5)\n')
t.push( 'p.TextureOrientation = '+p.TextureOrientation +'\n')
t.push( 'p.Name = "'+ p.Name +'"\n')
t.push( 'p.ArtPos = "'+ p.ArtPos +'"\n')
*/

}

function PosRot(p, t) {

// aa = Povorot(p)

Rot = p.Rotation;
q1 = Rot.ImagPart.x;
q2 = Rot.ImagPart.y;
q3 = Rot.ImagPart.z;
q4 = Rot.RealPart;

t.push('mesh.quaternion.set(' + q1 + ',' + q2 + ',' + q3 + ',' + q4 + ');')
if (p.TextureOrientation == TextureOrientation.Horizontal) {
//c.Rotate(0, 0, -90);
t.push('mesh.rotateOnAxis ( new THREE.Vector3( 0, 0, 1 ), Math.PI*0.5 );')
}
if (p.toString() == '[object T2DTrajectoryBody]') {
//c.Rotate(0, 0, -90);
t.push('mesh.rotateOnAxis ( new THREE.Vector3( 0, 0, 1 ), Math.PI*0.5 );')
t.push('mesh.rotateOnAxis ( new THREE.Vector3( 1, 0, 0 ), Math.PI*0.5 );')
}

/*
var Panel = p;
var M = GetTransformMatrix(GetObjectAngles(Panel), Panel.Position);
system.log(JSON.stringify(M));

//t=[]
t.push('var m = new THREE.Matrix4();' )
t.push('m.set('+M[0][0]+', '+M[0][1]+', '+M[0][2]+', '+M[0][3]+', '+M[1][0]+', '+M[1][1]+', '+M[1][2]+', '+M[1][3]+', '+M[2][0]+', '+M[2][1]+', '+M[2][2]+', '+M[2][3]+', '+M[3][0]+', '+M[3][1]+', '+M[3][2]+', '+M[3][3]+');')
t.push('mesh.applyMatrix(m);')
//system.askWriteTextFile('js', t.join('\r\n'))

*/






// px = p.ToGlobal(NewVector(0, 0, 0)).x
// py = p.ToGlobal(NewVector(0, 0, 0)).y
// pz = p.ToGlobal(NewVector(0, 0, 0)).z

px = p.PositionX
py = p.PositionY
pz = p.PositionZ


t.push('mesh.position.set(' + px + ',' + py + ',' + pz + ');')


}

function dobavitBox(x, y, z) {

t.push('object=new THREE.Mesh(new THREE.BoxGeometry(10,25,10),material);')
t.push('object.position.set(' + x + ',' + y + ',' + z + ');')
t.push('scene.add(object);')
//t.push('object.scale.set( mashtab, mashtab, mashtab );')
}

function dobavitOsiMira() {
t.push('var axisHelper=new THREE.AxisHelper(0.3);')
t.push('bm.add(axisHelper);')
// t.push('axisHelper.position.set(mesh.position.x*mashtab,mesh.position.y*mashtab,mesh.position.z*mashtab)')
// t.push('axisHelper.rotation.set(mesh.rotation.x,mesh.rotation.y,mesh.rotation.z)')
}

function dobavitOsi(ob) {
t.push('var axisHelper=new THREE.AxisHelper(0.3);')
t.push('scene.add(axisHelper);')
t.push('axisHelper.position.set(' + ob + '.position.x*mashtab,' + ob + '.position.y*mashtab,' + ob + '.position.z*mashtab)')
t.push('axisHelper.rotation.set(' + ob + '.rotation.x,' + ob + '.rotation.y,' + ob + '.rotation.z)')
}



function Contur(p, t) {
t.push('var Shapes=[];')
pcopy = AddCopy(p)
c = pcopy.Contour.MakeCopy()


ny = p.NToGlobal(AxisY);


fs = 0
if (GetPanelType(p) == 'Vert') {
fs1 = p.NToGlobal(AxisZ).x
if (fs1 > 0) {
//c.Symmetry(0,0,1,0,false)
}
}


//aa = Povorot(pcopy)
//alert(aa.x/(Math.PI / 180))
if (p.toString() == '[object TExtrusionBody]') {
// c.Symmetry(c.Min.x, 0, c.Min.x, 1, false);
//c.Rotate(0, 0, -180);
}
// p = GetPanel("Укажите панель")
if (p.TextureOrientation == TextureOrientation.Horizontal) {
c.Rotate(0, 0, -90);
}
c.Rotate(0, 0, 90);
c.OrderContours(true)

ccs = GetNarVnutrContours(c, t)

pcopy.Free()
for (ii = 0; ii < ccs.length; ii++) {
// system.log(ii)
//t.push('\nc = p.Contour\nc.Clear()\n')
f = 'Shape' + ii.toString()
t.push('var ' + f + '=new THREE.Shape();')
cD = ccs[ii]
// system.log(ii)
ZamknutiyKontur(cD.naruj, t, f)

for (iv = 0; iv < cD.vnutr.length; iv++) {
h = 'Hole' + iv
t.push('var ' + h + '=new THREE.Path();')
tekkon = cD.vnutr[iv].MakeCopy()
tekkon.OrderContours(true)
tekkon.InvertDirection()
ZamknutiyKontur(tekkon, t, h)
t.push(f + '.holes.push(' + h + ');')

}
t.push('Shapes.push(' + f + ');')
//t.push('p.Build()'+' \n')
}
}

function ZamknutiyKontur(c, t, f) {
for (i = 0; i < c.Count; i++) {
e = c[i]
te = ''
// начало
if (i == 0) {
if (!(e.ElType == 3)) {
lx = e.Pos1.x
ly = e.Pos1.y
// t.push('Shape.moveTo( '+ e.Pos1.x +', '+ e.Pos1.y +' );')
t.push(f + '.moveTo(' + e.Pos1.x + ',' + e.Pos1.y + ');')
}
}
// ------начало
if (e.ElType == 1) {
t.push(f + '.lineTo(' + e.Pos2.x + ',' + e.Pos2.y + ');')
lx = e.Pos2.x
ly = e.Pos2.y
} else if (e.ElType == 2) {
a1 = e.Pos1Angle()
if (e.ArcDir) {
a2 = (parseFloat(e.Pos1Angle()) + parseFloat(e.ArcAngle())).toString()
} else {
a2 = (parseFloat(e.Pos1Angle()) - parseFloat(e.ArcAngle())).toString()
}
t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',false);')
//t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',true);')
cx = e.Center.x - lx
cy = e.Center.y - ly
lx = e.Pos2.x
ly = e.Pos2.y
} else if (e.ElType == 3) {
t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.CirRadius + ',0,Math.PI*2,false);')
}
}
}

function ZamknutiyKonturVnutr(c, t, f) {
for (i = c.Count - 1; i > -1; i--) {
e = c[i]
te = ''
// начало
if (i == 0) {
if (!(e.ElType == 3)) {
lx = e.Pos2.x
ly = e.Pos2.y
// t.push('Shape.moveTo( '+ e.Pos1.x +', '+ e.Pos1.y +' );')
t.push(f + '.moveTo(' + e.Pos2.x + ',' + e.Pos2.y + ');')
}
}
// ------начало
if (e.ElType == 1) {
t.push(f + '.lineTo(' + Math.round(e.Pos1.x) + ',' + Math.round(e.Pos1.y) + ');')
lx = e.Pos1.x
ly = e.Pos1.y
} else if (e.ElType == 2) {
a1 = e.Pos1Angle()
if (e.ArcDir) {
a2 = (parseFloat(e.Pos1Angle()) + parseFloat(e.ArcAngle())).toString()
} else {
a2 = (parseFloat(e.Pos1Angle()) - parseFloat(e.ArcAngle())).toString()
}
t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',false);')
//t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',true);')
cx = e.Center.x - lx
cy = e.Center.y - ly
lx = e.Pos2.x
ly = e.Pos2.y
} else if (e.ElType == 3) {
t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.CirRadius + ',0,Math.PI*2,false);')
}
}
}




function KonturTrajectorii22(c, t, f) {
t.push('ppp=[];')
for (i = 0; i < c.Count; i++) {
e = c[i]
if (e.ElType == 1) {
// t.push(f + '.lineTo(' + Math.round(e.Pos2.x) + ',' + Math.round(e.Pos2.y) + ');')

// t.push('var el=new THREE.LineCurve(new THREE.Vector3(' + e.Pos1.x + ',' + e.Pos1.y + ',0),new THREE.Vector3(' + e.Pos2.x + ',' + e.Pos2.y + ',0));')
//t.push('ppp.push(new THREE.Vector3(' + e.Pos1.x + ',' + e.Pos1.y + ',0),new THREE.Vector3(' + e.Pos2.x + ',' + e.Pos2.y + ',0));')
} else if (e.ElType == 2) {
a1 = e.Pos1Angle()
if (e.ArcDir) {
a2 = (parseFloat(e.Pos1Angle()) + parseFloat(e.ArcAngle())).toString()
} else {
a2 = (parseFloat(e.Pos1Angle()) - parseFloat(e.ArcAngle())).toString()
}
// t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',false);')

PP = e.ArcCenter()

// t.push('var el=new THREE.QuadraticBezierCurve3(new THREE.Vector3('+e.Pos1.x+','+e.Pos1.y+',0),new THREE.Vector3('+PP.x+','+PP.y+',0),new THREE.Vector3('+e.Pos2.x+','+e.Pos2.y+',0));')

t.push('var el=new THREE.EllipseCurve( ' + e.Center.x + ',' + e.Center.y + ',' + e.ArcRadius() + ',' + e.ArcRadius() + ',' + a2 + ',' + a1 + ',false,0);')
t.push('points=el.getPoints();')
// t.push('var el=new THREE.SplineCurve3(points);')
t.push('ppp=ppp.concat(points);')

} else if (e.ElType == 3) {
//t.push(f + '.absarc(' + e.Center.x + ',' + e.Center.y + ',' + e.CirRadius + ',0,Math.PI*2,false);')
t.push('var el=new THREE.QuadraticBezierCurve3(new THREE.Vector3(-10,0,0),new THREE.Vector3(20,15,0),new THREE.Vector3(10,0,0));')
}
//t.push(f + '.add(el);')


}
t.push('var ' + f + '=new THREE.CatmullRomCurve3(ppp);')
//path.type = 'catmullrom';
// path.closed = true;

}

function KonturTrajectorii(c, t, f) {
ZamknutiyKontur(c, t, f)
t.push('po=path.getPoints();')
t.push('po1=[];')
t.push('for(i=0;i<po.length;i++){po1.push(new THREE.Vector3(po[i].x,po[i].y,0));}')
t.push('var ' + f + '=new THREE.CatmullRomCurve3(po1);')
if (c.IsClosedContour()) {
t.push('' + f + '.closed = true;')
}
}







/// ----------------------------------ВСПОМОГАТЕЛЬНАЯ ЧАСТЬ
function Povorot(obj) {

Rot = obj.Rotation;
q1 = Rot.ImagPart.x;
q2 = Rot.ImagPart.y;
q3 = Rot.ImagPart.z;
q4 = Rot.RealPart;
yyy = 2 * (q1 * q3 - q4 * q2)
if (yyy > 1) {
yyy = 1
}
//alert(q1+'\n'+q2+'\n'+q3+'\n'+q4+'\n'+Math.asin(1))
Angles = {
x: Math.atan2(2 * (q1 * q2 + q3 * q4), 1 - 2 * (q2 * q2 + q3 * q3)),
y: Math.asin(yyy),
z: Math.atan2(2 * (q1 * q4 + q2 * q3), 1 - 2 * (q3 * q3 + q4 * q4))
}
// system.log(JSON.stringify(Angles));
return Angles
}


function FindClosedContours(contour) {
// создаем копию исходного контура панели
var contourCopy = NewContour();
contourCopy.Addition(contour);
var result = [];
while (true) {
closedContour = NewContour();
// выделяем замкнутые контуры и добавляем их в результирующий массив
if (contourCopy.FindContour(closedContour, true))
result.push(closedContour)
else
break;
}
return result;
}

function GetNarVnutrContours(con) {
//var panel = GetPanel("Укажите панель");
//var contours = FindClosedContours(panel.Contour);
var contours = FindClosedContours(con);
var messages = ['Найдено ' + contours.length + ' контуров'];
for (var k = 0; k < contours.length; k++)
messages.push('Длина контура ' + k + ' = ' + contours[k].ObjLength());
//alert(messages.join('\r\n'));

vnutr = 0
avnu = []
naruj = 0
anar = []
cnar = []
var messages = ['Найдено ' + contours.length + ' контуров'];
for (var k = 0; k < contours.length; k++) {
vnutr2 = false
for (var k2 = 0; k2 < contours.length; k2++) {
if (k == k2) {
continue
}
if (contours[k].IsInContour(contours[k2])) {
vnutr2 = true
break
}

}
if (vnutr2) {
vnutr = vnutr + 1
avnu.push(k)
} else {
naruj = naruj + 1
anar.push(k)
cnar.push(contours[k])
}
// messages.push('Длина контура ' + k + ' = ' + contours[k].ObjLength());

}
messages.push('Наружных ' + ' = ' + naruj + ' \r\n' + anar.join('\r\n'))
messages.push('Внутренних ' + ' = ' + vnutr + ' \r\n' + avnu.join('\r\n'))
//alert(messages.join('\r\n'));


panleli_c = []
for (var inar = 0; inar < anar.length; inar++) {
pan = {}
pan.naruj = cnar[inar]
vnutr = []
//panlel_c.push(cnar[inar])
for (var i = 0; i < contours.length; i++) {
if (!(geometry.Compare(contours[i][0], cnar[inar][0]))) {
if (contours[i].IsInContour(cnar[inar])) {
vnutr.push(contours[i])
}
}
}
pan.vnutr = vnutr
panleli_c.push(pan)
}


return panleli_c
}



function NaLatinskom(s) {
s = s.replace(new RegExp("й", 'g'), "j");
s = s.replace(new RegExp("ц", 'g'), "c");
s = s.replace(new RegExp("у", 'g'), "u");
s = s.replace(new RegExp("к", 'g'), "k");
s = s.replace(new RegExp("е", 'g'), "e");
s = s.replace(new RegExp("н", 'g'), "n");
s = s.replace(new RegExp("г", 'g'), "g");
s = s.replace(new RegExp("ш", 'g'), "sh");
s = s.replace(new RegExp("щ", 'g'), "sch");
s = s.replace(new RegExp("з", 'g'), "z");
s = s.replace(new RegExp("х", 'g'), "h");
s = s.replace(new RegExp("ъ", 'g'), "#");
s = s.replace(new RegExp("ф", 'g'), "f");
s = s.replace(new RegExp("ы", 'g'), "y");
s = s.replace(new RegExp("в", 'g'), "v");
s = s.replace(new RegExp("а", 'g'), "a");
s = s.replace(new RegExp("п", 'g'), "p");
s = s.replace(new RegExp("р", 'g'), "r");
s = s.replace(new RegExp("о", 'g'), "o");
s = s.replace(new RegExp("л", 'g'), "l");
s = s.replace(new RegExp("д", 'g'), "d");
s = s.replace(new RegExp("ж", 'g'), "zh");
s = s.replace(new RegExp("э", 'g'), "je");
s = s.replace(new RegExp("я", 'g'), "ja");
s = s.replace(new RegExp("ч", 'g'), "ch");
s = s.replace(new RegExp("с", 'g'), "s");
s = s.replace(new RegExp("м", 'g'), "m");
s = s.replace(new RegExp("и", 'g'), "i");
s = s.replace(new RegExp("т", 'g'), "t");
s = s.replace(new RegExp("ь", 'g'), "'");
s = s.replace(new RegExp("б", 'g'), "b");
s = s.replace(new RegExp("ю", 'g'), "ju");
s = s.replace(new RegExp("ё", 'g'), "jo");

s = s.replace(new RegExp("Й", 'g'), "J");
s = s.replace(new RegExp("Ц", 'g'), "C");
s = s.replace(new RegExp("У", 'g'), "U");
s = s.replace(new RegExp("К", 'g'), "K");
s = s.replace(new RegExp("Е", 'g'), "E");
s = s.replace(new RegExp("Н", 'g'), "N");
s = s.replace(new RegExp("Г", 'g'), "G");
s = s.replace(new RegExp("Ш", 'g'), "SH");
s = s.replace(new RegExp("Щ", 'g'), "SCH");
s = s.replace(new RegExp("З", 'g'), "Z");
s = s.replace(new RegExp("Х", 'g'), "H");
s = s.replace(new RegExp("Ъ", 'g'), "#");
s = s.replace(new RegExp("Ф", 'g'), "F");
s = s.replace(new RegExp("Ы", 'g'), "Y");
s = s.replace(new RegExp("В", 'g'), "V");
s = s.replace(new RegExp("А", 'g'), "A");
s = s.replace(new RegExp("П", 'g'), "P");
s = s.replace(new RegExp("Р", 'g'), "R");
s = s.replace(new RegExp("О", 'g'), "O");
s = s.replace(new RegExp("Л", 'g'), "L");
s = s.replace(new RegExp("Д", 'g'), "D");
s = s.replace(new RegExp("Ж", 'g'), "ZH");
s = s.replace(new RegExp("Э", 'g'), "JE");
s = s.replace(new RegExp("Я", 'g'), "JA");
s = s.replace(new RegExp("Ч", 'g'), "CH");
s = s.replace(new RegExp("С", 'g'), "S");
s = s.replace(new RegExp("М", 'g'), "M");
s = s.replace(new RegExp("И", 'g'), "I");
s = s.replace(new RegExp("Т", 'g'), "T");
s = s.replace(new RegExp("Ь", 'g'), "'");
s = s.replace(new RegExp("Б", 'g'), "B");
s = s.replace(new RegExp("Ю", 'g'), "JU");
s = s.replace(new RegExp("Ё", 'g'), "JO");




s = s.replace(new RegExp("/", 'g'), "_");
s = s.replace(new RegExp("'", 'g'), "_");

s = s.replace(new RegExp('"', 'g'), "_");


s = s.replace(new RegExp("\r", 'g'), "_");
s = s.replace(new RegExp(",", 'g'), "_");
s = s.replace(new RegExp("№", 'g'), "N_");


return s
}


function GetPanelType(Panel) {
// куда смотрит пласть панели?
var AZ = Panel.NToGlobal(AxisZ);
var ax = Math.abs(AZ.x);
var ay = Math.abs(AZ.y);
var az = Math.abs(AZ.z);
var ptype = '';
if ((az > ax) && (az > ay)) {
ptype = 'Front'
} else if (ax > ay) {
ptype = 'Vert'
} else
ptype = 'Horiz';
return ptype;
}


function MatrixAxisX(Radians) {
return new Array(new Array(1, 0, 0, 0),
new Array(0, Math.cos(Radians), Math.sin(Radians), 0),
new Array(0, -Math.sin(Radians), Math.cos(Radians), 0),
new Array(0, 0, 0, 1));
};

function MatrixAxisY(Radians) {
return new Array(new Array(Math.cos(Radians), 0, -Math.sin(Radians), 0),
new Array(0, 1, 0, 0),
new Array(Math.sin(Radians), 0, Math.cos(Radians), 0),
new Array(0, 0, 0, 1));
};

function MatrixAxisZ(Radians) {
return new Array(new Array(Math.cos(Radians), Math.sin(Radians), 0, 0),
new Array(-Math.sin(Radians), Math.cos(Radians), 0, 0),
new Array(0, 0, 1, 0),
new Array(0, 0, 0, 1));
};

function MultiplyMatrix(A, B) {
var Result = new Array(new Array(),
new Array(),
new Array(),
new Array());
for (var i = 0; i < 4; i++) {
for (var j = 0; j < 4; j++) {
Result[i][j] = 0;
for (var k = 0; k < 4; k++) {
Result[i][j] = Result[i][j] + A[i][k] * B[k][j];
};
};
};
return Result;
};

function GetTransformMatrix(Angles, Position) {
with(Angles) {
Result = MultiplyMatrix(MultiplyMatrix(MatrixAxisX(x), MatrixAxisY(y)), MatrixAxisZ(z));
};
with(Position) {
Result[0][3] = x;
Result[1][3] = y;
Result[2][3] = z;
};
return Result;
};

function GetObjectAngles(Object) {
with(Object.Rotation) {
q1 = ImagPart.x;
q2 = ImagPart.y;
q3 = ImagPart.z;
q4 = RealPart;
};
return NewVector(Math.atan2(2 * (q1 * q2 + q3 * q4), 1 - 2 * (q2 * q2 + q3 * q3)),
Math.asin(2 * (q1 * q3 - q4 * q2)),
Math.atan2(2 * (q1 * q4 + q2 * q3), 1 - 2 * (q3 * q3 + q4 * q4)));
};


function GetRGBColor(color) {
LONG = color
rgb = {}
rgb.B = LONG / 65536
rgb.G = (LONG - rgb.B * 65536) / 256
rgb.R = LONG - rgb.B * 65536 - rgb.G * 256
return rgb;
}

function decimalColorToHTMLcolor(number) {
//converts to a integer
var intnumber = number - 0;

// isolate the colors - really not necessary
var red, green, blue;

// needed since toString does not zero fill on left
// var template = "#000000";
var template = "0x000000";

// in the MS Windows world RGB colors
// are 0xBBGGRR because of the way Intel chips store bytes
red = (intnumber & 0x0000ff) << 16;
green = intnumber & 0x00ff00;
blue = (intnumber & 0xff0000) >>> 16;

// mask out each color and reverse the order
intnumber = red | green | blue;

// toString converts a number to a hexstring
var HTMLcolor = intnumber.toString(16);

//template adds # for standard HTML #RRGGBB
// HTMLcolor = template.substring(0,7 - HTMLcolor.length) + HTMLcolor;

HTMLcolor = template.substring(0, 8 - HTMLcolor.length) + HTMLcolor;

return HTMLcolor;
}




function TochkiDugi(elc, p, tochki) {


// system.log(elc + " -- " + g)


dlina = elc.ObjLength()


w11 = elc.ArcAngle() / kc.Value * elc.ArcRadius()
ww = 2 * elc.ArcRadius() * Math.sin((elc.ArcAngle() / kc.Value) / 2)
// system.log("угол " + elc.ArcAngle() + " -- длина " + elc.ObjLength() + " -- радиус " + elc.ArcRadius() + " -- длина сегмента " + w11 + " -- Высота сегмента " + ww)
pos = elc.Pos1



con = p.Contour




tochki.push(pos)



for (ii = 0; ii < kc.Value; ii++) {
nc = NewContour()
cir = nc.AddCircle(pos.x, pos.y, ww)
peresArray = geometry.Intersect(elc, cir)
system.log("пересечений " + peresArray.length)



for (pi = 0; pi < peresArray.length; pi++)

{
if (!yestiTochkaVMassive(peresArray[pi], tochki))

{
tochki.push(peresArray[pi])
pos = peresArray[pi]
}



}


}


// tochki.splice(tochki.length-1, tochki.length-1)




system.log("точек " + tochki.length)


}

function Distance(p1, p2) {
var dx = p2.x - p1.x;
var dy = p2.y - p1.y;
var dz = 0;
return Math.sqrt(dx * dx + dy * dy + dz * dz);
}

function Distance3d(p1, p2) {
var dx = p2.x - p1.x;
var dy = p2.y - p1.y;
var dz = p2.z - p1.z;
return Math.sqrt(dx * dx + dy * dy + dz * dz);
}

[свернуть]
v22884 вне форума   Ответить с цитированием Вверх
3 пользователя(ей) сказали cпасибо:
Briz (15.07.2016), maxgmv (15.07.2016), тех.нолог (15.07.2016)
Старый 18.07.2016, 09:15   #1189
v22884
Местный
 
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
v22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордится
По умолчанию

Экспорт в three.js

- добавлены пазы (не идеально, но в основном -- работает)
- изменено отображение текстуры для пластиков( чтоб отображалось больше 1)
- количество точек кривых в зависимости от доли окружности.


нет. перепроверил - пока плохо фасады рисует: сильно искажает. исправлю......
Вложения
Тип файла: rar МодельВTHREEjs 40 -- Фасады .rar (12.3 Кб, 13 просмотров)
v22884 вне форума   Ответить с цитированием Вверх
Пользователь сказал cпасибо:
Briz (18.07.2016)
Старый 18.07.2016, 09:27   #1190
Saha SG-552
Пользователь
 
Аватар для Saha SG-552
 
Регистрация: 16.03.2016
Сообщений: 31
Сказал(а) спасибо: 52
Поблагодарили 26 раз(а) в 6 сообщениях
Вес репутации: 107
Saha SG-552 на пути к лучшему
Печаль

Все же не разобрался =(
Задача: в модели имеются блоки, требуется создать сборки с именами этих блоков, и блоки поместить в эти сборки.
PHP код:
Model.forEach(function(obj) {
    if (
obj instanceof TFurnBlock) {
        if (
obj.Owner.Name == 'Model') {
            
Sborka AddAssembly (obj.Name);
            
obj.Owner Sborka
        
}
    }

}); 
Если в модели только один блок, то сборка с ним создается нормально.
Если же больше, то вылетает ошибка и один из блоков пропадает.
Намекните, что делаю не так?
Saha SG-552 вне форума   Ответить с цитированием Вверх
Ответ

Нижняя навигация
Вернуться   Форум профессиональных мебельщиков PROMEBELclub > Программы для мебельщиков > Программы для конструирования и дизайна мебели > Система БАЗИС > Базис-мебельщик. Скрипты

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
БАЗИС 8 - Скрипты Igor_482 Базис-мебельщик. Скрипты 1525 30.03.2024 15:03
БАЗИС 9 nayrogi Базис-мебельщик 9 785 01.10.2022 23:13
БАЗИС-ЧПУ 8 chingisnah Базис-мебельщик 8 119 21.12.2017 22:04
Заявки на скрипты dr_john Система БАЗИС 37 01.03.2016 10:36
Базис-7,"Народный Базис"и Windows-8 sergeyzak18 "НАРОДНЫЙ" базис 23 16.01.2014 00:37


Текущее время: 10:02. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
© 2007-2023 PROMEBEL

џндекс.Њетрика