Model.forEachPanel(function (p) {
//AddCopy(p)
Undo.Changing(p); // укажем, что этот объект будет редактироваться
uporyadochitKonturSsohraneniyemKroma(p)
var cP = ConturPodrezan(p)
});
function uporyadochitKonturSsohraneniyemKroma(p) {
var bb = p.Butts
var masEl = []
for (var ib = 0; ib < bb.Count; ib++) {
var b = bb[ib]
var el = p.Contour[bb[ib].ElemIndex]
masEl.push(el.MakeCopy())
}
p.Contour.OrderContours()
p.Build()
for (var ib = 0; ib < bb.Count; ib++) {
var el0 = masEl[ib]
for (var ic = 0; ic < p.Contour.Count; ic++) {
if (geometry.Compare(el0.MakeCopy(), p.Contour[ic].MakeCopy())) {
bb[ib].ElemIndex = ic;
break
}
}
}
p.Build()
}
function ConturPodrezan(p) {
// p.Contour.OrderContours()
// p.Build()
var c = p.Contour
//наружные-внутренние.последовательности. последовательности с подрезкой.
// подрезку каждого элемента можно найти по середине элемента:
//Найти элемент, ближайший к точке с заданными координатами.
//Синтаксис:
//Find(x, y);
var c_ = NarVnuKontury(c)
nar = c_.nar
vnu = c_.vnu
for (var i = 0; i < nar.length; i++) {
var cn = nar[i]
posledovatelnostiPodrezki(cn, p, false)
//testC(cn)
}
for (var i = 0; i < vnu.length; i++) {
var cv = vnu[i]
// testC(cv)
posledovatelnostiPodrezki(cv, p, true)
}
var cP = NewContour()
return cP
}
function posledovatelnostiPodrezki(c0, p, vnutrenniy) {
//c0 -- отделённый от контура панели замкнутый контур наружный или внутренний.
//p.Contour.OrderContours()
//p.Build()
var bb = p.Butts
var cp = p.Contour.MakeCopy()
var arPodr = [] //цифры подрезки для всех индексов элементов c0
var arPosled = [] // контуры последовательностей с одинаковой подрезкой.
var arPodrPosled = [] //цифры подрезки последовательностей
var conPosled = NewContour()
var proshlayaPodr = 999
/*
массив точек соединений последовательностей ДО
и Массив ДВУХ точек соединений последовательностей после.
*/
mSPdo = [] // элемент точка до эквидистанты.
mSPposle = [] // элемент пара точек ПОСЛЕ эквидистант
mS_El = [] // элемент пара элементов соединения
var arPodrVichitaniyem = [] // контуры для вычитания из исходного контура
for (var i = 0; i < c0.Count; i++) {
el0 = c0[i]
// alert('00000'+'\n\n'+el0+'\n\n'+i)
// var elc = 0
for (var j = 0; j < cp.Count; j++) {
if (geometry.Compare(el0.MakeCopy(), cp[j].MakeCopy())) {
elc = cp[j]
// alert('----'+'\n\n'+elc+'\n\n'+el0+'\n\n'+j+'\n\n'+i)
break
}
}
// здесь контур упорядочен и замкнут и отдельный. Поэтому
//перебирая индексы с0 -- они последовательны.
var podr = 0
for (var ib = 0; ib < bb.Count; ib++) {
b = bb[ib]
if (bb[ib].ElemIndex == (j)) {
if (b.ClipPanel) {
podr += b.Thickness
// alert(elc+'\n\n'+podr+'\n\n'+j+'\n\n'+cp[bb[ib].ElemIndex])
system.log(elc + '\n\n' + podr + '\n\n' + j + '\n\n' + cp[bb[ib].ElemIndex])
}
}
}
arPodr.push(podr)
// перебираем элементы, берём все подрезки со всех кантов
// если это первый элемент добавляем в контур новой последовательности
// если величина подрезки та же что и в прошлом элементе -- добавляем в тот же контур последовательности
// если величина подрезки не ровна подрезке прошлого элемента -- текущий контур в массив, создаём новый контур
// если элемент последний
// если его подрезка отличается то новый контур и его в массив
// если его подрезка НЕ отличается то добавить в текущий контур и этот контур в массив
// первый/последний/ниПервыйНиПоследний, какПрошлая/другая
//continue
if (i == 0) {
proshlayaPodr = podr // для закидывания в массив величин подрезки
}
if (proshlayaPodr != podr) {
arPosled.push(conPosled)
arPodrPosled.push(proshlayaPodr)
conPosled = NewContour()
proshlayaPodr = podr
conPosled.Add(el0.MakeCopy())
}
else { conPosled.Add(el0.MakeCopy()) }
if (i == c0.Count - 1) {
arPosled.push(conPosled)
arPodrPosled.push(proshlayaPodr)
}
}
if (arPodrPosled.length > 1) {
if (arPodrPosled[0] == arPodrPosled[arPodrPosled.length - 1]) {
arPosled[0].AddList(arPosled[arPodrPosled.length - 1].MakeCopy())
arPosled.pop()
arPodrPosled.pop()
}
}
for (var i = 0; i < arPosled.length; i++) {
//testC(arPosled[i])
}
//return [arPodrPosled, arPosled]
//------------------------------------------------здесь готовы участки и величины подрезки
//-----------------------------------------Далее подрезаем
/*
Варианты подрезки:
1. 1 участок — 1 замкнутый контур.
1. Круг — контур из 1 элемента.
2. Несколько элементов.
Во всех этих вариантах делаем эквидистанту и проверяем для наружного контура эквидистанта должна стать меньше, для внутреннего — больше.
2. Несколько участков ► не замкнуты.
Далее надо определить направление эквидистанты для каждого участка. Варианты:
1. сделать эквидистанту и проверить с[0].Pos1 в контуре панели ли.
2. сделать эквидистанту и проверить с[0].Line/ArcCenter() в контуре панели ли.
Всегда предполагаем, что величина подрезки положительна, то есть контур будет уменьшаться, а не увеличиваться.
*/
if (arPosled.length == 1) {
var cPodr0 = arPosled[0].MakeCopy()
var podr = arPodrPosled[0]
cPodr0.OrderContours()
var napr = true
var c_Podr = NewContour()
c_Podr.AddEquidistant(cPodr0, podr, napr, false)
if ((podr > 0) &&
(((vnutrenniy) && (c_Podr.Width < cPodr0.Width))
||
((!vnutrenniy) && (c_Podr.Width > cPodr0.Width))
)
) {
napr = !napr
var c_Podr = NewContour()
c_Podr.AddEquidistant(cPodr0, podr, napr, false)
}
arPosled[0] = c_Podr.MakeCopy()
//arPodrVichitaniyem.push(c_Podr)
}
else {
for (var i = 0; i < arPosled.length; i++) {
// if(arPodrPosled[i]==0) {continue}
mSPdo.push(arPosled[i].Pos1)
/*
для последовательностей которые нужно подрезать, т. е. с подрезкой >0
можно сделать эквидистанту подрезки и эквидистанту в другую сторону на 0.1мм.
потом !!СОЕДЕНИТЬ В ЗАМКНУТЫЙ КОНТУР И ВЫЧЕСТЬ!! его из исходного
*/
var podr = arPodrPosled[i]
if (podr != 0) // если величина подрезки не равна 0
{
/* if(el0.IsCircle()){
var napr = false
}
else
{
var napr = !vnutrenniy
}
*/
// ---------------------- 2. сделать эквидистанту и проверить с[0].Line/ArcCenter() в контуре панели ли.
var napr = false
var c_Podr0 = NewContour()
c_Podr0.AddEquidistant(arPosled[i], arPodrPosled[i], napr, false)
var c_Podr = NewContour()
c_Podr.AddEquidistant(c_Podr0, 0, napr, false)
// var c_Podr2 = NewContour()// ПОЧЕМУ-ТО эквидистанта разворачивает направление, чтоб вернуть направление ещё раз еквидистанта с отстпупом 0.
// c_Podr2.AddEquidistant(c_Podr,0,false,false)
// var c_Podr = c_Podr2.MakeCopy()
// Проверим в ту ли сторону качнулась эквидистанта:
// IsInContour() не даёт стабильные результаты ►
// проверим каждую срендую и первую точку всех элементов последовательности IsPointInside()
// ----- большинство точек внутри ли или снаружи. !!! -----------------------
var da = 0 // ------------- не работает на прямоугольнике!!!!!!!
var net = 0
for (var it = 0; it < c_Podr.Count; it++) {
var elT = c_Podr[it].ElType
if (elT == 1) {
var testP = c_Podr[it].LineCenter()
}
else if (elT == 2) {
var testP = c_Podr[it].ArcCenter()
}
var testP2 = c_Podr[it].Pos1
if (podr > 0) // ? лучше бы проверить до цикла ?
{
if (!vnutrenniy) {
if (c0.IsPointInside(testP)) { da += 1 }
else { net += 1 }
/*
if(c0.IsPointInside(testP2))
{ da += 1 }
else{net += 1 }
*/
}
else if (vnutrenniy) {
if (c0.IsPointInside(testP)) { net += 1 }
else { da += 1 }
/*
if(c0.IsPointInside(testP2))
{ net += 1 }
else{da += 1 }
*/
}
}
}
if (da < net)
/*
if((podr>0)&& // ? лучше бы проверить до цикла ?
(((vnutrenniy)&&(c_Podr.IsInContour(c0)))
||
((!vnutrenniy)&&(!c_Podr.IsInContour(c0)))
)
)*/ {
napr = !napr
var c_Podr0 = NewContour()
c_Podr0.AddEquidistant(arPosled[i], arPodrPosled[i], napr, false)
var c_Podr = NewContour()
c_Podr.AddEquidistant(c_Podr0, 0, napr, false)
}
//25,02,2024
// !!! ЕСЛИ прямоугольная панель и 1 кант "СВЕРХУ" ИЛИ 1 кант "СПРАВА" -- ЭКВИДИСТАНТА НЕ В ТУ СТОРОНУ ???
// ?ПО ИТОГУ ПЕРЕДВИГАЕТ НЕ ТУ ТОЧКУ ЭЛЕМЕНТА БЕЗ ПОДРЕЗКИ.?
//либо эквидистанта не в ту сторону, либо не определяет что контуры пересечены когда
// ДА ЭКВИДИДИСТАНТА РАЗВОРАЧИВАЕТ ПОЧЕМУ-ТО 1) левую сторону, 2) верх 3) лево и верх.
//ОКАЗАЛОСЬ ЕЩЁ ТЯЖЕЛЕЕ: Выдернув элемент в эквидистанту последовательность остатка не "последовательна":
// первый элемент, потом дырка, а потом остаток. А должно быть от первого до последнего безразрыва -- последовательно соеденены.
// Вариант решения перепроверить последовательную соеденённость. И в случае "не последовательности" -- перестроить.
/* var c_Podr0 = NewContour()
c_Podr0.AddList(c_Podr.MakeCopy())
var c_Podr = NewContour()
c_Podr.AddEquidistant(c_Podr0, 0, !napr, false)
*/
// c_Podr.InvertDirection()
arPosled[i] = c_Podr.MakeCopy()
//------------------------------------ до сюда с вероятностью 99,999% имеем последовательности эквидистант
//---------------------- Далее их надо собрать в замкнутый контур
if (arPosled.length == 1) {
p.Contour.Clear()
p.Contour.AddList(arPosled[0].MakeCopy())
}
//11,02,24 --- до сюда всё работает
// ------------------------- осталось соединить последовательности
else {
}
}
}
//
}
for (var i = 0; i < arPosled.length; i++) {
ispravitPosledovatelnost(arPosled[i])
}
var cSoyed = NewContour()
for (var i = 0; i < arPosled.length-1; i++) {
//testC(arPosled[i])
posl1 = arPosled[i]
posl2 = arPosled[i+1]
p1 = posl1[posl1.Count-1].Pos2
p2 = posl2[0].Pos1
mSPposle.push([p1,p2])
mS_El.push([posl1[posl1.Count-1],posl2[0]])
cSoyed.AddLine(p1,p2)
}
//testC(arPosled[arPosled.length-1])
posl1 = arPosled[arPosled.length-1]
posl2 = arPosled[0]
p1 = posl1[posl1.Count-1].Pos2
p2 = posl2[0].Pos1
mSPposle.push([p1,p2])
mS_El.push([posl1[posl1.Count-1],posl2[0]])
cSoyed.AddLine(p1,p2)
//testC(cSoyed)
if (arPosled.length > 1) {
for (var i = 0; i < arPosled.length-1; i++) {
var p1_podr = arPodrPosled[i]
var p1_con = arPosled[i]
//p1_con.OrderContours()
//test2(p1_con)
var p2_podr = arPodrPosled[i+1]
var p2_con = arPosled[i+1]
soyedinitPosledovatelnosti(p1_con,p1_podr,p2_con,p2_podr,arPosled.length,mSPdo[i],mSPposle[i],mS_El[i])
}
var i = arPosled.length-1
var p1_podr = arPodrPosled[i]
var p1_con = arPosled[i]
//p1_con.OrderContours()
//test2(p1_con)
var p2_podr = arPodrPosled[0]
var p2_con = arPosled[0]
soyedinitPosledovatelnosti(p1_con,p1_podr,p2_con,p2_podr,arPosled.length,mSPdo[i],mSPposle[i],mS_El[i])
}
var konturPodrezan = NewContour()
for (var i = 0; i < arPosled.length; i++) {
//arPosled[i].InvertDirection()
//test2(arPosled[i])
konturPodrezan.AddList(arPosled[i].MakeCopy())
}
//pp00 = AddPanel(10,10)
pp00 =AddCopy(p)
cp00 = pp00.Contour
cp00.Clear()
cp00.AddList(konturPodrezan.MakeCopy())
}
function ispravitPosledovatelnost(c)
{
if(c.Count ==1){return}
posledovatelny = true
for(var i=0;i<c.Count-1;i++)
{
var e1 = c[i]
var e2 = c[i+1]
var p1 = e1.Pos2
var p2 = e2.Pos1
if(!((Math.round(p1.x*100000)==Math.round(p2.x*100000))
&&(Math.round(p1.y*100000)==Math.round(p2.y*100000))))
{
posledovatelny = false
break
}
}
if(posledovatelny){return}
var e0 = e2.MakeCopy() // элемент на котором закончили -- первый
c.OrderContours()
var p1 = e0.Pos1
var p2 = c[0].Pos1
if(!((p1.x==p2.x)&&(p1.y==p2.y)))
{
c.InvertDirection()
}
// ещё раз проверим на всякий случай.
posledovatelny = true
for(var i=0;i<c.Count-1;i++)
{
var e1 = c[i]
var e2 = c[i+1]
var p1 = e1.Pos2
var p2 = e2.Pos1
if(!((p1.x==p2.x)&&(p1.y==p2.y)))
{
posledovatelny = false
break
}
}
if(posledovatelny)
{return}
else
{
alert("Не удалось сделать последовательным контур!!! Возможно два обрыва." )
test2(c,"Возможно два обрыва.")
}
}
function soyedinitPosledovatelnosti(c1,podr1,c2,podr2, vsegoPodrezok,SPdo,mSPposle,mS_El) {
var rasst = Math.abs (podr1-podr2)
var e1= mS_El[0]
var e2= mS_El[1]
var e1p2 = mSPposle[0] // конец соединения первого элемента
var e2p1 = mSPposle[1] // конец соединения второго элемента
ai = geometry.Intersect(e1, e2)
if(ai.length==1)//пересекаются 1 раз -- Перерисовать оба
{
c1[c1.Count-1].Pos2 = ai[0]
c2[0].Pos1 = ai[0]
}
else if(ai.length>1)//пересекаются более 1 раза --Взять ближайшее пересечение к изначальной точке пересечения SPdo, и Перерисовать оба
{
alert(ai.length+'++++++++')
}
else//не пересекаются
{
/*
2. Соседние элементы соседних последовательностей не пересекаются. -- Попробовать продлить оба и посмотреть через какое расстояние пересекаются,
1. если «???не очень большое», то перерисовать до точки пересечения.
2. Если «?большое», то ? Соединить линией?.
*/
// alert(ai.length)
var e1 = c1[c1.Count - 1]
var e2 = c2[0]
var dist = rasst + 1
var dist = 20
if (e1.ElType == 1) {
var angle = e1.LineAngle() * 180 / Math.PI
} else if (e1.ElType == 2) {
var angle = (e1.Pos2Angle() * 180 / Math.PI) - 90
}
var ctest = NewContour()
ltest = ctest.AddLine(NewPoint(-dist, 0), NewPoint(dist, 0))
ctest.Rotate(0, 0, angle)
ctest.Move(e1.Pos2.x, e1.Pos2.y)
//testC(ctest)
var test3 = NewContour()
test3.Add (ctest[0].MakeCopy())
ai = geometry.Intersect(test3[0], e2)
if (ai.length==1) // если продление e1 пересекается с исходным e2.
{
if (e1.ElType == 1) {
//c1[c1.Count-1].Pos2 = ai[0]
c1[c1.Count-1].Pos2 = ai[0]
c2[0].Pos1 = ai[0]
} else if (e1.ElType == 2) {
// если дуга -- в итоговую последовательно добавить линию от конца дуги до пересечения,
// но после всех циклов чтоб не нарушать последовательность элементов.
// ************* !!!!! МОЖНО ПОКА перенести точку. По идее не должно ЗНАЧИТЕЛЬНО исказить линию
//c1[c1.Count-1].Pos2 = ai[0]
c1[c1.Count-1].Pos2 = ai[0]
c2[0].Pos1 = ai[0]
}
}
else // если пересечения не достигли -- проверяем продление е2 с оригинальным е1
{
if (e2.ElType == 1) {
var angle = e2.LineAngle() * 180 / Math.PI
} else if (e2.ElType == 2) {
var angle = (e2.Pos1Angle() * 180 / Math.PI) - 90
}
system.log(angle)
var ctest2 = NewContour()
ltest2 = ctest2.AddLine(NewPoint(-dist, 0), NewPoint(dist, 0))
ctest2.Rotate(0, 0, angle)
ctest2.Move(e2.Pos1.x, e2.Pos1.y)
//testC(ctest2)
//Action.Commit()
test4 = NewContour()
test4.Add(ctest2[0].MakeCopy())
//test3.Add(ctest2[0].MakeCopy())
// testC(test4)
ai = geometry.Intersect(e1, test4[0])
if (ai.length==1) // если продление e2 пересекается с исходным e1.
{
if (e2.ElType == 1) {
//c2[0].Pos1 = ai[0]
c1[c1.Count-1].Pos2 = ai[0]
c2[0].Pos1 = ai[0]
} else if (e2.ElType == 2) {
// если дуга -- в итоговую последовательно добавить линию от конца дуги до пересечения,
// но после всех циклов чтоб не нарушать последовательность элементов.
// ************* !!!!! МОЖНО ПОКА перенести точку. По идее не должно ЗНАЧИТЕЛЬНО исказить линию
//c2[0].Pos1 = ai[0]
c1[c1.Count-1].Pos2 = ai[0]
c2[0].Pos1 = ai[0]
}
}
else // если пересечения не достигли -- проверяем продление е1 с продлением е2
{
ai = geometry.Intersect(test3[0], test4[0])
//-----------------------------------------------------------------------111111111111
if(ai.length==1)
{
c1[c1.Count-1].Pos2 = ai[0]
c2[0].Pos1 = ai[0]
}
else if(ai.length>1)//пересекаются более 1 раза --Взять ближайшее пересечение к изначальной точке пересечения SPdo, и Перерисовать оба
{
alert(ai.length+'-----')
}
else//не пересекаются
{
alert(ai.length+'-----!!!')
}
}
}
}
/*
Соединить последовательности.
1. Определять соседние концы по расстоянию между ними = подрезка одного - подрезка другого. Не 100%, но 99,99999 -- достаточно.
2. Варианты соединения:
1. Соседние элементы соседних последовательностей пересекаются( всегда предполагаем только 1 раз). -- Перерисовать оба.
2. Соседние элементы соседних последовательностей не пересекаются. -- Попробовать продлить оба и посмотреть через какое расстояние пересекаются,
1. если «???не очень большое», то перерисовать до точки пересечения.
2. Если «?большое», то ? Соединить линией?.
3. Точка одного находится на другом. -- перерисовать на котором точка.
*/
/*
1. Определять соседние концы по расстоянию между ними = подрезка одного - подрезка другого. Не 100%, но 99,99999 -- достаточно.
? заранее не известно соединять ли п1эZ c п2э1 .
Надо определить элементы обоих последовательностей
это могут быть только э1 и эz(первый или последний элементы последовательностей)
то есть надо перебрать 4 варианта: определить расстояние
1) п1э1 и п2э1
1) п1э1 и п2эz
1) п1эz и п2э1
1) п1эz и п2эz.
тогда проблема: если последовательностей всего 2, тогда совпадет не правильный вариант.
? Тогда надо рассматривать этот случай индивидуально.
*/
/*
if (vsegoPodrezok==2)
{
}
else{
rasst = Math.abs (podr1-podr2)
c1e0 = c1[0]
c2e0 = c2[0]
c1eZ = c1[c1.Count-1]
c2eZ = c2[c2.Count-1]
//------------
c1e0p1 = c1e0.Pos1
c1e0p2 = c1e0.Pos2
c2e0p1 = c2e0.Pos1
c2e0p2 = c2e0.Pos2
//----
c1eZp1 = c1eZ.Pos1
c1eZp2 = c1eZ.Pos2
c2eZp1 = c2eZ.Pos1
c2eZp2 = c2eZ.Pos2
//---
massPos = []
massPos.push([c1e0p1,c2e0p1, c1e0,'1',c2e0,'1'])
massPos.push([c1e0p1,c2e0p2, c1e0,'1',c2e0,'2'])
massPos.push([c1e0p2,c2e0p1, c1e0,'2',c2e0,'1'])
massPos.push([c1e0p2,c2e0p2, c1e0,'2',c2e0,'2'])
massPos.push([c1eZp1,c2e0p1, c1eZ,'1',c2e0,'1'])
massPos.push([c1eZp1,c2e0p2, c1eZ,'1',c2e0,'2'])
massPos.push([c1eZp2,c2e0p1, c1eZ,'2',c2e0,'1'])
massPos.push([c1eZp2,c2e0p2, c1eZ,'2',c2e0,'2'])
//---
massPos.push([c1e0p1,c2eZp1, c1e0,'1',c2eZ,'1'])
massPos.push([c1e0p1,c2eZp2, c1e0,'1',c2eZ,'2'])
massPos.push([c1e0p2,c2eZp1, c1e0,'2',c2eZ,'1'])
massPos.push([c1e0p2,c2eZp2, c1e0,'2',c2eZ,'2'])
massPos.push([c1eZp1,c2eZp1, c1eZ,'1',c2eZ,'1'])
massPos.push([c1eZp1,c2eZp2, c1eZ,'1',c2eZ,'2'])
massPos.push([c1eZp2,c2eZp1, c1eZ,'2',c2eZ,'1'])
massPos.push([c1eZp2,c2eZp2, c1eZ,'2',c2eZ,'2'])
//--
for(var i=0;i<massPos.length;i++)
{
var p1 = massPos[i][0]
var p2 = massPos[i][1]
rasst2 = Distance(p1, p2)
if(rasst2==rasst)
{
var el1 = massPos[i][2]
var el2 = massPos[i][4]
ai = geometry.Intersect(el1, el2)
if(ai.length==1)//пересекаются 1 раз
{
}
else if(ai.length>1)
{
}
else//не пересекаются
{
}
*/
/*
Варианты соединения:
1. Соседние элементы соседних последовательностей пересекаются( всегда предполагаем только 1 раз). -- Перерисовать оба.
2. Соседние элементы соседних последовательностей не пересекаются. -- Попробовать продлить оба и посмотреть через какое расстояние пересекаются,
1. если «???не очень большое», то перерисовать до точки пересечения.
2. Если «?большое», то ? Соединить линией?.
3. Точка одного находится на другом. -- перерисовать на котором точка.
*/
/* el2 = c2[c2.Count-1]
rasst2 = geometry.Distance(el1,el2)
if(rasst2>rasst)
{
alert("Ошибка программы. Делай Базисом-ЧПУ.")
throw "stop"
}
*/
/*}
}
}*/
}
function test2(c, name = '') {
var ctest = NewContour()
var rad = 3
for (var ii = 0; ii < c.Count; ii++) {
el000 = c[ii]
if (el000.IsLine()) { pp = el000.LineCenter() }
else if (el000.IsArc()) { pp = el000.ArcCenter() }
ctest.AddCircle(pp, rad)
rad += 5
}
testC(ctest)
testC(c, name )
}
function testC(c00, name = '') {
var c0 = AddContour()
c0.Name = name
var c = c0.Contour
c.AddList(c00.MakeCopy())
return c0
}
function NarVnuKontury(c) {
var contours = FindClosedContours(c);
var messages = ['Найдено ' + contours.length + ' контуров'];
for (var k = 0; k < contours.length; k++)
messages.push('Длина контура ' + k + ' = ' + contours[k].ObjLength());
//alert(messages.join('\r\n'));
var vnutr = 0
var avnu = []
var naruj = 0
var anar = []
var cnar = []
var cvnu = []
c_nar = NewContour()
c_vnu = NewContour()
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)
cvnu.push(contours[k])
c_vnu.AddList(contours[k].MakeCopy())
} else {
naruj = naruj + 1
anar.push(k)
cnar.push(contours[k])
c_nar.AddList(contours[k].MakeCopy())
}
// 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++) {
panlel_c = []
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])) {
panlel_c.push(contours[i])
}
}
}
panleli_c.push(panlel_c)
}
var messages = ['Найдено ' + panleli_c.length + ' панелей'];
for (var i = 0; i < panleli_c.length; i++) {
messages.push('У панели ' + i + ' -- ' + panleli_c[i].length + ' контуров\r\n')
}
system.log(messages.join('\r\n'));
c_ = {}
c_.vnu = cvnu
c_.nar = cnar
return c_
}
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;
}
//sdelat(p)
function sdelat(p) {
cp = p.Contour
cp.OrderContours(true)
bb = p.Butts
pcon = cp.MakeCopy()
for (i = 0; i < bb.Count; i++) {
if (bb[i].ClipPanel) {
PodrezatKrom(bb[i], pcon)
}
}
c1 = AddContour('Контур')
c1.Name = 'Контур'
c1.Contour.AddList(pcon.MakeCopy())
}
function PodrezatKrom(b, pcon) {
offset = b.Thickness
el = pcon[b.ElemIndex]
co = NewContour()
co.AddCopy(el)
c = NewContour()
c.AddEquidistant(co, offset, false, false)
pel = c[0]
system.log(pel.ElType)
pcon.Add(c[0])
}
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 TochkaLiniiNaRasstoyaniiOtTochki(p1,p2,dist)
{
Rac = dist
Xa = p1.x
Xb = p2.x
Ya = p1.y
Yb = p2.y
Rab = Math.sqrt(Math.pow((Xb - Xa), 2) + Math.pow((Yb - Ya) , 2))
k = Rac / Rab
Xc = Xa + (Xb - Xa) * k
Yc = Ya + (Yb - Ya) * k
/*
Имеется отрезок AB с координатами A(Xa, Ya) и B(Xb, Yb).
Требуется найти координаты точки C(Xc, Yc), лежащей на отрезке AB на расстоянии Rac от точки A.
-------------------------------------------------
Rab = sqrt((Xb - Xa) ^ 2 + (Yb - Ya) ^ 2)
k = Rac / Rab
Xc = Xa + (Xb - Xa) * k
Yc = Ya + (Yb - Ya) * k
-------------------------------------------------
Обозначения:
f ^ n - возведение f в степень n, в нашем случае (первом) f будет Xb - Xa и n будет 2.
sqrt(f) - квадратный корень из f, в нашем случае f будет (Xb - Xa) ^ 2 + (Yb - Ya) ^ 2.
f / n - деление f на n, в нашем случае f будет Rac и n будет Rab.
f * n - умножение f на n, в нашем случае (первом) f будет Xb - Xa и n будет k.
*/
return NewPoint(Xc, Yc)
}
[свернуть]