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

DXF панели.
1) контур панели(пока без подрезки канта).
2) Пазы на отдельные слои по имени паза.
это уже было. Добавлено:
3) Отверстия
(пока только в пласть и перпендикулярные) на слои с именами вида o3h2.

СПАСИБО Letos и всем.

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











//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()+'ЧПУ"')



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) {
if(!CheckHole(c[i],f, p)&&!CheckHole2(c[i],f, p))
{
i++
continue
}
if (CheckWithPanel(f.NToGlobal(c[i].Direction), 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
}

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);
}

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








[свернуть]



1) выделить нужные панели
2) запустить скрипт.

создаёт в папке модели папку ЧПУ. Записывает в неё dxfы с именами позиций модели.

Иногда надо запустить 2 раза: видимо система не успевает создать папку ЧПУ. Кто знает как исправить буду рад рабочему коду.

чот не работает. только 1 деталь. щас исправлю.
ВРОДЕ ИСПРАВИЛ.

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