Форум профессиональных мебельщиков PROMEBELclub

Форум профессиональных мебельщиков PROMEBELclub (https://промебельклуб.рф/forum/index.php)
-   Базис-мебельщик. Скрипты (https://промебельклуб.рф/forum/forumdisplay.php?f=273)
-   -   БАЗИС 10 - Скрипты (https://промебельклуб.рф/forum/showthread.php?t=12463)

igor_medved 06.12.2018 11:04

Ovsyanicov,
Огромное спасибо!
Вообще их поддержка не вдохновила, задал вопрос по тому как считать ЛДСП шт а не кв.м, получил сухие ответы, например на форуме расписали этот вопрос по полочкам.

potomu4to 10.12.2018 10:37

Господа скрипто писатели, пожалуйста, кому не сложно сделайте скриптик чтоб на модели выделялись все детали с торцевыми отверстиями.

Letos 10.12.2018 14:43

Цитата:

Сообщение от potomu4to (Сообщение 468062)
Господа скрипто писатели, пожалуйста, кому не сложно сделайте скриптик чтоб на модели выделялись все детали с торцевыми отверстиями.

Сделано:

Код

Код:

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

potomu4to 10.12.2018 15:03

Цитата:

Сообщение от Letos (Сообщение 468074)
Проверял на параметрической фурнитуре (стяжки, евровинты), насчёт произвольной ничего сказать не могу. Если скрипт будет работать неправильно - приложите простой пример, спробуем разобраться.

Спасибо вам большое что помогли.Пока проблем не нашел, случай чего в личку напишу.

bbb i ko 25.12.2018 21:55

Вложений: 1
Что представляют из себя объекты импортированные из AutoCad? Можно ли при вести эти объекты к типу Panel? На всякий случай прикрепил импортированную модель.

Letos 26.12.2018 09:53

Цитата:

Сообщение от bbb i ko (Сообщение 468871)
Что представляют из себя объекты импортированные из AutoCad? Можно ли при вести эти объекты к типу Panel?

Импортированные 3д объекты представляют из себя TImportedMesh и просто так их к панели не приведёшь. Самый простой способ - анализировать треугольники объекта и на основе их данных создавать панель. Но это только для простых панелей просто. Обычная прямоугольная панель - 12 треугольников (по 2 треугольника на каждую плоскость). Одну линию контура заменил на дугу - всё, уже 212 треугольников. А если с пазами - так это вообще замучаешься.

KLIM_58 27.12.2018 11:00

Скрипт "Замена фурнитуры и блоков"
 
Добрый день. Интересует, есть ли скриптовая команда которая позволит запустить функцию БМ10 "Замена фурнитуры и блоков"? Цель следующая: на производство поступает файл в котором указанны изменения стандартного модуля, оператор запускает скрипт и автоматически производится замена параметров, указанных в файле.

Letos 27.12.2018 14:41

Цитата:

Сообщение от KLIM_58 (Сообщение 468936)
Добрый день. Интересует, есть ли скриптовая команда которая позволит запустить функцию БМ10 "Замена фурнитуры и блоков"? Цель следующая: на производство поступает файл в котором указанны изменения стандартного модуля, оператор запускает скрипт и автоматически производится замена параметров, указанных в файле.

Функция замены фурнитуры есть (Action.ReplaceFurniture), но второй параметр - массив объектов фурнитуры, а не строк. Но если серьёзно заморочиться, можно написать скрипт. Один из вариантов - сохранять информацию о фурнитуре в строку и использовать её (строку) для загрузки объекта фурнитуры в скрипте. Вот самый простой пример:
Код:

var furn = Action.Properties.NewFurnitureValue();
furn.Choose();
var furnStr = furn.EncodeToString();

В переменной furnStr будет строка, которую можно сохранить и потом использовать в скрипте замены. А для загрузки параметров фурнитуры из строки есть следующая функция:
Код:

furn.DecodeFromString(furnStr);
По поводу самой функции Action.ReplaceFurniture. У неё три параметра:
1. Старая фурнитура (массив строк)
2. Новая фурнитура (массив объектов фурнитуры (тип InfFurniture в подсказке))
3. Крепёж для замены (массив 3д объектов).

И одна загвоздка - первые два массива должны быть одинаковой длины, иначе не заработает замена.

fanest 10.01.2019 11:23

Уважаемые форумчане. Как-то коснулся задачи определения веса изделия. Был у меня скрипт (не помню автора), так в 9-ке работал отлично, но в 10-ке он не работает. Подскажите, где поправить?
Код:

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

Плотность = 0.68;

weight = 0;
spam = confirm ('Подсвечивать панели в процессе взвешивания?');

for (i=0; i<Model.Count; i++) {
Model.Objects [i].Selected = true;
// if (ispanel (Model.Objects [i].GSize.x, Model.Objects [i].GSize.y, Model.Objects [i].GSize.z)){
if (Model.Objects [i].AsPanel){
weight = weight +
(Model.Objects [i].GSize.x) *
(Model.Objects [i].GSize.y) *
(Model.Objects [i].GSize.z) / 1000 / 1000 * Плотность;
if (spam) { alert ('Панель взвешена'); }
}
Model.Objects [i].Selected = false;
}

alert ('Примерный вес изделия: ' + Math.round (weight) + 'кг');

function ispanel (a, b, c) {
aa = a;
bb = b;
cc = c;
if (aa > bb) {
t = aa;
aa = bb;
bb = t;
}
if (bb > cc) {
t = bb;
bb = cc;
cc = t;
}
if (aa > bb) {
t = aa;
aa = bb;
bb = t;
}
if ((aa < 50) && (bb > 50)) { return 1; }
else { return 0; }
}
[свернуть]

Letos 10.01.2019 12:11

Цитата:

Сообщение от fanest (Сообщение 469601)
Уважаемые форумчане. Как-то коснулся задачи определения веса изделия. Был у меня скрипт (не помню автора), так в 9-ке работал отлично, но в 10-ке он не работает. Подскажите, где поправить?
Код:

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

Плотность = 0.68;

weight = 0;
spam = confirm ('Подсвечивать панели в процессе взвешивания?');

for (i=0; i<Model.Count; i++) {
Model.Objects [i].Selected = true;
// if (ispanel (Model.Objects [i].GSize.x, Model.Objects [i].GSize.y, Model.Objects [i].GSize.z)){
if (Model.Objects [i].AsPanel){
weight = weight +
(Model.Objects [i].GSize.x) *
(Model.Objects [i].GSize.y) *
(Model.Objects [i].GSize.z) / 1000 / 1000 * Плотность;
if (spam) { alert ('Панель взвешена'); }
}
Model.Objects [i].Selected = false;
}

alert ('Примерный вес изделия: ' + Math.round (weight) + 'кг');

function ispanel (a, b, c) {
aa = a;
bb = b;
cc = c;
if (aa > bb) {
t = aa;
aa = bb;
bb = t;
}
if (bb > cc) {
t = bb;
bb = cc;
cc = t;
}
if (aa > bb) {
t = aa;
aa = bb;
bb = t;
}
if ((aa < 50) && (bb > 50)) { return 1; }
else { return 0; }
}
[свернуть]

А что не так со скриптом? У меня он запустился и выдал примерный вес. Сразу по скрипту могу сказать, что он считает вес только на корневом (верхнем) уровне модели, поэтому, если вес не совпадает, это можно исправить. А если не в этом дело, то опишите, что неправильно работает.
Если вообще не запускается, запустите через редактор скриптов и пришлите скриншот с тем, что записалось в лог редактора


Текущее время: 21:06. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
© 2007-2023 PROMEBEL