|
|
|
|
|
06.06.2017, 08:56
|
|
БАЗИС 10 - Скрипты
systland
VIP
Регистрация: 30.10.2007
Адрес: Москва
Сообщений: 565
Сказал(а) спасибо: 303
Поблагодарили 451 раз(а) в 189 сообщениях
06.06.2017, 08:56
Рейтинг:
()
Обмениваемся , задаем вопросы, отвечаем... Все, что касается скриптов в БМ 10 в этой теме.
Последний раз редактировалось systland; 26.12.2017 в 11:52..
|
Просмотров: 436278
|
15.03.2019, 13:05
|
#371
|
Новичок
Регистрация: 26.02.2019
Сообщений: 14
Сказал(а) спасибо: 7
Поблагодарили 3 раз(а) в 2 сообщениях
Вес репутации: 0
|
Здравствуйте,
Подскажите, есть панель, как определить, какие стороны покрыты кромкой, такой вариант не работает:
PHP код:
for (i = 0; i < Panel.Contour.Count; i++) { if (Panel.Contour.Butts) { ... } }
|
|
|
15.03.2019, 14:47
|
#372
|
VIP
Регистрация: 03.09.2008
Сообщений: 174
Сказал(а) спасибо: 34
Поблагодарили 794 раз(а) в 113 сообщениях
Вес репутации: 367
|
Цитата:
Сообщение от Miracle01
Подскажите, есть панель, как определить, какие стороны покрыты кромкой
|
В примере для определенного элемента при наличии кромки/кромок возвращается их массив.
Код
Код HTML:
var Panel = Model.Selected.AsPanel;
function GetButtsOnElement(Panel, ElemIndex) {
var List = new Array();
for (var i = 0; i < Panel.Butts.Count; i++) {
if (ElemIndex == Panel.Butts[i].ElemIndex) {
List.push(Panel.Butts[i]);
};
};
if (List.length) {
return List;
} else {
return false;
};
};
for (var i = 0; i < Panel.Contour.Count; i++) {
system.log(GetButtsOnElement(Panel, i));
};
[свернуть]
|
|
|
3 пользователя(ей) сказали cпасибо:
|
|
16.03.2019, 10:10
|
#373
|
Новичок
Регистрация: 26.02.2019
Сообщений: 14
Сказал(а) спасибо: 7
Поблагодарили 3 раз(а) в 2 сообщениях
Вес репутации: 0
|
Подскажите пожалуйста, как найти градусы всех углов панели, при этом учесть и количество закруглений? Заранее, спасибо за помощь.
|
|
|
16.03.2019, 10:31
|
#374
|
Пользователь
Регистрация: 02.12.2016
Сообщений: 84
Сказал(а) спасибо: 21
Поблагодарили 55 раз(а) в 27 сообщениях
Вес репутации: 109
|
Цитата:
Сообщение от Miracle01
Подскажите пожалуйста, как найти градусы всех углов панели, при этом учесть и количество закруглений? Заранее, спасибо за помощь.
|
возможно Вам поможет.
не знаю что есть "градусы" возможно тут понадобиться знание тригонометрии.
в целом чтобы подойти к этому вопросу, нужно сперва получить контур панели, а потом что то делать с 2D элементами.
PHP код:
var pn = AddPanel();
var isRectngl = pn.IsContourRectangle;// панель прямоугольная?
var panelCntr = pn.Contour;// конутр панели
var cntrLines = panelCntr.Objects;//все элементы контура
var isArc = cntrLines[0].IsArc;// это дуга?
P.S. см. в отладчике VS CODE подсказки по методам/свойствам контура панели и элементов.
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
16.03.2019, 19:06
|
#375
|
Пользователь
Регистрация: 02.12.2016
Сообщений: 84
Сказал(а) спасибо: 21
Поблагодарили 55 раз(а) в 27 сообщениях
Вес репутации: 109
|
1.
PHP код:
Model.Load(path);
возвращает boolean.
А как получить доступ к элементам которые загрузились после Load?
понятно что можно использовать.
PHP код:
Model.Find(name);
однако я не знаю имени. а там блок и мне надо его получить после Load в обработку.
2.
PHP код:
ElasticResize({});
а можно как то получить параметры "эластика" у блока?
т.е. x.max/x.min/steep ? т.е. мне нужно прочитать имеющиеся настройки
|
|
|
18.03.2019, 10:25
|
#376
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от Miracle01
Подскажите пожалуйста, как найти градусы всех углов панели, при этом учесть и количество закруглений? Заранее, спасибо за помощь.
|
Дополню ответ товарища IStiv. Под спойлером код, который для выделенной панели считает углы между отрезками и выводит информацию об углах в лог редактора скриптов(!). Также считает кол-во дуг и в конце скрипта выводит сообщение о кол-ве дуг. Попытался снабдить код максимальным количеством комментариев, чтобы было лучше понятно, что для чего используется.
Код
PHP код:
//Вычисление длины вектора
function VLength(v) {
return Math.sqrt(v.x * v.x + v.y * v.y);
}
// Панель для анализа - выделенный объект
// Если выделенный объект не панель, то следующее условие отсеет объект и скрипт завершится
var p = Model.Selected.AsPanel;
if (p) {
var cnt = p.Contour; // контур панели
/**предыдущая линия */
var prevLine = cnt.Objects[cnt.Count - 1];
// Если объект не линия, то обнуляем переменную
if (!prevLine.IsLine()) {
prevLine = undefined;
}
/**Кол-во дуг в контуре */
var arcCount = 0;
for (var i = 0; i < cnt.Count; i++) {
/**Текущий элемент контура в цикле */
var o = cnt.Objects[i];
if (o.IsLine()) { //Проверяем, что элемент - линия
if (prevLine) { // Если существует предыдущая линия, значит можем вычислить угол между линиями
var line = prevLine.AsLine();
/** первый вектор */
var v1 = {
x: line.Pos1.x - line.Pos2.x,
y: line.Pos1.y - line.Pos2.y
}
line = o.AsLine();
/** второй вектор */
var v2 = {
x: line.Pos1.x - line.Pos2.x,
y: line.Pos1.y - line.Pos2.y
}
// Косинус угла между двумя векторами равен скалярному произведению
// векторов, делённому на произведение длин векторов.
var cosA = (v1.x * v2.x + v1.y * v2.y) / (VLength(v1) * VLength(v2));
// Арккосинус возвращает угол в радианах
var rad = Math.acos(cosA);
// Переводим угол в градусы
var deg = rad * 180 / Math.PI;
// Вывод сообщения о величине угла
system.log(`Угол между ${cnt.IndexOf(prevLine)} и ${i} элементами равен ${deg} град.`);
}
// В следующей итерации цикла предыдущей линией будет текущий элемент
prevLine = o;
}
else { // если элемент не линия
// В следующей итерации цикла предыдущей линии не будет, т.к.
// текущий элемент - не линия
prevLine = undefined;
// Если элемент - дуга, увеличиваем значение в переменной кол-ва дуг.
if (o.IsArc()){
arcCount++;
}
}
}
}
// Вывод информации о кол-ве дуг
alert(`кол-во дуг в контуре: ${arcCount}`);
[свернуть]
|
|
|
3 пользователя(ей) сказали cпасибо:
|
|
18.03.2019, 10:54
|
#377
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от IStiv
1.
PHP код:
Model.Load(path);
возвращает boolean.
А как получить доступ к элементам которые загрузились после Load?
понятно что можно использовать.
PHP код:
Model.Find(name);
однако я не знаю имени. а там блок и мне надо его получить после Load в обработку.
2.
PHP код:
ElasticResize({});
а можно как то получить параметры "эластика" у блока?
т.е. x.max/x.min/steep ? т.е. мне нужно прочитать имеющиеся настройки
|
1. Model.Load загружает в модель объекты из файла. Думаю, лучше создать скриптом блок и в него загружать из файла:
PHP код:
AddBlock('Name').Load(path)
Для приведённого вами примера небольшой скрипт: загружает файл и для каждого загруженного корневого объекта (которые в загруженной модели были в корне) выводит сообщение с его именем. Также, обратите внимание на "Undo.Added". Это сообщает в историю, что был добавлен объект, ибо Базис автоматически этого не делает (почему я и рекомендовал способ выше, чтобы не морочаться с историей).
PHP код:
var cnt = Model.Count;
Model.Load('D:\\test.b3d');
for (var i = cnt; i < Model.Count; i++) {
var obj = Model.Objects[i];
Undo.Added(obj);
alert(obj.Name);
}
2. Эластичность записана в параметрах объекта, но там дофига в отладчике покопаться надо, чтобы разобраться, откуда что доставать.
Вот пример, как получить ноду с описанием плоскостей эластичности:
PHP код:
var node = block.ParamSectionNode('Elastic', False);
var planesNode = node.Find('Planes');
|
|
|
5 пользователя(ей) сказали cпасибо:
|
|
20.03.2019, 16:01
|
#378
|
Местный
Регистрация: 18.02.2008
Адрес: Санкт-Петербург
Сообщений: 508
Сказал(а) спасибо: 531
Поблагодарили 401 раз(а) в 127 сообщениях
Вес репутации: 327
|
Добрый день.А возможно или уже есть скрипт которые предположим по виду спереди поставить размеры между полками ?
Типа такого чтоб получилось.
__________________
|
|
|
20.03.2019, 20:38
|
#379
|
Местный
Регистрация: 02.07.2011
Сообщений: 191
Сказал(а) спасибо: 93
Поблагодарили 105 раз(а) в 44 сообщениях
Вес репутации: 196
|
Цитата:
Сообщение от Igor_482
В примере для определенного элемента при наличии кромки/кромок возвращается их массив.
Код
Код HTML:
var Panel = Model.Selected.AsPanel;
function GetButtsOnElement(Panel, ElemIndex) {
var List = new Array();
for (var i = 0; i < Panel.Butts.Count; i++) {
if (ElemIndex == Panel.Butts[i].ElemIndex) {
List.push(Panel.Butts[i]);
};
};
if (List.length) {
return List;
} else {
return false;
};
};
for (var i = 0; i < Panel.Contour.Count; i++) {
system.log(GetButtsOnElement(Panel, i));
};
[свернуть]
|
а как определить какая сторона покрыта кромкой если панель квадратная? я имею ввиду если облицована одна сторона то длина кромки будет равняться и длине и ширине детали, как понять кромить по длине или по ширине?
|
|
|
21.03.2019, 16:37
|
#380
|
Новичок
Регистрация: 26.02.2019
Сообщений: 14
Сказал(а) спасибо: 7
Поблагодарили 3 раз(а) в 2 сообщениях
Вес репутации: 0
|
Здравствуйте,
Подскажите, как найти различия нанесения кромки на детали, если кромка нанесена на радиусный объект одним отрезом, то для сметы параметр
n=Panel.Butts.Count; уже не корректен, отсюда вопрос, как определить кромку нанесенную одним отрезом на радиус/деталь/участок. Чтобы затем в смете правильно посчитать её. Либо как определить, что это отрезок кромки...
PHP код:
if (Panel.Butts) { n=Panel.Butts.Count; //Количество кромок, но если кромка нанесена одним отрезком на радиусную деталь, то считается не верно for (i=0; i<Panel.Butts.Count; i++){ //Анализ по кромкам на панели var butt = Panel.Butts.Butts[i]; var elem = Panel.Contour.Objects[butt.ElemIndex];//элемент контура, на котором кромка Result += (elem.ObjLength() + butt.Overhung)/1000;//Длина элемента контура + Значение свеса кромки } }
Result =Result/n;
|
|
|
|
|
|
Нижняя навигация
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 10:10. Часовой пояс GMT +3.
|