UnSelectAll();
Model.forEachPanel(function(obj) {
if (!obj.IsContourRectangle)
{
if (Triugilnik_Li(obj))
{
// obj.Selected = true;
} else
{
if (!Na4uglahTolkoFaski_i_SkrugleniyaNebolshe30mm(obj)) {
obj.Selected = true;
}
}
//obj.Selected = true;
}
})
function Triugilnik_Li(obj)
{
c = obj.Contour
ck = c.Count
if (ck == 3) {
for (i = 0; i < ck; i++) {
if (!(c[i].ElType == 1)) {
return false
}
}
return true
} else {
return false
}
}
function Na4uglahTolkoFaski_i_SkrugleniyaNebolshe30mm(obj)
{
c = obj.Contour
ck = c.Count
// маскимум элементов 8 (если конечно не ящик с фигурным вырезом вместо ручки)
//возвращаем да если нет кругов
//если есть 4 стороны соответствующие сторонам прямоугольного габарита панели
// если на углах этих сторон либо просто угол 90,
//либо фаска то есть 1 линия от одной стороны до другой стороны,
// либо 1 дуга радиусом не более 30мм от одной стороны до другой
if (ck > 8) {
// докодить случай с ящиком
return false
} else {
if (yestKrugi(obj)) {
return false
} else {
MassStoron = StoronyVdolPriamougolnika(obj)
Storony = MassStoron[0]
if (Storony.length == 4) {
if (tolkoFaski_i_SkrugleniyaDo30mm(c, MassStoron)) {
// alert('tolkoFaski_i_SkrugleniyaDo30mm')
return true
}
else
{
// return true
return false
}
}
}
return false
}
}
function tolkoFaski_i_SkrugleniyaDo30mm(c, MassStoron) {
//здесь у нас всегда 4 стороны
// но сколько дуг или линий между ними не известно
//поэтому надо однозначно убедится что
//в каждом углу не болеечем по 1линии или по 1 дуге
// чтоб убедиться что нет внутреннего триугольника или четырёхугольника
Storony = MassStoron[0]
StoronyGde = MassStoron[1]
ck = c.Count
kolichestvoPoschitannyhStoron = 4
lnpv = GabarityContura(obj);
ln = lnpv[0];
pv = lnpv[1];
//---------------------
lv_sostoyaniye = S_Uglom_Vsio_Horosho('verh', 'levo', NewPoint(ln.x, pv.y), ln, pv, c, MassStoron)
lv_ok = lv_sostoyaniye[0]
kolichestvoPoschitannyhStoron = kolichestvoPoschitannyhStoron + lv_sostoyaniye[1]
if (!lv_ok)
{
// alert('плохой контур')
return false
} else {
//---------------------
pv_sostoyaniye = S_Uglom_Vsio_Horosho('verh', 'pravo', pv, ln, pv, c, MassStoron)
pv_ok = pv_sostoyaniye[0]
kolichestvoPoschitannyhStoron = kolichestvoPoschitannyhStoron + pv_sostoyaniye[1]
if (!pv_ok)
{
// alert('плохой контур')
return false
} else {
//---------------------
ln_sostoyaniye = S_Uglom_Vsio_Horosho('niz', 'levo', ln, ln, pv, c, MassStoron)
ln_ok = ln_sostoyaniye[0]
kolichestvoPoschitannyhStoron = kolichestvoPoschitannyhStoron + ln_sostoyaniye[1]
if (!ln_ok)
{
// alert('плохой контур')
return false
} else {
//---------------------
pn_sostoyaniye = S_Uglom_Vsio_Horosho('niz', 'pravo', NewPoint(pv.x, ln.y), ln, pv, c, MassStoron)
pn_ok = pn_sostoyaniye[0]
kolichestvoPoschitannyhStoron = kolichestvoPoschitannyhStoron + pn_sostoyaniye[1]
if (!pn_ok)
{
// alert('плохой контур')
return false
} else {
if (ck==kolichestvoPoschitannyhStoron)
{
// alert('хороший контур')
return true
} else
{
// alert('плохой контур')
return false
}
}}}}
}
function S_Uglom_Vsio_Horosho(imia1, imia2, tochkaUgla, ln, pv, c, MassStoron) {
//левый верхний угол-------------------------
//берём сторону "верх"
//берём сторону "лево"
//проверяем не соеденены ли они по ближним к углу(в_лв,л_лв) поз1 или поз2
//если нет, то перебором элементов контура ищем по в_лв/л_лв точкам
// дугу или линию у которой и поз1 и поз2 должны быть соеденены
//с в_лв/л_лв
//если Дуга проверяем, что от угла контура в_лв/л_лв на равном расстоянии
//равном радиусу Дуги и и этот радиус не более 30мм.
// далее с остальными тремя углами также.
// ---не-ВСЁ!!! -- проверить все ли элементы контура проверели
// в контуре всё ещё могут пройти вариации из дуг и линий числом не больше 4
// поэтому надо посчитать не соеденённые под 90гр углы и сравнить их количество
//с количеством элементов контура
// теперь вроде всё...(пока)
Storony = MassStoron[0]
st1 = DayStoronu(MassStoron, imia1)
st2 = DayStoronu(MassStoron, imia2)
// alert(c + ' -- ' +st1+ ' - ' +st2 + ': ' + c[st1].Pos1.x + '; ' +c[st1].Pos1.y)
toshka_st1 = blijniaya(tochkaUgla, c[st1])
toshka_st2 = blijniaya(tochkaUgla, c[st2])
// alert(imia1+ ' - ' +imia2 + ': ' + toshka_st1.x + '; ' +toshka_st1.y)
sostoyaniye = [];
if (!((toshka_st1.x == toshka_st2.x) && (toshka_st1.y == toshka_st2.y))) {
// alert("Стороны не соеденены!")
//alert(el == c[Storony[0]])
if (soyedenenyLiLiniyey_ili_DugoyDo30mm(toshka_st1, toshka_st2, tochkaUgla, ln, pv))
//(!(el.x == c[Storony[0]])) && (!(el == c[Storony[1]]))
//&& (!(el == c[Storony[2]]))&& (!(el == c[Storony[3]])) )
{
sostoyaniye.push( true ,1)
return sostoyaniye
//return true
} else {
// return false
sostoyaniye.push( false ,0)
return sostoyaniye
}
} else {
sostoyaniye.push( true ,0)
return sostoyaniye
}
}
function soyedenenyLiLiniyey_ili_DugoyDo30mm(t1, t2, tochkaUgla, ln, pv) {
for (i = 0; i < ck; i++) {
el = c[i]
x1 = okr(el.Pos1.x)
x2 = okr(el.Pos2.x)
y1 = okr(el.Pos1.y)
y2 = okr(el.Pos2.y)
// p = AddPanel(50, 50)
// p.Translate(obj.ToGlobal(el.Pos1))
// p = AddPanel(50, 50)
// p.Translate(obj.ToGlobal(el.Pos2))
//alert(t1.x+ ' -- ' +t2.x+ ' -- ' +x1+ ' -- ' +x2)
//alert ((x2==t1.x && y2==t1.y))
if (((x1 == t1.x && y1 == t1.y) && (x2 == t2.x && y2 == t2.y)) || ((x2 == t1.x && y2 == t1.y) && (x1 == t2.x && y1 == t2.y))) {
//alert(el)
if (el.ElType == 2) {
rad = el.ArcRadius()
// alert(rad < 21)
if (rad > 30) {
return false
} else {
// предпологается что токое скругление всегда обычное сопряжение
//, а не какое-нибудь хитрое соединение дугой
//хотя конечно варианты лучше обработать: оно ж может быть и во внутрь!!!
if (obychnoyeLiSopriajeniye(el, t1, t2, tochkaUgla, ln, pv))
{ return true} else { return false}
}
} else {
return true
}
}
}
return false
}
function obychnoyeLiSopriajeniye(el, t1, t2, tochkaUgla, ln, pv)
{
rad = el.ArcRadius()
conturProverki = NewContour()
cp = conturProverki
cp.AddRectangle(ln.x, ln.y, pv.x, pv.y)
skrDuga = cp.Rounding(tochkaUgla.x, tochkaUgla.y, rad);
// alert(skrDuga)
// pp1 = AddPanel(0, 0)
// pp1.Contour.Clear()
// pp1.Contour.Addition(cp)
cX_el = okr(el.Center.x )
cY_el = okr(el.Center.y )
cX_skr = okr(skrDuga.Center.x )
cY_skr = okr(skrDuga.Center.y )
if (cX_el == cX_skr && cY_el == cY_skr)
{
return true
}
else {
return false
}
}
function blijniaya(tochkaKontura, storona) {
//здесь всегда storona - линия вдоль измерения x или y
xx = okr(tochkaKontura.x)
yy = okr(tochkaKontura.y)
x1 = okr(storona.Pos1.x)
x2 = okr(storona.Pos2.x)
y1 = okr(storona.Pos1.y)
y2 = okr(storona.Pos2.y)
// alert ('Здесь - '+xx + ' -- ' + x1+ ' -- ' + x2)
if (x1 == x2) {
x_ = x1
if (Math.abs(yy - y1) < Math.abs(yy - y2)) {
y_ = y1
} else {
y_ = y2
}
} else
y_ = y1
if (Math.abs(xx - x1) < Math.abs(xx - x2)) {
x_ = x1
} else {
x_ = x2
}
ppp = NewPoint(x_, y_)
return ppp
}
function DayStoronu(MassStoron, imia) {
Storony = MassStoron[0]
StoronyImia = MassStoron[1]
for (i = 0; i < Storony.length; i++) {
//alert( StoronyImia[i] +' - ' +imia + ' - ' + Storony[i]+ ' - ' +Storony.length)
if (StoronyImia[i] == imia) {
// alert( 'Возврат - ' + Storony[i])
return Storony[i]
}
}
alert("Какая-то ошибка!!!\n -- Нет такого имени в названиях сторон.")
}
function yestKrugi(obj) {
c = obj.Contour
ck = c.Count
for (i = 0; i < ck; i++) {
if ((c[i].ElType == 3)) {
return true
}
}
return false
}
function StoronyVdolPriamougolnika(obj) {
c = obj.Contour
ck = c.Count
w = c.Width
h = c.Hight
lnpv = GabarityContura(obj);
ln = lnpv[0];
pv = lnpv[1];
niz = okr(ln.y)
levo = okr(ln.x)
verh = okr(pv.y)
pravo = okr(pv.x)
Storony = [];
StoronyGde = [];
kl = 0
for (i = 0; i < ck; i++) {
if ((c[i].ElType == 1)) {
x1 = okr(c[i].Pos1.x)
x2 = okr(c[i].Pos2.x)
y1 = okr(c[i].Pos1.y)
y2 = okr(c[i].Pos2.y)
// alert(x1 +' -- ' + x2 +' -- ' + levo +'\n'+
// x1 +' -- ' + x2 +' -- ' + pravo +'\n'+
// y1 +' oo ' + y2 +' oo ' + verh +'\n'+
// y1 +' -- ' + y2 +' -- ' + niz )
//if (
if (x1 == x2 & x1 == levo) // |
{
StoronyGde.push('levo');
Storony.push(i);
kl = kl + 1
}
if (x1 == x2 & x1 == pravo) // | ==
{
StoronyGde.push('pravo');
Storony.push(i);
kl = kl + 1
}
if (y1 == y2 & y1 == verh) // |
{
StoronyGde.push('verh');
Storony.push(i);
kl = kl + 1
}
if (y1 == y2 & y1 == niz) // )
{
StoronyGde.push('niz');
Storony.push(i);
kl = kl + 1
}
}
}
// alert (kl)
massivy = [];
massivy.push(Storony);
massivy.push(StoronyGde);
return massivy
}
function okr(chislo) {
return Math.round(chislo * 10) / 10
}
function GabarityContura(Obj)
{
var text = '';
ln = NewPoint(0, 0); //левый низ
lv = NewPoint(0, 0); //левый верх
pn = NewPoint(0, 0); //правый низ
pv = NewPoint(0, 0); //правый верх контура
kontur = Obj.Contour;
kstoron = kontur.Count;
// var k_ne_krugov = 0;
for (i = 0; i < kstoron; i++) {
if (kontur[i].ElType != 3) { //k_ne_krugov = k_ne_krugov+1
ln = NewPoint(Math.round(kontur[i].Pos1.x * 10) / 10, Math.round(kontur[i].Pos1.y * 10) / 10);
lv = NewPoint(Math.round(kontur[i].Pos1.x * 10) / 10, Math.round(kontur[i].Pos1.y * 10) / 10);
pn = NewPoint(Math.round(kontur[i].Pos1.x * 10) / 10, Math.round(kontur[i].Pos1.y * 10) / 10);
pv = NewPoint(Math.round(kontur[i].Pos1.x * 10) / 10, Math.round(kontur[i].Pos1.y * 10) / 10);
}
};
for (i = 0; i < kstoron; i++) {
if (kontur[i].ElType != 3) {
Pos1x = Math.round(kontur[i].Pos1.x * 10) / 10;
Pos1y = Math.round(kontur[i].Pos1.y * 10) / 10;
Pos2x = Math.round(kontur[i].Pos2.x * 10) / 10;
Pos2y = Math.round(kontur[i].Pos2.y * 10) / 10;
if (ln.x > Pos1x) {
ln.x = Pos1x
};
if (ln.x > Pos2x) {
ln.x = Pos2x
};
if (ln.y > Pos1y) {
ln.y = Pos1y
};
if (ln.y > Pos2y) {
ln.y = Pos2y
};
if (lv.x > Pos1x) {
lv.x = Pos1x
};
if (lv.x > Pos2x) {
lv.x = Pos2x
};
if (lv.y < Pos1y) {
lv.y = Pos1y
};
if (lv.y < Pos2y) {
lv.y = Pos2y
};
if (pn.x < Pos1x) {
pn.x = Pos1x
};
if (pn.x < Pos2x) {
pn.x = Pos2x
};
if (pn.y > Pos1y) {
pn.y = Pos1y
};
if (pn.y > Pos2y) {
pn.y = Pos2y
};
if (pv.x < Pos1x) {
pv.x = Pos1x
};
if (pv.x < Pos2x) {
pv.x = Pos2x
};
if (pv.y < Pos1y) {
pv.y = Pos1y
};
if (pv.y < Pos2y) {
pv.y = Pos2y
};
}
};
text4 = ('ln ---- ' + ln.x + ' - ' + ln.y + '\n' +
'lv ---- ' + lv.x + ' - ' + lv.y + '\n' +
'pn ---- ' + pn.x + ' - ' + pn.y + '\n' +
'pv ---- ' + pv.x + ' - ' + pv.y + '\n');
// alert(text4);
ln_v = ln; //левый низ выреза
pv_v = pv; //правый верх выреза
if (ln_v.x < lv.x) {
ln_v.x = lv.x
};
if (ln_v.y < pn.y) {
ln_v.y = pn.y
};
if (pv_v.x > pn.x) {
pv_v.x = pn.x
};
if (pv_v.y > lv.y) {
pv_v.y = lv.y
};
SeredinaVisotiPaneli = (pv_v.y - ln_v.y) * 0.5;
SeredinaShiriniPaneli = (pv_v.x - ln_v.x) * 0.5;
lnpv = []
lnpv.push(ln_v);
lnpv.push(pv_v);
return lnpv
}
[свернуть]