Цитата:
Сообщение от potomu4to
Господа скрипто писатели, пожалуйста, кому не сложно сделайте скриптик чтоб на модели выделялись все детали с торцевыми отверстиями.
|
Сделано:
Код
Код:
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)))
}
function CheckHole(hole, fast, panel){
var holeCenter = fast.ToGlobal({
x: hole.Position.x + hole.Direction.x * (hole.Depth / 2),
y: hole.Position.y + hole.Direction.y * (hole.Depth / 2),
z: hole.Position.z + hole.Direction.z * (hole.Depth / 2),
})
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);
}
Model.UnSelectAll();
Model.forEachPanel(function (panel) {
var fasts = panel.FindConnectedFasteners();
for (var i = 0; i < fasts.length; i++) {
var fast = fasts[i];
var holes = fast.Holes;
if (holes && holes.Count > 0) {
for (var j = 0; j < holes.Count; j++) {
var hole = holes[j];
if (CheckWithPanel(fast.NToGlobal(hole.Direction), panel) &&
CheckHole(hole, fast, panel)){
panel.Selected = true;
break;
}
}
}
else {
fastDir = fast.NToGlobal(AxisX);
if (CheckWithPanel(fastDir, panel))
panel.Selected = true;
}
}
})
[свернуть]
Проверял на параметрической фурнитуре (стяжки, евровинты), насчёт произвольной ничего сказать не могу. Если скрипт будет работать неправильно - приложите простой пример, спробуем разобраться.
Обновление 15:09
Поправил код. Добавил сравнение с точностью 0.001 - из-за погрешностей в числах с плавающей точкой могли не выделяться панели.
Обновление 15:22
В очередной раз поправил код. Исправил ошибку, что проверка равности векторов была только по оси Х
Обновление 21.12.18 11:30
В очередной раз поправил последствия копипасты. До этого не было проверки равности направления отверстия с направлением +У панели, поэтому не все панели могли выделяться.