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

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

Меню

Маркет


Ответ
 
Опции темы Опции просмотра
Старый 06.06.2017, 08:56  
БАЗИС 10 - Скрипты
systland
VIP
Регистрация: 30.10.2007
Адрес: Москва
Сообщений: 565

Сказал(а) спасибо: 303
Поблагодарили 451 раз(а) в 189 сообщениях
Версия для печати Отправить по электронной почте
systland systland вне форума 06.06.2017, 08:56
Рейтинг: ()

Обмениваемся , задаем вопросы, отвечаем... Все, что касается скриптов в БМ 10 в этой теме.
__________________


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

DXF c правильным созданием Папки ЧПУ и отверстиями пока только одной первой пластью.

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






//system.exec('c:/Windows/system32/cmd.exe', '/c md "'+ActiveFilePathNomenklatury()+'ЧПУ"')


$$FileName = Action.ModelFilename
system.log($$FileName)
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
// alert(PathNomenklatury)
if(PathNomenklatury>0)
{
PathNomenklatury = $$FileName.substring(0, PathNomenklatury);
}
else
{
PathNomenklatury = $$FileName.substring(0, $$FileName.lastIndexOf("\\") + 1)
}

return PathNomenklatury;
}


//system.exec('c:/Windows/system32/cmd.exe', '/c md "'+ActiveFilePathNomenklatury()+'ЧПУ"')

absolutNameAndPt = ActiveFilePathNomenklatury()+'ЧПУ'

var fs = require('fs');
fs.mkdirSync(absolutNameAndPt); // создать папку, аргумент абсолютный путь.
var isExists = fs.existsSync(absolutNameAndPt); // можно проверить есть ли папка.

//и т.д. ..



VydelenniyeV_CNC()


function VydelenniyeV_CNC() {
var ar = [] //массив всех выделенных панелей
var OrigSel = []
for (i = 0; i < Model.SelectionCount; i++) {
if (!Model.Selections[i].AsPanel)
continue

OrigSel.push(Model.Selections[i])
}
for (i = 0; i < OrigSel.length; i++) {

if (OrigSel[i].ArtPos == "") {
alert("Расставь Позиции!");
return
}
p = OrigSel[i]
tOr = p.TextureOrientation //0-нет, 1-гор, 2 - верт
if (tOr ==1)
{
cRotation = 90;
}
else{cRotation=0}



// alert(p.ArtPos+ ' -- ' +tOr)
//kh = p.ContourHeight
//kw = p.ContourWidth
//alert(kh+ ' -- ' +kw+ ' -- ' +tOr)
ap = [] // массив контуров панелИ
contourData = {}
contourData.Pos = p.ArtPos
c = p.Contour.MakeCopy()

c.Rotate(0, 0, cRotation);

contourData.c = c
sloyKontura = "Контур заготовки"
contourData.sloy= sloyKontura
ap.push(contourData);

for (ic = 0; ic < p.Cuts.Count; ic++) {
//alert( p.Cuts[ic].Name )
contourData = {}
contourData.Pos = p.ArtPos

//? для пазов выборки Тип = 2 ?
if (p.Cuts[ic].CutType===2)
{c = p.Cuts[ic].Contour.MakeCopy()}
else
{
c = p.Cuts[ic].Trajectory.MakeCopy()
}

c.Rotate(0, 0, cRotation);

contourData.c = c
var cutName = ""
if(p.Cuts[ic].Sign.toString().trim().length>0)
{

cutName = p.Cuts[ic].Sign
}
else
{
cutName = p.Cuts[ic].Name
}
system.log(cutName)
contourData.sloy=cutName
ap.push(contourData);
}
//--------------Слои отверстий
apO = sloiOtverstiy(p,cRotation)
var holesNames = apO[0]
var holesContours = apO[1]
for(io=0;io<holesNames.length;io++)
{
contourData = {}
contourData.Pos = p.ArtPos
contourData.c = holesContours[io]
contourData.sloy= holesNames[io]
ap.push(contourData);
}
//--------------Слои отверстий




ar.push(ap)
Model.Selections = OrigSel
}

for (var ia = 0; ia < ar.length; ia++) {
DXF(ar[ia])

}

for (i = 0; i < OrigSel.length; i++) {
OrigSel[i].Selected = true
}
}







function DXF(data) {

t1 = "0\nVISION3D DXF\n0\nSECTION\n2\nHEADER\n9\n$ACADVER\n 1\nAC1015\n 9\n$ACADMAINTVER\n 70\n6\n 9\n$DWGCODEPAGE\n 3\nANSI_1251\n 9\n$INSBASE\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 9\n$EXTMIN\n10\n0.0\n20\n0.0\n9\n$EXTMAX\n10\n1000.0\n20\n1000.0\n9\n$LINMIN\n10\n0.0\n20\n0.0\n9\n$LINMAX\n10\n1000.0\n20\n1000.0\n0\nENDSEC\n0\nSECTION\n2\nTABLES\n0\nTABLE\n2\nLTYPE\n70\n1\n0\nLTYPE\n2\nCONTINUOUS\n70\n64\n3\nSolid line\n72\n65\n73\n0\n40\n0.000000\n0\nENDTAB\n0\nTABLE\n2\n"
//alert(t1)
t2_doSloya = "LAYER\n70\n6\n0\nLAYER\n 5\n110D0\n330\n2\n100\nAcDbSymbolTableRecord\n100\nAcDbLayerTableRecord\n 2\n"
//alert(t2_doSloya)
t3_PosleSloya = "70\n64\n 62\n7\n 6\nCONTINUOUS\n0\n"
//alert(t3_PosleSloya)
t4_DoObjektov = "ENDTAB\n0\nTABLE\n2\nSTYLE\n70\n0\n0\nENDTAB\n0\nENDSEC\n0\nSECTION\n2\nBLOCKS\n0\nENDSEC\n0\nSECTION\n2\nENTITIES\n"
//alert(t4_DoObjektov)
l1_sloy = "0\nLINE\n 5\n110D1\n330\n1F\n100\nAcDbEntity\n 8\n"
//alert(l1_sloy)
l2_x1 = "6\nCONTINUOUS\n 62\n7\n370\n60\n100\nAcDbLine\n 10\n"
//alert(l2_x1)
l3_y1 = " 20\n"
l4_x2 = " 11\n"
l5_y2 = " 21\n"

a1_sloy = " 0\nARC\n 5\n110D2\n330\n1F\n100\nAcDbEntity\n 8\n"

a2_cX = " 6\nCONTINUOUS\n 62\n7\n370\n60\n100\nAcDbCircle\n 10\n"
//alert(a2_cX)

a3_cY = " 20\n"
a4_R = " 40\n"
a5_p1A = "100\nAcDbArc\n 50\n"
a6_p2A = " 51\n"


c1_sloy = "0\nCIRCLE\n 5\n110D3\n330\n1F\n100\nAcDbEntity\n 8\n"
c2_cX = "6\nCONTINUOUS\n 62\n7\n370\n60\n100\nAcDbCircle\n 10\n"
c3_cY = " 20\n"
c4_R = " 40\n"
kanec = "0\nENDSEC\n0\nEOF"


sloi = []
for(i=0;i< data.length;i++)
{
//alert('!!!'+data[i].sloy)
if(sloi.indexOf(data[i].sloy)== -1)
{
sloi.push(data[i].sloy)
}

}

tdxf = t1

for(i=0;i< sloi.length;i++)
{
tdxf = tdxf + t2_doSloya + sloi[i] + "\n" + t3_PosleSloya
}


tdxf = tdxf + t4_DoObjektov

for(ic=0;ic< data.length;ic++)
{
c = data[ic].c
sloy = data[ic].sloy
for (i = 0; i < c.Count; i++) {
if (c[i].ElType == 1) {
tdxf = tdxf + l1_sloy + sloy + "\n" + l2_x1 + c[i].Pos1.x + "\n" + l3_y1 + c[i].Pos1.y + "\n" + l4_x2 + c[i].Pos2.x + "\n" + l5_y2 + c[i].Pos2.y + "\n"
} else if (c[i].ElType == 2) {
p1A = c[i].Pos1Angle() * (180 / Math.PI)
p2A = c[i].Pos2Angle() * (180 / Math.PI)
if(!c[i].ArcDir)
{
pp=p1A
p1A = p2A
p2A = pp
}
//else {dir='1'}
tdxf = tdxf + a1_sloy + sloy + "\n" + a2_cX + c[i].Center.x + "\n" + a3_cY + c[i].Center.y + "\n" + a4_R + c[i].ArcRadius() + "\n" + a5_p1A + p1A + "\n" + a6_p2A + p2A + "\n"
} else if (c[i].ElType == 3) {
tdxf = tdxf + c1_sloy + sloy + "\n" + c2_cX + c[i].Center.x + "\n" + c3_cY + c[i].Center.y + "\n" + c4_R + c[i].CirRadius + "\n"
}
}
}
tdxf = tdxf + kanec

system.writeTextFile(ActiveFilePathNomenklatury()+ 'ЧПУ\\' + data[0].Pos + '.dxf', tdxf)
}











function sloiOtverstiy(p,cRotation)
{
fs = krepej(p)
var res22 = Dyriavim(fs,p)
return res22

}

function krepej(p)
{
if(!p.AsPanel) {return}
var ar = p.FindConnectedFasteners(p)
return ar
}

function Dyriavim(fs,p)
{
// alert(fs[0])

var holesContours = []
var holesNames = []

for(iif=0;iif<fs.length;iif++)
{
f=fs[iif]
// alert(f)
c = f.Holes;
var i = 0;
сk = f.Holes.Count;
//HoleCon = NewContour();

while (i < сk) {
hole = c[i]
if(!CheckHole(c[i],f, p)&&!CheckHole2(c[i],f, p))
{
i++
continue
}
if (CheckWithPanel(f.NToGlobal(c[i].Direction), p))
{
i++
continue
}

if (!GetPanelFace(hole, f, p))
{
i++
continue
}

if (c[i].Radius<1.9/2)
{
i++
continue
}




HolePosG = f.ToGlobal(c[i].Position);
p.Selected = false
HolePosG = p.ToObject(HolePosG)
if (c[i].Contour==null)
{
holeName = "o"+(c[i].Radius*2).toString()+"h"+HoleFaceDepth(c[i],f, p).toString()
var ihn = holesNames.indexOf(holeName)
if(ihn==-1)
{
holesNames.push(holeName)
HoleCon = NewContour()
holesContours.push(HoleCon)
} else
{
HoleCon = holesContours[ihn]
}

HoleCon.AddCircle(HolePosG.x, HolePosG.y, c[i].Radius)
}
else
{

holeName = "Qh"+HoleFaceDepth(c[i],f, p).toString()
var ihn = holesNames.indexOf(holeName)
if(ihn==-1)
{
holesNames.push(holeName)
HoleCon = holesContours.push(NewContour())
} else
{
HoleCon = holesContours[ihn]
}


HoleCon.AddList(c[i].Contour.MakeCopy());
HoleCon.Move(HolePosG.x, HolePosG.y)
}
i++
}


/*StartEditing(p)
Undo.Changing(p)
//StartEditing(p)
p.Contour.Subtraction(HoleCon);
system.log(p.ArtPos+ " -- "+p.Name)
p.Build()
*/

}
for(ic = 0;ic<holesContours.length;ic++)
{
holesContours[ic].Rotate(0, 0, cRotation);
}

var res22 = []
res22.push( holesNames)
res22.push(holesContours )
return res22
}






/**
* Определить пласть, с которой засверлено отверстие
* @returns {boolean} true - задняя пласть (-Z по ЛСК панели), false - передняя пласть (+Z по ЛСК панели)
* @param {*} hole Отверстие
* @param {Object3} fast Фурнитура, которой принадлежит отверстие
* @param {Panel} panel Панель
*/
function GetPanelFace(hole, fast, panel){
var lowz = panel.LowZ;
var highz = panel.HighZ;
// начальная точка отверстия в ЛСК панели по оси Z (ось пласти панели)
var holeStart = panel.ToObject(fast.ToGlobal(hole.Position)).z;
var lowd = Math.abs(holeStart - lowz);
var highd = Math.abs(holeStart - highz);
return lowd < highd;
}


function CheckHole2(hole,fast, panel){
for(id=1;id<20;id++)
{
if(CheckHole(hole,fast, panel,id/20))
{
return true
}
}
return false
}

function CheckHole(hole,fast, panel,delim){
var holeCenter = fast.ToGlobal({
x: hole.Position.x + hole.Direction.x * (hole.Depth * delim),
y: hole.Position.y + hole.Direction.y * (hole.Depth * delim),
z: hole.Position.z + hole.Direction.z * (hole.Depth * delim),
})
holeCenter = panel.ToObject(holeCenter);
return (holeCenter.x > panel.GMin.x) && (holeCenter.x < panel.GMax.x) &&
(holeCenter.y > panel.GMin.y) && (holeCenter.y < panel.GMax.y) &&
(holeCenter.z > panel.GMin.z) && (holeCenter.z < panel.GMax.z);
}


function Equals(n1, n2){
return Math.abs(n1 - n2) < 0.001;
}

function EqualsV(v1, v2) {
return Equals(v1.x, v2.x) &&
Equals(v1.y, v2.y) &&
Equals(v1.z, v2.z);
}

function CheckWithPanel(gDir, panel){
return (EqualsV(gDir, panel.NToGlobal(AxisX)) ||
EqualsV(gDir, panel.NToGlobal(Axis_X)) ||
EqualsV(gDir, panel.NToGlobal(AxisY)) ||
EqualsV(gDir, panel.NToGlobal(Axis_Y)))
}



/**
* Глубина отверстия в пласти панели
* @param {*} hole Отверстие
* @param {Object3} fast Фурнитура, которой принадлежит отверстие
* @param {Panel} panel Панель
*/
function HoleFaceDepth(hole, fast, panel){
// минимум и максимум панели
var pMin = panel.GMin.z, pMax = panel.GMax.z;
// начальная точка отверстия в ЛСК панели по оси Z (ось пласти панели)
var holeStart = panel.ToObject(fast.ToGlobal(hole.Position)).z;
// конечная точка отверстия в ЛСК панели по оси Z (ось пласти панели)
var holeEnd = panel.ToObject(fast.ToGlobal({
x: hole.Position.x + hole.Direction.x * hole.Depth,
y: hole.Position.y + hole.Direction.y * hole.Depth,
z: hole.Position.z + hole.Direction.z * hole.Depth
})).z;
// Если начальная координата больше конечной - меняем их местами
if (holeStart > holeEnd){
var swap = holeStart;
holeStart = holeEnd;
holeEnd = swap;
}
var result = Math.min(holeEnd, pMax) - Math.max(holeStart, pMin);
return Math.round(result*10)/10
}



//****----------------- Угол отверстия в пласть
function VectorDot(v1, v2) {
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
}
function VectorLength(v) {
return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z)
}

function VectorsAngle(v1, v2){
return Math.acos(VectorDot(v1, v2) / (VectorLength(v1) * VectorLength(v2))) * 180 / Math.PI
}


/// ------ Вызывать эту функцию -------------
function AngleBetweenHoleDirAndPanelFace(hole, fast, panel){
var pDir = panel.NToGlobal(AxisZ);
var hDir = fast.NToGlobal(hole.Direction);
return VectorsAngle(pDir, hDir);
}

//****----------------- Угол отверстия в пласть----------------




[свернуть]



СПАСИБО Letos, IStiv и всем. Прыгаю от счастья!
v22884 вне форума   Ответить с цитированием Вверх
3 пользователя(ей) сказали cпасибо:
Letos (22.07.2019), Ovsyanicov (21.07.2019), Uncle (21.07.2019)
Старый 21.07.2019, 19:49   #452
IStiv
Пользователь
 
Регистрация: 02.12.2016
Сообщений: 84
Сказал(а) спасибо: 21
Поблагодарили 55 раз(а) в 27 сообщениях
Вес репутации: 109
IStiv скоро придёт к известности
По умолчанию

вопрос скорее по node.js. но все же.
нужно организовать правильно поток выполнения.
Два отдельных скрипта, один (форма ) подключается к другому.
надо чтобы по клике на форме(точнее на кнопке в свойствах) поток выполнения "шел" в основной скрипт.
т.е. чтобы скрипт ждал OnClick

форма:
PHP код:
module.exports = {

    
getValues: function (mtrs) {

        var 
mtrsIsClear Object.create(null);
        
showProps();

        function 
showProps() {

            var 
props Action.Properties;
            var 
mtrsProps props.NewGroup('Материалы');
            
mtrsProps.Clear(); // очистка родительского свойства от всех вложенных свойств

            
for (var key in mtrs) {
                
mtrsProps.NewBool(key);
            }

            
props.NewButton('Установить').OnClick = function (mtrsProps) {
                
get(mtrsProps);
                
Action.Properties.Clear();
                
Action.Commit();
            };

            function 
get() {
                for (var 
0mtrsProps.Counti++) {
                    var 
item mtrsProps.Items[i];
                    if (
item.Value) {
                        
mtrsIsClear[item.Name] = true;
                    }
                }
            }

            
Action.Continue();
        }
        return 
mtrsIsClear;
    }
}; 
и основной код.
PHP код:
//формы
var forms = require('../additionalScripts/forms/materaialInProps.js');
// значения из формы 
mtrsObj forms.getValues(mtrsObj);

//поток выполнения идет сюда. а как сделать, чтобы он сюда шел только после OnClick на форме? 
IStiv вне форума   Ответить с цитированием Вверх
Старый 21.07.2019, 21:55   #453
Uncle
VIP
 
Аватар для Uncle
 
Регистрация: 31.10.2009
Адрес: Рівне. УкраЇна
Сообщений: 10,580
Сказал(а) спасибо: 14,588
Поблагодарили 20,026 раз(а) в 6,492 сообщениях
Вес репутации: 5258
Uncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспорима
По умолчанию

Цитата:
Сообщение от v22884 Посмотреть сообщение
DXF c правильным созданием Папки ЧПУ
А нельзя ли сделать что бы папка называлась точно так же как и модель, с которой скрипт формирует файлы dxf?
__________________
Уж лучше беспокойство в сомнении, чем успокоенность в заблуждении. .
(Мандзони Алессандро)
------------------------------------
Троллей не кормлю...
Uncle вне форума   Ответить с цитированием Вверх
Старый 22.07.2019, 09:57   #454
Letos
Консультант
 
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,030 раз(а) в 366 сообщениях
Вес репутации: 344
Letos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордится
По умолчанию

Цитата:
Сообщение от IStiv Посмотреть сообщение
вопрос скорее по node.js. но все же.
нужно организовать правильно поток выполнения.
Два отдельных скрипта, один (форма ) подключается к другому.
надо чтобы по клике на форме(точнее на кнопке в свойствах) поток выполнения "шел" в основной скрипт.
т.е. чтобы скрипт ждал OnClick

форма:
PHP код:
module.exports = {

    
getValues: function (mtrs) {

        var 
mtrsIsClear Object.create(null);
        
showProps();

        function 
showProps() {

            var 
props Action.Properties;
            var 
mtrsProps props.NewGroup('Материалы');
            
mtrsProps.Clear(); // очистка родительского свойства от всех вложенных свойств

            
for (var key in mtrs) {
                
mtrsProps.NewBool(key);
            }

            
props.NewButton('Установить').OnClick = function (mtrsProps) {
                
get(mtrsProps);
                
Action.Properties.Clear();
                
Action.Commit();
            };

            function 
get() {
                for (var 
0mtrsProps.Counti++) {
                    var 
item mtrsProps.Items[i];
                    if (
item.Value) {
                        
mtrsIsClear[item.Name] = true;
                    }
                }
            }

            
Action.Continue();
        }
        return 
mtrsIsClear;
    }
}; 
и основной код.
PHP код:
//формы
var forms = require('../additionalScripts/forms/materaialInProps.js');
// значения из формы 
mtrsObj forms.getValues(mtrsObj);

//поток выполнения идет сюда. а как сделать, чтобы он сюда шел только после OnClick на форме? 
Я думаю, надо объявить в подключаемом модуле у возвращаемого объекта свойство OnClick, например:
Код:
var mtrsIsClear = Object.create(null);
mtrsIsClear.OnClick = undefined;
//Далее по тексту
И в обработку OnClick кнопки добавить
Код:
if (mtrsIsClear.OnClick)
  mtrsIsClear.OnClick()
Таким образом, если кто-то назначит в OnClick функцию, на клик по кнопке она отработает.
Остаётся только добавить в основной скрипт назначение функции, например
Код:
mtrsObj.OnClick = function(){
    alert('Клик')
};

ЗЫ. Прочитал последний комментарий. Чтобы только после OnClick шёл поток, самый простой способ - написать весь нужный код во внешнем OnClick.
Letos вне форума   Ответить с цитированием Вверх
3 пользователя(ей) сказали cпасибо:
IStiv (23.07.2019), Ovsyanicov (22.07.2019), zorro (22.07.2019)
Старый 22.07.2019, 13:33   #455
v22884
Местный
 
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
v22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордится
По умолчанию

Цитата:
Сообщение от Uncle Посмотреть сообщение
А нельзя ли сделать что бы папка называлась точно так же как и модель, с которой скрипт формирует файлы dxf?

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


//system.exec('c:/Windows/system32/cmd.exe', '/c md "'+ActiveFilePathNomenklatury()+'ЧПУ"')


$$FileName = Action.ModelFilename
system.log($$FileName)
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
// alert(PathNomenklatury)
if(PathNomenklatury>0)
{
PathNomenklatury = $$FileName.substring(0, PathNomenklatury);
}
else
{
PathNomenklatury = $$FileName.substring(0, $$FileName.lastIndexOf("\\") + 1)
}

return PathNomenklatury;
}


//system.exec('c:/Windows/system32/cmd.exe', '/c md "'+ActiveFilePathNomenklatury()+'ЧПУ"')

absolutNameAndPt = ActiveFilePathNomenklatury()+Action.Control.Article.Name

var fs = require('fs');
var isExists = fs.existsSync(absolutNameAndPt); // можно проверить есть ли папка.
if(!isExists){
fs.mkdirSync(absolutNameAndPt); // создать папку, аргумент абсолютный путь.
}
var isExists = fs.existsSync(absolutNameAndPt); // можно проверить есть ли папка.

//и т.д. ..



VydelenniyeV_CNC()


function VydelenniyeV_CNC() {
var ar = [] //массив всех выделенных панелей
var OrigSel = []
for (i = 0; i < Model.SelectionCount; i++) {
if (!Model.Selections[i].AsPanel)
continue

OrigSel.push(Model.Selections[i])
}
for (i = 0; i < OrigSel.length; i++) {

if (OrigSel[i].ArtPos == "") {
alert("Расставь Позиции!");
return
}
p = OrigSel[i]
tOr = p.TextureOrientation //0-нет, 1-гор, 2 - верт
if (tOr ==1)
{
cRotation = 90;
}
else{cRotation=0}



// alert(p.ArtPos+ ' -- ' +tOr)
//kh = p.ContourHeight
//kw = p.ContourWidth
//alert(kh+ ' -- ' +kw+ ' -- ' +tOr)
ap = [] // массив контуров панелИ
contourData = {}
contourData.Pos = p.ArtPos
c = p.Contour.MakeCopy()

c.Rotate(0, 0, cRotation);

contourData.c = c
sloyKontura = "Контур заготовки"
contourData.sloy= sloyKontura
ap.push(contourData);

for (ic = 0; ic < p.Cuts.Count; ic++) {
//alert( p.Cuts[ic].Name )
contourData = {}
contourData.Pos = p.ArtPos

//? для пазов выборки Тип = 2 ?
if (p.Cuts[ic].CutType===2)
{c = p.Cuts[ic].Contour.MakeCopy()}
else
{
c = p.Cuts[ic].Trajectory.MakeCopy()
}

c.Rotate(0, 0, cRotation);

contourData.c = c
var cutName = ""
if(p.Cuts[ic].Sign.toString().trim().length>0)
{

cutName = p.Cuts[ic].Sign
}
else
{
cutName = p.Cuts[ic].Name
}
system.log(cutName)
contourData.sloy=cutName
ap.push(contourData);
}
//--------------Слои отверстий
apO = sloiOtverstiy(p,cRotation)
var holesNames = apO[0]
var holesContours = apO[1]
for(io=0;io<holesNames.length;io++)
{
contourData = {}
contourData.Pos = p.ArtPos
contourData.c = holesContours[io]
contourData.sloy= holesNames[io]
ap.push(contourData);
}
//--------------Слои отверстий




ar.push(ap)
Model.Selections = OrigSel
}

for (var ia = 0; ia < ar.length; ia++) {
DXF(ar[ia])

}

for (i = 0; i < OrigSel.length; i++) {
OrigSel[i].Selected = true
}
}







function DXF(data) {

t1 = "0\nVISION3D DXF\n0\nSECTION\n2\nHEADER\n9\n$ACADVER\n 1\nAC1015\n 9\n$ACADMAINTVER\n 70\n6\n 9\n$DWGCODEPAGE\n 3\nANSI_1251\n 9\n$INSBASE\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 9\n$EXTMIN\n10\n0.0\n20\n0.0\n9\n$EXTMAX\n10\n1000.0\n20\n1000.0\n9\n$LINMIN\n10\n0.0\n20\n0.0\n9\n$LINMAX\n10\n1000.0\n20\n1000.0\n0\nENDSEC\n0\nSECTION\n2\nTABLES\n0\nTABLE\n2\nLTYPE\n70\n1\n0\nLTYPE\n2\nCONTINUOUS\n70\n64\n3\nSolid line\n72\n65\n73\n0\n40\n0.000000\n0\nENDTAB\n0\nTABLE\n2\n"
//alert(t1)
t2_doSloya = "LAYER\n70\n6\n0\nLAYER\n 5\n110D0\n330\n2\n100\nAcDbSymbolTableRecord\n100\nAcDbLayerTableRecord\n 2\n"
//alert(t2_doSloya)
t3_PosleSloya = "70\n64\n 62\n7\n 6\nCONTINUOUS\n0\n"
//alert(t3_PosleSloya)
t4_DoObjektov = "ENDTAB\n0\nTABLE\n2\nSTYLE\n70\n0\n0\nENDTAB\n0\nENDSEC\n0\nSECTION\n2\nBLOCKS\n0\nENDSEC\n0\nSECTION\n2\nENTITIES\n"
//alert(t4_DoObjektov)
l1_sloy = "0\nLINE\n 5\n110D1\n330\n1F\n100\nAcDbEntity\n 8\n"
//alert(l1_sloy)
l2_x1 = "6\nCONTINUOUS\n 62\n7\n370\n60\n100\nAcDbLine\n 10\n"
//alert(l2_x1)
l3_y1 = " 20\n"
l4_x2 = " 11\n"
l5_y2 = " 21\n"

a1_sloy = " 0\nARC\n 5\n110D2\n330\n1F\n100\nAcDbEntity\n 8\n"

a2_cX = " 6\nCONTINUOUS\n 62\n7\n370\n60\n100\nAcDbCircle\n 10\n"
//alert(a2_cX)

a3_cY = " 20\n"
a4_R = " 40\n"
a5_p1A = "100\nAcDbArc\n 50\n"
a6_p2A = " 51\n"


c1_sloy = "0\nCIRCLE\n 5\n110D3\n330\n1F\n100\nAcDbEntity\n 8\n"
c2_cX = "6\nCONTINUOUS\n 62\n7\n370\n60\n100\nAcDbCircle\n 10\n"
c3_cY = " 20\n"
c4_R = " 40\n"
kanec = "0\nENDSEC\n0\nEOF"


sloi = []
for(i=0;i< data.length;i++)
{
//alert('!!!'+data[i].sloy)
if(sloi.indexOf(data[i].sloy)== -1)
{
sloi.push(data[i].sloy)
}

}

tdxf = t1

for(i=0;i< sloi.length;i++)
{
tdxf = tdxf + t2_doSloya + sloi[i] + "\n" + t3_PosleSloya
}


tdxf = tdxf + t4_DoObjektov

for(ic=0;ic< data.length;ic++)
{
c = data[ic].c
sloy = data[ic].sloy
for (i = 0; i < c.Count; i++) {
if (c[i].ElType == 1) {
tdxf = tdxf + l1_sloy + sloy + "\n" + l2_x1 + c[i].Pos1.x + "\n" + l3_y1 + c[i].Pos1.y + "\n" + l4_x2 + c[i].Pos2.x + "\n" + l5_y2 + c[i].Pos2.y + "\n"
} else if (c[i].ElType == 2) {
p1A = c[i].Pos1Angle() * (180 / Math.PI)
p2A = c[i].Pos2Angle() * (180 / Math.PI)
if(!c[i].ArcDir)
{
pp=p1A
p1A = p2A
p2A = pp
}
//else {dir='1'}
tdxf = tdxf + a1_sloy + sloy + "\n" + a2_cX + c[i].Center.x + "\n" + a3_cY + c[i].Center.y + "\n" + a4_R + c[i].ArcRadius() + "\n" + a5_p1A + p1A + "\n" + a6_p2A + p2A + "\n"
} else if (c[i].ElType == 3) {
tdxf = tdxf + c1_sloy + sloy + "\n" + c2_cX + c[i].Center.x + "\n" + c3_cY + c[i].Center.y + "\n" + c4_R + c[i].CirRadius + "\n"
}
}
}
tdxf = tdxf + kanec

system.writeTextFile(ActiveFilePathNomenklatury()+Action.Control.Article.Name +'\\' + data[0].Pos + '.dxf', tdxf)
}











function sloiOtverstiy(p,cRotation)
{
fs = krepej(p)
var res22 = Dyriavim(fs,p)
return res22

}

function krepej(p)
{
if(!p.AsPanel) {return}
var ar = p.FindConnectedFasteners(p)
return ar
}

function Dyriavim(fs,p)
{
// alert(fs[0])

var holesContours = []
var holesNames = []

for(iif=0;iif<fs.length;iif++)
{
f=fs[iif]
// alert(f)
c = f.Holes;
var i = 0;
сk = f.Holes.Count;
//HoleCon = NewContour();

while (i < сk) {
hole = c[i]
if(!CheckHole(c[i],f, p)&&!CheckHole2(c[i],f, p))
{
i++
continue
}
if (CheckWithPanel(f.NToGlobal(c[i].Direction), p))
{
i++
continue
}

if (!GetPanelFace(hole, f, p))
{
i++
continue
}

if (c[i].Radius<1.9/2)
{
i++
continue
}




HolePosG = f.ToGlobal(c[i].Position);
p.Selected = false
HolePosG = p.ToObject(HolePosG)
if (c[i].Contour==null)
{
holeName = "o"+(c[i].Radius*2).toString()+"h"+HoleFaceDepth(c[i],f, p).toString()
var ihn = holesNames.indexOf(holeName)
if(ihn==-1)
{
holesNames.push(holeName)
HoleCon = NewContour()
holesContours.push(HoleCon)
} else
{
HoleCon = holesContours[ihn]
}

HoleCon.AddCircle(HolePosG.x, HolePosG.y, c[i].Radius)
}
else
{

holeName = "Qh"+HoleFaceDepth(c[i],f, p).toString()
var ihn = holesNames.indexOf(holeName)
if(ihn==-1)
{
holesNames.push(holeName)
HoleCon = holesContours.push(NewContour())
} else
{
HoleCon = holesContours[ihn]
}


HoleCon.AddList(c[i].Contour.MakeCopy());
HoleCon.Move(HolePosG.x, HolePosG.y)
}
i++
}


/*StartEditing(p)
Undo.Changing(p)
//StartEditing(p)
p.Contour.Subtraction(HoleCon);
system.log(p.ArtPos+ " -- "+p.Name)
p.Build()
*/

}
for(ic = 0;ic<holesContours.length;ic++)
{
holesContours[ic].Rotate(0, 0, cRotation);
}

var res22 = []
res22.push( holesNames)
res22.push(holesContours )
return res22
}






/**
* Определить пласть, с которой засверлено отверстие
* @returns {boolean} true - задняя пласть (-Z по ЛСК панели), false - передняя пласть (+Z по ЛСК панели)
* @param {*} hole Отверстие
* @param {Object3} fast Фурнитура, которой принадлежит отверстие
* @param {Panel} panel Панель
*/
function GetPanelFace(hole, fast, panel){
var lowz = panel.LowZ;
var highz = panel.HighZ;
// начальная точка отверстия в ЛСК панели по оси Z (ось пласти панели)
var holeStart = panel.ToObject(fast.ToGlobal(hole.Position)).z;
var lowd = Math.abs(holeStart - lowz);
var highd = Math.abs(holeStart - highz);
return lowd < highd;
}


function CheckHole2(hole,fast, panel){
for(id=1;id<20;id++)
{
if(CheckHole(hole,fast, panel,id/20))
{
return true
}
}
return false
}

function CheckHole(hole,fast, panel,delim){
var holeCenter = fast.ToGlobal({
x: hole.Position.x + hole.Direction.x * (hole.Depth * delim),
y: hole.Position.y + hole.Direction.y * (hole.Depth * delim),
z: hole.Position.z + hole.Direction.z * (hole.Depth * delim),
})
holeCenter = panel.ToObject(holeCenter);
return (holeCenter.x > panel.GMin.x) && (holeCenter.x < panel.GMax.x) &&
(holeCenter.y > panel.GMin.y) && (holeCenter.y < panel.GMax.y) &&
(holeCenter.z > panel.GMin.z) && (holeCenter.z < panel.GMax.z);
}


function Equals(n1, n2){
return Math.abs(n1 - n2) < 0.001;
}

function EqualsV(v1, v2) {
return Equals(v1.x, v2.x) &&
Equals(v1.y, v2.y) &&
Equals(v1.z, v2.z);
}

function CheckWithPanel(gDir, panel){
return (EqualsV(gDir, panel.NToGlobal(AxisX)) ||
EqualsV(gDir, panel.NToGlobal(Axis_X)) ||
EqualsV(gDir, panel.NToGlobal(AxisY)) ||
EqualsV(gDir, panel.NToGlobal(Axis_Y)))
}



/**
* Глубина отверстия в пласти панели
* @param {*} hole Отверстие
* @param {Object3} fast Фурнитура, которой принадлежит отверстие
* @param {Panel} panel Панель
*/
function HoleFaceDepth(hole, fast, panel){
// минимум и максимум панели
var pMin = panel.GMin.z, pMax = panel.GMax.z;
// начальная точка отверстия в ЛСК панели по оси Z (ось пласти панели)
var holeStart = panel.ToObject(fast.ToGlobal(hole.Position)).z;
// конечная точка отверстия в ЛСК панели по оси Z (ось пласти панели)
var holeEnd = panel.ToObject(fast.ToGlobal({
x: hole.Position.x + hole.Direction.x * hole.Depth,
y: hole.Position.y + hole.Direction.y * hole.Depth,
z: hole.Position.z + hole.Direction.z * hole.Depth
})).z;
// Если начальная координата больше конечной - меняем их местами
if (holeStart > holeEnd){
var swap = holeStart;
holeStart = holeEnd;
holeEnd = swap;
}
var result = Math.min(holeEnd, pMax) - Math.max(holeStart, pMin);
return Math.round(result*10)/10
}



//****----------------- Угол отверстия в пласть
function VectorDot(v1, v2) {
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
}
function VectorLength(v) {
return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z)
}

function VectorsAngle(v1, v2){
return Math.acos(VectorDot(v1, v2) / (VectorLength(v1) * VectorLength(v2))) * 180 / Math.PI
}


/// ------ Вызывать эту функцию -------------
function AngleBetweenHoleDirAndPanelFace(hole, fast, panel){
var pDir = panel.NToGlobal(AxisZ);
var hDir = fast.NToGlobal(hole.Direction);
return VectorsAngle(pDir, hDir);
}

//****----------------- Угол отверстия в пласть----------------
[свернуть]


Только надо заботиться, чтобы в имени модели не было запрещённых для файловой системы символов или добавить функцию преобразования их в разрешённые.
v22884 вне форума   Ответить с цитированием Вверх
7 пользователя(ей) сказали cпасибо:
Старый 22.07.2019, 14:06   #456
Uncle
VIP
 
Аватар для Uncle
 
Регистрация: 31.10.2009
Адрес: Рівне. УкраЇна
Сообщений: 10,580
Сказал(а) спасибо: 14,588
Поблагодарили 20,026 раз(а) в 6,492 сообщениях
Вес репутации: 5258
Uncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспорима
По умолчанию

Цитата:
Сообщение от v22884 Посмотреть сообщение
Только надо заботиться, чтобы в имени модели не было запрещённых для файловой системы символов
v22884, Все отлично. По поводу символов - это само собой... Не ловко Вас просить уже, и так работа сделана огромная даже судя по объему текста в скрипте... Но не могли бы ещё подправить, если это не сложно и в принципе возможно - в названии папки не только наименование модели, но и наименование материала, а так же и аббревиатура "ЧПУ" или "DXF", что бы понятно было что в той папке.
То есть, примерно так : "DXF.*имя модели*.*наименование материала*"...
Извините что сразу не уточнил - всегда какие-то идеи приходят по ходу работы. Я бы не морочил Вам голову, если бы сам хоть чуточку в этих скриптах разбирался )...
__________________
Уж лучше беспокойство в сомнении, чем успокоенность в заблуждении. .
(Мандзони Алессандро)
------------------------------------
Троллей не кормлю...
Uncle вне форума   Ответить с цитированием Вверх
Пользователь сказал cпасибо:
Ovsyanicov (22.07.2019)
Старый 23.07.2019, 13:34   #457
v22884
Местный
 
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
v22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордится
По умолчанию

Цитата:
Сообщение от Uncle Посмотреть сообщение
То есть, примерно так : "DXF.*имя модели*.*наименование материала*"

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




//system.exec('c:/Windows/system32/cmd.exe', '/c md "'+ActiveFilePathNomenklatury()+'ЧПУ"')


$$FileName = Action.ModelFilename
system.log($$FileName)
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 GetFileName(fn)
{
fn=fn.replace(new RegExp( "/",'g') ,"_");
fn=fn.replace(new RegExp( "[|]",'g') ,"_");
fn=fn.replace(new RegExp( "/\/",'g') ,"_");
fn=fn.replace(new RegExp( "<",'g') ,"_");
fn=fn.replace(new RegExp( ">",'g') ,"_");
fn=fn.replace(new RegExp( '["]','g') ,"_");
fn=fn.replace(new RegExp( ":",'g') ,"_");
fn=fn.replace(new RegExp( "[?]",'g') ,"_");
fn=fn.replace(new RegExp( "[*]",'g') ,"_");
//fn=fn.replace(new RegExp( " ",'g') ," ");



return fn
}

function ActiveFilePathNomenklatury()
{

PathNomenklatury = $$FileName.lastIndexOf("\\Прямые")+ 1
// alert(PathNomenklatury)
if(PathNomenklatury>0)
{
PathNomenklatury = $$FileName.substring(0, PathNomenklatury);
}
else
{
PathNomenklatury = $$FileName.substring(0, $$FileName.lastIndexOf("\\") + 1)
}

return PathNomenklatury;
}


//system.exec('c:/Windows/system32/cmd.exe', '/c md "'+ActiveFilePathNomenklatury()+'ЧПУ"')


//и т.д. ..



VydelenniyeV_CNC()


function VydelenniyeV_CNC() {
var ar = [] //массив всех выделенных панелей
var OrigSel = []
for (i = 0; i < Model.SelectionCount; i++) {
if (!Model.Selections[i].AsPanel)
continue

OrigSel.push(Model.Selections[i])
}
for (i = 0; i < OrigSel.length; i++) {

if (OrigSel[i].ArtPos == "") {
alert("Расставь Позиции!");
return
}
p = OrigSel[i]


// -- DXF.*имя модели*.*наименование материала*


absolutNameAndPt = ActiveFilePathNomenklatury()+GetFileName("DXF."+Action.Control.Article.Name+'.'+p.MaterialName.toString().split("\r")[0])
var fs = require('fs');
var isExists = fs.existsSync(absolutNameAndPt); // можно проверить есть ли папка.
if(!isExists){
fs.mkdirSync(absolutNameAndPt); // создать папку, аргумент абсолютный путь.
}



tOr = p.TextureOrientation //0-нет, 1-гор, 2 - верт
if (tOr ==1)
{
cRotation = 90;
}
else{cRotation=0}



// alert(p.ArtPos+ ' -- ' +tOr)
//kh = p.ContourHeight
//kw = p.ContourWidth
//alert(kh+ ' -- ' +kw+ ' -- ' +tOr)
ap = [] // массив контуров панелИ
contourData = {}
contourData.Pos = p.ArtPos
c = p.Contour.MakeCopy()

c.Rotate(0, 0, cRotation);
contourData.absolutNameAndPt = absolutNameAndPt
contourData.c = c
sloyKontura = "Контур заготовки"
contourData.sloy= sloyKontura
ap.push(contourData);

for (ic = 0; ic < p.Cuts.Count; ic++) {
//alert( p.Cuts[ic].Name )
contourData = {}
contourData.Pos = p.ArtPos

//? для пазов выборки Тип = 2 ?
if (p.Cuts[ic].CutType===2)
{c = p.Cuts[ic].Contour.MakeCopy()}
else
{
c = p.Cuts[ic].Trajectory.MakeCopy()
}

c.Rotate(0, 0, cRotation);

contourData.c = c
var cutName = ""
if(p.Cuts[ic].Sign.toString().trim().length>0)
{

cutName = p.Cuts[ic].Sign
}
else
{
cutName = p.Cuts[ic].Name
}
system.log(cutName)
contourData.sloy=cutName
ap.push(contourData);
}
//--------------Слои отверстий
apO = sloiOtverstiy(p,cRotation)
var holesNames = apO[0]
var holesContours = apO[1]
for(io=0;io<holesNames.length;io++)
{
contourData = {}
contourData.Pos = p.ArtPos
contourData.c = holesContours[io]
contourData.sloy= holesNames[io]
ap.push(contourData);
}
//--------------Слои отверстий




ar.push(ap)
Model.Selections = OrigSel
}

for (var ia = 0; ia < ar.length; ia++) {
DXF(ar[ia])

}

for (i = 0; i < OrigSel.length; i++) {
OrigSel[i].Selected = true
}
}







function DXF(data) {

t1 = "0\nVISION3D DXF\n0\nSECTION\n2\nHEADER\n9\n$ACADVER\n 1\nAC1015\n 9\n$ACADMAINTVER\n 70\n6\n 9\n$DWGCODEPAGE\n 3\nANSI_1251\n 9\n$INSBASE\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 9\n$EXTMIN\n10\n0.0\n20\n0.0\n9\n$EXTMAX\n10\n1000.0\n20\n1000.0\n9\n$LINMIN\n10\n0.0\n20\n0.0\n9\n$LINMAX\n10\n1000.0\n20\n1000.0\n0\nENDSEC\n0\nSECTION\n2\nTABLES\n0\nTABLE\n2\nLTYPE\n70\n1\n0\nLTYPE\n2\nCONTINUOUS\n70\n64\n3\nSolid line\n72\n65\n73\n0\n40\n0.000000\n0\nENDTAB\n0\nTABLE\n2\n"
//alert(t1)
t2_doSloya = "LAYER\n70\n6\n0\nLAYER\n 5\n110D0\n330\n2\n100\nAcDbSymbolTableRecord\n100\nAcDbLayerTableRecord\n 2\n"
//alert(t2_doSloya)
t3_PosleSloya = "70\n64\n 62\n7\n 6\nCONTINUOUS\n0\n"
//alert(t3_PosleSloya)
t4_DoObjektov = "ENDTAB\n0\nTABLE\n2\nSTYLE\n70\n0\n0\nENDTAB\n0\nENDSEC\n0\nSECTION\n2\nBLOCKS\n0\nENDSEC\n0\nSECTION\n2\nENTITIES\n"
//alert(t4_DoObjektov)
l1_sloy = "0\nLINE\n 5\n110D1\n330\n1F\n100\nAcDbEntity\n 8\n"
//alert(l1_sloy)
l2_x1 = "6\nCONTINUOUS\n 62\n7\n370\n60\n100\nAcDbLine\n 10\n"
//alert(l2_x1)
l3_y1 = " 20\n"
l4_x2 = " 11\n"
l5_y2 = " 21\n"

a1_sloy = " 0\nARC\n 5\n110D2\n330\n1F\n100\nAcDbEntity\n 8\n"

a2_cX = " 6\nCONTINUOUS\n 62\n7\n370\n60\n100\nAcDbCircle\n 10\n"
//alert(a2_cX)

a3_cY = " 20\n"
a4_R = " 40\n"
a5_p1A = "100\nAcDbArc\n 50\n"
a6_p2A = " 51\n"


c1_sloy = "0\nCIRCLE\n 5\n110D3\n330\n1F\n100\nAcDbEntity\n 8\n"
c2_cX = "6\nCONTINUOUS\n 62\n7\n370\n60\n100\nAcDbCircle\n 10\n"
c3_cY = " 20\n"
c4_R = " 40\n"
kanec = "0\nENDSEC\n0\nEOF"


sloi = []
for(i=0;i< data.length;i++)
{
//alert('!!!'+data[i].sloy)
if(sloi.indexOf(data[i].sloy)== -1)
{
sloi.push(data[i].sloy)
}

}

tdxf = t1

for(i=0;i< sloi.length;i++)
{
tdxf = tdxf + t2_doSloya + sloi[i] + "\n" + t3_PosleSloya
}


tdxf = tdxf + t4_DoObjektov

for(ic=0;ic< data.length;ic++)
{
c = data[ic].c
sloy = data[ic].sloy
for (i = 0; i < c.Count; i++) {
if (c[i].ElType == 1) {
tdxf = tdxf + l1_sloy + sloy + "\n" + l2_x1 + c[i].Pos1.x + "\n" + l3_y1 + c[i].Pos1.y + "\n" + l4_x2 + c[i].Pos2.x + "\n" + l5_y2 + c[i].Pos2.y + "\n"
} else if (c[i].ElType == 2) {
p1A = c[i].Pos1Angle() * (180 / Math.PI)
p2A = c[i].Pos2Angle() * (180 / Math.PI)
if(!c[i].ArcDir)
{
pp=p1A
p1A = p2A
p2A = pp
}
//else {dir='1'}
tdxf = tdxf + a1_sloy + sloy + "\n" + a2_cX + c[i].Center.x + "\n" + a3_cY + c[i].Center.y + "\n" + a4_R + c[i].ArcRadius() + "\n" + a5_p1A + p1A + "\n" + a6_p2A + p2A + "\n"
} else if (c[i].ElType == 3) {
tdxf = tdxf + c1_sloy + sloy + "\n" + c2_cX + c[i].Center.x + "\n" + c3_cY + c[i].Center.y + "\n" + c4_R + c[i].CirRadius + "\n"
}
}
}
tdxf = tdxf + kanec

system.writeTextFile(data[0].absolutNameAndPt+'\\' + data[0].Pos + '.dxf', tdxf)
}











function sloiOtverstiy(p,cRotation)
{
fs = krepej(p)
var res22 = Dyriavim(fs,p)
return res22

}

function krepej(p)
{
if(!p.AsPanel) {return}
var ar = p.FindConnectedFasteners(p)
return ar
}

function Dyriavim(fs,p)
{
// alert(fs[0])

var holesContours = []
var holesNames = []

for(iif=0;iif<fs.length;iif++)
{
f=fs[iif]
// alert(f)
c = f.Holes;
var i = 0;
сk = f.Holes.Count;
//HoleCon = NewContour();

while (i < сk) {
hole = c[i]
if(!CheckHole(c[i],f, p)&&!CheckHole2(c[i],f, p))
{
i++
continue
}
if (CheckWithPanel(f.NToGlobal(c[i].Direction), p))
{
i++
continue
}

if (!GetPanelFace(hole, f, p))
{
i++
continue
}

if (c[i].Radius<1.9/2)
{
i++
continue
}




HolePosG = f.ToGlobal(c[i].Position);
p.Selected = false
HolePosG = p.ToObject(HolePosG)
if (c[i].Contour==null)
{
holeName = "o"+(c[i].Radius*2).toString()+"h"+HoleFaceDepth(c[i],f, p).toString()
var ihn = holesNames.indexOf(holeName)
if(ihn==-1)
{
holesNames.push(holeName)
HoleCon = NewContour()
holesContours.push(HoleCon)
} else
{
HoleCon = holesContours[ihn]
}

HoleCon.AddCircle(HolePosG.x, HolePosG.y, c[i].Radius)
}
else
{

holeName = "Qh"+HoleFaceDepth(c[i],f, p).toString()
var ihn = holesNames.indexOf(holeName)
if(ihn==-1)
{
holesNames.push(holeName)
HoleCon = holesContours.push(NewContour())
} else
{
HoleCon = holesContours[ihn]
}


HoleCon.AddList(c[i].Contour.MakeCopy());
HoleCon.Move(HolePosG.x, HolePosG.y)
}
i++
}


/*StartEditing(p)
Undo.Changing(p)
//StartEditing(p)
p.Contour.Subtraction(HoleCon);
system.log(p.ArtPos+ " -- "+p.Name)
p.Build()
*/

}
for(ic = 0;ic<holesContours.length;ic++)
{
holesContours[ic].Rotate(0, 0, cRotation);
}

var res22 = []
res22.push( holesNames)
res22.push(holesContours )
return res22
}






/**
* Определить пласть, с которой засверлено отверстие
* @returns {boolean} true - задняя пласть (-Z по ЛСК панели), false - передняя пласть (+Z по ЛСК панели)
* @param {*} hole Отверстие
* @param {Object3} fast Фурнитура, которой принадлежит отверстие
* @param {Panel} panel Панель
*/
function GetPanelFace(hole, fast, panel){
var lowz = panel.LowZ;
var highz = panel.HighZ;
// начальная точка отверстия в ЛСК панели по оси Z (ось пласти панели)
var holeStart = panel.ToObject(fast.ToGlobal(hole.Position)).z;
var lowd = Math.abs(holeStart - lowz);
var highd = Math.abs(holeStart - highz);
return lowd < highd;
}


function CheckHole2(hole,fast, panel){
for(id=1;id<20;id++)
{
if(CheckHole(hole,fast, panel,id/20))
{
return true
}
}
return false
}

function CheckHole(hole,fast, panel,delim){
var holeCenter = fast.ToGlobal({
x: hole.Position.x + hole.Direction.x * (hole.Depth * delim),
y: hole.Position.y + hole.Direction.y * (hole.Depth * delim),
z: hole.Position.z + hole.Direction.z * (hole.Depth * delim),
})
holeCenter = panel.ToObject(holeCenter);
return (holeCenter.x > panel.GMin.x) && (holeCenter.x < panel.GMax.x) &&
(holeCenter.y > panel.GMin.y) && (holeCenter.y < panel.GMax.y) &&
(holeCenter.z > panel.GMin.z) && (holeCenter.z < panel.GMax.z);
}


function Equals(n1, n2){
return Math.abs(n1 - n2) < 0.001;
}

function EqualsV(v1, v2) {
return Equals(v1.x, v2.x) &&
Equals(v1.y, v2.y) &&
Equals(v1.z, v2.z);
}

function CheckWithPanel(gDir, panel){
return (EqualsV(gDir, panel.NToGlobal(AxisX)) ||
EqualsV(gDir, panel.NToGlobal(Axis_X)) ||
EqualsV(gDir, panel.NToGlobal(AxisY)) ||
EqualsV(gDir, panel.NToGlobal(Axis_Y)))
}



/**
* Глубина отверстия в пласти панели
* @param {*} hole Отверстие
* @param {Object3} fast Фурнитура, которой принадлежит отверстие
* @param {Panel} panel Панель
*/
function HoleFaceDepth(hole, fast, panel){
// минимум и максимум панели
var pMin = panel.GMin.z, pMax = panel.GMax.z;
// начальная точка отверстия в ЛСК панели по оси Z (ось пласти панели)
var holeStart = panel.ToObject(fast.ToGlobal(hole.Position)).z;
// конечная точка отверстия в ЛСК панели по оси Z (ось пласти панели)
var holeEnd = panel.ToObject(fast.ToGlobal({
x: hole.Position.x + hole.Direction.x * hole.Depth,
y: hole.Position.y + hole.Direction.y * hole.Depth,
z: hole.Position.z + hole.Direction.z * hole.Depth
})).z;
// Если начальная координата больше конечной - меняем их местами
if (holeStart > holeEnd){
var swap = holeStart;
holeStart = holeEnd;
holeEnd = swap;
}
var result = Math.min(holeEnd, pMax) - Math.max(holeStart, pMin);
return Math.round(result*10)/10
}



//****----------------- Угол отверстия в пласть
function VectorDot(v1, v2) {
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
}
function VectorLength(v) {
return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z)
}

function VectorsAngle(v1, v2){
return Math.acos(VectorDot(v1, v2) / (VectorLength(v1) * VectorLength(v2))) * 180 / Math.PI
}


/// ------ Вызывать эту функцию -------------
function AngleBetweenHoleDirAndPanelFace(hole, fast, panel){
var pDir = panel.NToGlobal(AxisZ);
var hDir = fast.NToGlobal(hole.Direction);
return VectorsAngle(pDir, hDir);
}

//****----------------- Угол отверстия в пласть----------------


[свернуть]


Вроде работает.


Цитата:
Сообщение от Uncle Посмотреть сообщение
если бы сам хоть чуточку в этих скриптах разбирался )
Предлагаю начать с малого: Изучить Инструкцию Базис-софта "Моя первая тумбочка 2".
Займёт около часа. А дальше дело пойдёт.

Цитата:
Сообщение от Uncle Посмотреть сообщение
DXF.*имя модели*.*наименование материала*
Мы идём чуть другим путём: В папке модели Папка ЧПУ у всех моделей, а в папке Ч xml спецификация чертежей Базиса-Мебельщика, 1с читает xml и по количеству материала в документе 1с определяет какая позиция какого материала.
Муторновато и времени на код не мало, зато уже пару лет вполне себе эффективно работает.
v22884 вне форума   Ответить с цитированием Вверх
3 пользователя(ей) сказали cпасибо:
Letos (23.07.2019), Ovsyanicov (24.07.2019), Uncle (23.07.2019)
Старый 23.07.2019, 14:12   #458
Uncle
VIP
 
Аватар для Uncle
 
Регистрация: 31.10.2009
Адрес: Рівне. УкраЇна
Сообщений: 10,580
Сказал(а) спасибо: 14,588
Поблагодарили 20,026 раз(а) в 6,492 сообщениях
Вес репутации: 5258
Uncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспоримаUncle репутация неоспорима
По умолчанию

Цитата:
Сообщение от v22884 Посмотреть сообщение
Предлагаю начать с малого: Изучить Инструкцию Базис-софта "Моя первая тумбочка 2".
Займёт около часа. А дальше дело пойдёт.
Пробовал. Вроде смысл начинаю понимать... Но не более того. Искал другую информацию по скриптам. Но везде - для "начинающих". То есть, для тех кто хотя бы знаком с синтаксисом - где пробел, где скобки, где что. А я даже этого не понимаю. Смотрю на примеры в инструкции "Моя первая тумбочка-2", понять не могу откуда берутся скобки фигурные, почему такие пробелы большие, что значат те или иные символы... И это при том, что в школе у меня информатика была на отлично и программы на Бейсике писал без запинки (эх... когда же это было))..)...Короче нужно не для "начинающих", а для " нулевых" )...
Цитата:
Сообщение от v22884 Посмотреть сообщение
Мы идём чуть другим путём: В папке модели Папка ЧПУ у всех моделей, а в папке Ч xml спецификация чертежей Базиса-Мебельщика,
У меня нет 1С и этот скрипт немножко для других целей. По этому мне и нужно что бы разделяло по материалам.
Цитата:
Сообщение от v22884 Посмотреть сообщение
Вроде работает.
Да. Спасибо огромное !!!
__________________
Уж лучше беспокойство в сомнении, чем успокоенность в заблуждении. .
(Мандзони Алессандро)
------------------------------------
Троллей не кормлю...
Uncle вне форума   Ответить с цитированием Вверх
Старый 23.07.2019, 19:36   #459
IStiv
Пользователь
 
Регистрация: 02.12.2016
Сообщений: 84
Сказал(а) спасибо: 21
Поблагодарили 55 раз(а) в 27 сообщениях
Вес репутации: 109
IStiv скоро придёт к известности
По умолчанию

Цитата:
Сообщение от v22884 Посмотреть сообщение
[SPOILER]Вроде работает.
В качестве конструктивной критики. я тоже не проф.программист, но если пишете код, надо стремится делать это прилично, навык полезный.
мини ревью вообщем)

1. все подключения - в шапку скрипта.
никаких
PHP код:
var fs = require('fs'); 
посреди кода. все наверх.
2. все function - либо вверх от основного кода, либо вниз.
четкое разделение должно быть, основной код и функции. у Вас хаос.
3. все переменные явно объявляем VAR
4. конец строк в JS это ; - соблюдайте это . то что код выполняется - это Вам везет просто) , ну и JS так устроен.
5.
PHP код:
function VydelenniyeV_CNC() 
- никакой транслитерации(или как это называется. Нормально - это название функции на АНГЛИЙСКОМ .см. как LETOS функции названы и Ваши.
IStiv вне форума   Ответить с цитированием Вверх
4 пользователя(ей) сказали cпасибо:
Letos (24.07.2019), v22884 (24.07.2019), wizardpnz (23.07.2019), zzerg (24.07.2019)
Старый 24.07.2019, 01:54   #460
v22884
Местный
 
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
v22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордится
По умолчанию

Цитата:
Сообщение от IStiv Посмотреть сообщение
у Вас хаос.


Я полностью согласен со всеми замечаниями и советами. И благодарен за них. И нуждаюсь в них(искренне). Но...

Ты (извиняюсь если грубо) бы знал чувак в какой попе мира я обитаю и кому здеся это всё нужно. И кто мне за это платит. Для меня это что-то типа доброй воли, хобби и т.п. Хаос это что-то типа моего стиля.

Но советы и замечания правильные, полезные и я вот-вот начну им следовать(искренне).
Может быть когда таки за бесплатно перестану это делать.

Цитата:
Сообщение от IStiv Посмотреть сообщение
никакой транслитерации(или как это называется.
Я не нацист или фанатик, но чо это все языки программирования на английском?? Пусть учат Русский. Почему-то, если надо запустить станок например, должен учить .. китайский, немецкий, .. итальянский ...


DXF.
Добавлено/исправлено: не делались сквозные, если они начинались с другой стороны.
И не с той пласти делались глухие отверстия (т.е. панель получалась отражённой).

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






//system.exec('c:/Windows/system32/cmd.exe', '/c md "'+ActiveFilePathNomenklatury()+'ЧПУ"')


$$FileName = Action.ModelFilename
system.log($$FileName)
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
// alert(PathNomenklatury)
if(PathNomenklatury>0)
{
PathNomenklatury = $$FileName.substring(0, PathNomenklatury);
}
else
{
PathNomenklatury = $$FileName.substring(0, $$FileName.lastIndexOf("\\") + 1)
}

return PathNomenklatury;
}


//system.exec('c:/Windows/system32/cmd.exe', '/c md "'+ActiveFilePathNomenklatury()+'ЧПУ"')

absolutNameAndPt = ActiveFilePathNomenklatury()+'ЧПУ'

var isExists = fs.existsSync(absolutNameAndPt); // можно проверить есть ли папка.
if(!isExists){
fs.mkdirSync(absolutNameAndPt); // создать папку, аргумент абсолютный путь.
}


VydelenniyeV_CNC()


function VydelenniyeV_CNC() {
var ar = [] //массив всех выделенных панелей
var OrigSel = []
for (i = 0; i < Model.SelectionCount; i++) {
if (!Model.Selections[i].AsPanel)
continue

OrigSel.push(Model.Selections[i])
}
for (i = 0; i < OrigSel.length; i++) {

if (OrigSel[i].ArtPos == "") {
alert("Расставь Позиции!");
return
}
p = OrigSel[i]
tOr = p.TextureOrientation //0-нет, 1-гор, 2 - верт
if (tOr ==1)
{
cRotation = 90;
}
else{cRotation=0}



// alert(p.ArtPos+ ' -- ' +tOr)
//kh = p.ContourHeight
//kw = p.ContourWidth
//alert(kh+ ' -- ' +kw+ ' -- ' +tOr)
ap = [] // массив контуров панелИ
contourData = {}
contourData.Pos = p.ArtPos
c = p.Contour.MakeCopy()

c.Rotate(0, 0, cRotation);

contourData.c = c
sloyKontura = "Контур заготовки"
contourData.sloy= sloyKontura
ap.push(contourData);

for (ic = 0; ic < p.Cuts.Count; ic++) {
//alert( p.Cuts[ic].Name )
contourData = {}
contourData.Pos = p.ArtPos

//? для пазов выборки Тип = 2 ?
if (p.Cuts[ic].CutType===2)
{c = p.Cuts[ic].Contour.MakeCopy()}
else
{
c = p.Cuts[ic].Trajectory.MakeCopy()
}

c.Rotate(0, 0, cRotation);

contourData.c = c
var cutName = ""
if(p.Cuts[ic].Sign.toString().trim().length>0)
{

cutName = p.Cuts[ic].Sign
}
else
{
cutName = p.Cuts[ic].Name
}
system.log(cutName)
contourData.sloy=cutName
ap.push(contourData);
}
//--------------Слои отверстий
apO = sloiOtverstiy(p,cRotation)
var holesNames = apO[0]
var holesContours = apO[1]
for(io=0;io<holesNames.length;io++)
{
contourData = {}
contourData.Pos = p.ArtPos
contourData.c = holesContours[io]
contourData.sloy= holesNames[io]
ap.push(contourData);
}
//--------------Слои отверстий




ar.push(ap)
Model.Selections = OrigSel
}

for (var ia = 0; ia < ar.length; ia++) {
DXF(ar[ia])

}

for (i = 0; i < OrigSel.length; i++) {
OrigSel[i].Selected = true
}
}







function DXF(data) {

t1 = "0\nVISION3D DXF\n0\nSECTION\n2\nHEADER\n9\n$ACADVER\n 1\nAC1015\n 9\n$ACADMAINTVER\n 70\n6\n 9\n$DWGCODEPAGE\n 3\nANSI_1251\n 9\n$INSBASE\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 9\n$EXTMIN\n10\n0.0\n20\n0.0\n9\n$EXTMAX\n10\n1000.0\n20\n1000.0\n9\n$LINMIN\n10\n0.0\n20\n0.0\n9\n$LINMAX\n10\n1000.0\n20\n1000.0\n0\nENDSEC\n0\nSECTION\n2\nTABLES\n0\nTABLE\n2\nLTYPE\n70\n1\n0\nLTYPE\n2\nCONTINUOUS\n70\n64\n3\nSolid line\n72\n65\n73\n0\n40\n0.000000\n0\nENDTAB\n0\nTABLE\n2\n"
//alert(t1)
t2_doSloya = "LAYER\n70\n6\n0\nLAYER\n 5\n110D0\n330\n2\n100\nAcDbSymbolTableRecord\n100\nAcDbLayerTableRecord\n 2\n"
//alert(t2_doSloya)
t3_PosleSloya = "70\n64\n 62\n7\n 6\nCONTINUOUS\n0\n"
//alert(t3_PosleSloya)
t4_DoObjektov = "ENDTAB\n0\nTABLE\n2\nSTYLE\n70\n0\n0\nENDTAB\n0\nENDSEC\n0\nSECTION\n2\nBLOCKS\n0\nENDSEC\n0\nSECTION\n2\nENTITIES\n"
//alert(t4_DoObjektov)
l1_sloy = "0\nLINE\n 5\n110D1\n330\n1F\n100\nAcDbEntity\n 8\n"
//alert(l1_sloy)
l2_x1 = "6\nCONTINUOUS\n 62\n7\n370\n60\n100\nAcDbLine\n 10\n"
//alert(l2_x1)
l3_y1 = " 20\n"
l4_x2 = " 11\n"
l5_y2 = " 21\n"

a1_sloy = " 0\nARC\n 5\n110D2\n330\n1F\n100\nAcDbEntity\n 8\n"

a2_cX = " 6\nCONTINUOUS\n 62\n7\n370\n60\n100\nAcDbCircle\n 10\n"
//alert(a2_cX)

a3_cY = " 20\n"
a4_R = " 40\n"
a5_p1A = "100\nAcDbArc\n 50\n"
a6_p2A = " 51\n"


c1_sloy = "0\nCIRCLE\n 5\n110D3\n330\n1F\n100\nAcDbEntity\n 8\n"
c2_cX = "6\nCONTINUOUS\n 62\n7\n370\n60\n100\nAcDbCircle\n 10\n"
c3_cY = " 20\n"
c4_R = " 40\n"
kanec = "0\nENDSEC\n0\nEOF"


sloi = []
for(i=0;i< data.length;i++)
{
//alert('!!!'+data[i].sloy)
if(sloi.indexOf(data[i].sloy)== -1)
{
sloi.push(data[i].sloy)
}

}

tdxf = t1

for(i=0;i< sloi.length;i++)
{
tdxf = tdxf + t2_doSloya + sloi[i] + "\n" + t3_PosleSloya
}


tdxf = tdxf + t4_DoObjektov

for(ic=0;ic< data.length;ic++)
{
c = data[ic].c
sloy = data[ic].sloy
for (i = 0; i < c.Count; i++) {
if (c[i].ElType == 1) {
tdxf = tdxf + l1_sloy + sloy + "\n" + l2_x1 + c[i].Pos1.x + "\n" + l3_y1 + c[i].Pos1.y + "\n" + l4_x2 + c[i].Pos2.x + "\n" + l5_y2 + c[i].Pos2.y + "\n"
} else if (c[i].ElType == 2) {
p1A = c[i].Pos1Angle() * (180 / Math.PI)
p2A = c[i].Pos2Angle() * (180 / Math.PI)
if(!c[i].ArcDir)
{
pp=p1A
p1A = p2A
p2A = pp
}
//else {dir='1'}
tdxf = tdxf + a1_sloy + sloy + "\n" + a2_cX + c[i].Center.x + "\n" + a3_cY + c[i].Center.y + "\n" + a4_R + c[i].ArcRadius() + "\n" + a5_p1A + p1A + "\n" + a6_p2A + p2A + "\n"
} else if (c[i].ElType == 3) {
tdxf = tdxf + c1_sloy + sloy + "\n" + c2_cX + c[i].Center.x + "\n" + c3_cY + c[i].Center.y + "\n" + c4_R + c[i].CirRadius + "\n"
}
}
}
tdxf = tdxf + kanec

system.writeTextFile(ActiveFilePathNomenklatury()+ 'ЧПУ\\' + data[0].Pos + '.dxf', tdxf)
}











function sloiOtverstiy(p,cRotation)
{
fs = krepej(p)
var res22 = Dyriavim(fs,p)
return res22

}

function krepej(p)
{
if(!p.AsPanel) {return}
var ar = p.FindConnectedFasteners(p)
return ar
}

function Dyriavim(fs,p)
{
// alert(fs[0])

var holesContours = []
var holesNames = []

for(iif=0;iif<fs.length;iif++)
{
f=fs[iif]
// alert(f)
c = f.Holes;
var i = 0;
сk = f.Holes.Count;
//HoleCon = NewContour();

while (i < сk) {
hole = c[i]
if(!CheckHole(c[i],f, p)&&!CheckHole2(c[i],f, p))
{
i++
continue
}
if (CheckWithPanel(f.NToGlobal(c[i].Direction), p))
{
i++
continue
}
glubina = HoleFaceDepth(c[i],f, p)
system.log(p.Thickness)
if ((GetPanelFace(hole, f, p))&&(glubina<p.Thickness))
{
i++
continue
}

if (c[i].Radius<1.9/2)
{
i++
continue
}




HolePosG = f.ToGlobal(c[i].Position);
p.Selected = false
HolePosG = p.ToObject(HolePosG)
if (c[i].Contour==null)
{
holeName = "o"+(c[i].Radius*2).toString()+"h"+glubina.toString()
var ihn = holesNames.indexOf(holeName)
if(ihn==-1)
{
holesNames.push(holeName)
HoleCon = NewContour()
holesContours.push(HoleCon)
} else
{
HoleCon = holesContours[ihn]
}

HoleCon.AddCircle(HolePosG.x, HolePosG.y, c[i].Radius)
}
else
{

holeName = "Qh"+HoleFaceDepth(c[i],f, p).toString()
var ihn = holesNames.indexOf(holeName)
if(ihn==-1)
{
holesNames.push(holeName)
HoleCon = holesContours.push(NewContour())
} else
{
HoleCon = holesContours[ihn]
}


HoleCon.AddList(c[i].Contour.MakeCopy());
HoleCon.Move(HolePosG.x, HolePosG.y)
}
i++
}


/*StartEditing(p)
Undo.Changing(p)
//StartEditing(p)
p.Contour.Subtraction(HoleCon);
system.log(p.ArtPos+ " -- "+p.Name)
p.Build()
*/

}
for(ic = 0;ic<holesContours.length;ic++)
{
holesContours[ic].Rotate(0, 0, cRotation);
}

var res22 = []
res22.push( holesNames)
res22.push(holesContours )
return res22
}






/**
* Определить пласть, с которой засверлено отверстие
* @returns {boolean} true - задняя пласть (-Z по ЛСК панели), false - передняя пласть (+Z по ЛСК панели)
* @param {*} hole Отверстие
* @param {Object3} fast Фурнитура, которой принадлежит отверстие
* @param {Panel} panel Панель
*/
function GetPanelFace(hole, fast, panel){
var lowz = panel.LowZ;
var highz = panel.HighZ;
// начальная точка отверстия в ЛСК панели по оси Z (ось пласти панели)
var holeStart = panel.ToObject(fast.ToGlobal(hole.Position)).z;
var lowd = Math.abs(holeStart - lowz);
var highd = Math.abs(holeStart - highz);
return lowd < highd;
}


function CheckHole2(hole,fast, panel){
for(id=1;id<20;id++)
{
if(CheckHole(hole,fast, panel,id/20))
{
return true
}
}
return false
}

function CheckHole(hole,fast, panel,delim){
var holeCenter = fast.ToGlobal({
x: hole.Position.x + hole.Direction.x * (hole.Depth * delim),
y: hole.Position.y + hole.Direction.y * (hole.Depth * delim),
z: hole.Position.z + hole.Direction.z * (hole.Depth * delim),
})
holeCenter = panel.ToObject(holeCenter);
return (holeCenter.x > panel.GMin.x) && (holeCenter.x < panel.GMax.x) &&
(holeCenter.y > panel.GMin.y) && (holeCenter.y < panel.GMax.y) &&
(holeCenter.z > panel.GMin.z) && (holeCenter.z < panel.GMax.z);
}


function Equals(n1, n2){
return Math.abs(n1 - n2) < 0.001;
}

function EqualsV(v1, v2) {
return Equals(v1.x, v2.x) &&
Equals(v1.y, v2.y) &&
Equals(v1.z, v2.z);
}

function CheckWithPanel(gDir, panel){
return (EqualsV(gDir, panel.NToGlobal(AxisX)) ||
EqualsV(gDir, panel.NToGlobal(Axis_X)) ||
EqualsV(gDir, panel.NToGlobal(AxisY)) ||
EqualsV(gDir, panel.NToGlobal(Axis_Y)))
}



/**
* Глубина отверстия в пласти панели
* @param {*} hole Отверстие
* @param {Object3} fast Фурнитура, которой принадлежит отверстие
* @param {Panel} panel Панель
*/
function HoleFaceDepth(hole, fast, panel){
// минимум и максимум панели
var pMin = panel.GMin.z, pMax = panel.GMax.z;
// начальная точка отверстия в ЛСК панели по оси Z (ось пласти панели)
var holeStart = panel.ToObject(fast.ToGlobal(hole.Position)).z;
// конечная точка отверстия в ЛСК панели по оси Z (ось пласти панели)
var holeEnd = panel.ToObject(fast.ToGlobal({
x: hole.Position.x + hole.Direction.x * hole.Depth,
y: hole.Position.y + hole.Direction.y * hole.Depth,
z: hole.Position.z + hole.Direction.z * hole.Depth
})).z;
// Если начальная координата больше конечной - меняем их местами
if (holeStart > holeEnd){
var swap = holeStart;
holeStart = holeEnd;
holeEnd = swap;
}
var result = Math.min(holeEnd, pMax) - Math.max(holeStart, pMin);
return Math.round(result*10)/10
}



//****----------------- Угол отверстия в пласть
function VectorDot(v1, v2) {
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
}
function VectorLength(v) {
return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z)
}

function VectorsAngle(v1, v2){
return Math.acos(VectorDot(v1, v2) / (VectorLength(v1) * VectorLength(v2))) * 180 / Math.PI
}


/// ------ Вызывать эту функцию -------------
function AngleBetweenHoleDirAndPanelFace(hole, fast, panel){
var pDir = panel.NToGlobal(AxisZ);
var hDir = fast.NToGlobal(hole.Direction);
return VectorsAngle(pDir, hDir);
}

//****----------------- Угол отверстия в пласть----------------


[свернуть]

Последний раз редактировалось v22884; 24.07.2019 в 02:37.
v22884 вне форума   Ответить с цитированием Вверх
6 пользователя(ей) сказали cпасибо:
Ответ

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


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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Базис-Мебельщик 10 systland Базис-мебельщик 10 1264 13.03.2024 22:48
БАЗИС-Мебельщик 7.0 Shadow Базис-мебельщик 7 2230 29.11.2019 10:37
Базис-мебельщик JavaScript ran Ищу работу 0 09.05.2014 10:08


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


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

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