Показать сообщение отдельно
Старый 10.12.2018, 14:43   #313
Letos
Консультант
 
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
Letos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордится
По умолчанию

Цитата:
Сообщение от 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
В очередной раз поправил последствия копипасты. До этого не было проверки равности направления отверстия с направлением +У панели, поэтому не все панели могли выделяться.

Последний раз редактировалось Letos; 21.12.2018 в 11:33. Причина: Поправил в очередной раз код
Letos вне форума   Ответить с цитированием Вверх
12 пользователя(ей) сказали cпасибо: