|
|
|
|
|
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..
|
Просмотров: 436375
|
06.05.2019, 03:56
|
#401
|
Местный
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
|
Подскажите, пожалуйста, команду
Цвет необлицованных кромок ?
Задать цвет, цветом материала.
Последний раз редактировалось v22884; 06.05.2019 в 07:17.
|
|
|
06.05.2019, 11:56
|
#402
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от IStiv
интресно , попробовал подумать об этой задаче не "в лоб" , прикольно бы было делать какой нибудь HTTP запрос из Базиса, а он бы возвращал площадь или библиотеку из NODE репозитория.
по первому варианту , нашел API правда оно платное, но площади пишут что считать умеют, правда из STL.
https://github.com/pushkarparanjpe/m...3D-API-clients
а вот еще, Базис ведь использует C3D ядро, наверное у него есть уже готовые методы для расчета площадей, просто он в JS API не "торчат".
@Letos как думаете варианты выше юзабельны?
|
С HTTP-запросами я игрался и там есть одна проблема - создать всё это можно, но HTTP приём/отправка делается через асинхронные функции (как таймауты), а все асинхронные функции работают в БМ криво: - Если в теле скрипта сделать приём-отправку, то БМ зависнет, пока все асинхронные функции не завершатся. Под спойлером пример - запуск таймера, который пишет в лог каждую секунду. На 21-й секунде таймер принудительно грохается, чтобы не повесить БМ насовсем (но все равно перед запуском скрипта лучше сохранить несохранённое)
Код
PHP код:
var timers = require('timers');
var count = 0;
var interval = timers.setInterval(()=>{
count++;
system.log(count);
if (count > 20){
timers.clearInterval(interval);
}
}, 1000);
[свернуть]
- Если сделать приём-отправку в обработчике после выполнения тела скрипта - код асинхронного вызова не выполнится. Пример - на обработчике кнопки в свойствах повесить запуск интервала из кода сверху. При нажатии на кнопку обработчик в интервале не вызовется и в лог ничего не будет выводиться.Аккуратнее - у меня после отмены выполнения этого скрипта вышел AccessVioaltion at node.dll.
Код
PHP код:
Action.Continue();
Action.Properties.NewButton('Click').OnClick = function(){
var timers = require('timers');
var count = 0;
var interval = timers.setInterval(()=>{
count++;
system.log(count);
if (count > 20){
timers.clearInterval(interval);
}
}, 1000);
}
[свернуть]
- В последний момент подумал завернуть обработчик интервала с первого примера в Action.AsyncExec(). Результат - БМ наглухо повис. Ниже пример как НЕ стоит делать:
Код
PHP код:
var timers = require('timers');
var count = 0;
function NewTick(){
Action.AsyncExec(AsyncTick);
}
var interval = timers.setInterval(NewTick, 1000);
function AsyncTick(){
count++;
system.log(count);
if (count > 20){
timers.clearInterval(interval);
}
}
[свернуть]
Через отладчик посмотрел - всегда приходит на NewTick(), но никогда не приходит на AsyncTick(). Видимо, интервал своим выполнением блокирует выполнение Action.AsyncExec(), поэтому и виснет.
Остаётся лишь надеяться, что когда-нибудь и это будет вместе с возможностью стрелять себе в ногу более изощрённо
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
06.05.2019, 12:08
|
#403
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от v22884
Подскажите, пожалуйста, команду
Цвет необлицованных кромок ?
Задать цвет, цветом материала.
|
А что за Цвет необлицованных кромок? Я просто с этим параметром не сталкивался, поэтому интересно, где его можно найти, задать вручную.
|
|
|
Пользователь сказал cпасибо:
|
|
06.05.2019, 13:51
|
#404
|
Местный
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
|
Цитата:
Сообщение от Letos
А что за Цвет необлицованных кромок? Я просто с этим параметром не сталкивался, поэтому интересно, где его можно найти, задать вручную.
|
Для удобства визуального контроля что окантовали, а что нет.
|
|
|
06.05.2019, 15:16
|
#405
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от v22884
Для удобства визуального контроля что окантовали, а что нет.
|
Кнопка, которую вы ищете, называется "BtnDefButtMaterial", добывается так:
PHP код:
var mainForm = Action.Control.Owner.Owner;
var btn = mainForm.FindComponent('BtnDefButtMaterial');
НО:
btn.ExecuteAction(), btn.UpdateAction() возвращают false (может, так и надо?) и никаких других функций (типа сэмулировать нажатие) нет. Отсюда делаю вывод, что скриптом нажать эту кнопку не получится.
Бонусом код, который выводит список контролов, компонентов и тд (хотя вроде уже было на форуме подобное). Рекомендую функцию "AddComponents", который выводит древовидный список компонентов (для главной формы список около 1500 компонентов) с проверкой, что Owner соответствует тому объекту, который передавался в функцию.
Код
PHP код:
const filename = 'components.txt'
var content = '';
var mainForm = Action.Control.Owner.Owner;
if (mainForm){
for (var i = 0; i < mainForm.ComponentCount; i++){
content += mainForm.Components[i].Name + '\n'
}
}
content += '==========================================================\n';
function AddComponents(ctrl, tabs){
for (var i = 0; i < ctrl.ComponentCount; i++){
subCtrl = ctrl.Components[i];
if (subCtrl.Owner == ctrl){
content += '\t'.repeat(tabs) + subCtrl.Name + '\n';
AddComponents(subCtrl, tabs + 1);
}
}
}
AddComponents(mainForm, 0);
content += '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n';
function AddControls(ctrl, tabs){
for (var i = 0; i < ctrl.ControlCount; i++){
subCtrl = ctrl.Controls[i];
content += '\t'.repeat(tabs) + subCtrl.Name + '\n';
AddControls(subCtrl, tabs + 1);
}
}
AddControls(mainForm, 0);
// AddControls(mainForm.Owner);
require('fs').writeFileSync(filename, content);
[свернуть]
|
|
|
5 пользователя(ей) сказали cпасибо:
|
|
08.05.2019, 11:43
|
#406
|
VIP
Регистрация: 04.07.2012
Сообщений: 1,957
Сказал(а) спасибо: 3,992
Поблагодарили 3,545 раз(а) в 1,167 сообщениях
Вес репутации: 1048
|
Цитата:
Сообщение от Letos
Попытался сделать пример подсчёта площади поверхности для выделенного объекта
|
а как сделать обход выделенных объектов? получается если мы выделяем корневой элемент, то результат выполнения скрипта = 0:
если элемент в структуре, то считается площадь:
__________________
Автоматизация автоматизаций на АСУ, ТП и тд и тп..
Комплексное решение
|
|
|
08.05.2019, 14:27
|
#407
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от bbb i ko
а как сделать обход выделенных объектов?
|
Можно так:
PHP код:
//Обработка объекта или вложенных объектов.
function ProcessObject(obj){
if (obj.List){
for (var i = 0; i < obj.AsList().Count; i++){
ProcessObject(obj[i]);
}
}
else
DoSomething(obj); // функция, которая что-то делает с выделенным объектом
}
for (var i = 0; i < Model.SelectionCount; i++){
var obj = Model.Selections[i];
ProcessObject(obj);
}
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
08.05.2019, 20:10
|
#408
|
VIP
Регистрация: 04.07.2012
Сообщений: 1,957
Сказал(а) спасибо: 3,992
Поблагодарили 3,545 раз(а) в 1,167 сообщениях
Вес репутации: 1048
|
А как можно воспользоваться данным скриптом для пользовательского параметра?
что в пользовательском параметре будет представлять из себя Obj=Model.Selections[i]?
Пробовал так:
var obj = Panel; // работает только для объектов построенных панелью, не видит профилей и прочего
var obj = Object3/Extrusion; // не видит ни панелей, ни профилей .. ничего
__________________
Автоматизация автоматизаций на АСУ, ТП и тд и тп..
Комплексное решение
|
|
|
09.05.2019, 14:39
|
#409
|
Пользователь
Регистрация: 02.12.2016
Сообщений: 84
Сказал(а) спасибо: 21
Поблагодарили 55 раз(а) в 27 сообщениях
Вес репутации: 109
|
Цитата:
Сообщение от bbb i ko
А как можно воспользоваться данным скриптом для пользовательского параметра?
что в пользовательском параметре будет представлять из себя Obj=Model.Selections[i]?
Пробовал так:
var obj = Panel; // работает только для объектов построенных панелью, не видит профилей и прочего
var obj = Object3/Extrusion; // не видит ни панелей, ни профилей .. ничего
|
эм...что есть пользовательский параметр?
я под этим могу предствить две вещи:
- данные от юзера(например из формы) - они пишутся в переменную.
- UserProp - который можно навешать на объект базиса.
для обхода и сортировки по типам , я использую такой код
PHP код:
if (obj instanceof TFurnPanel) {
// че то делаем
}
которым можно определить тип Панель или блок или профиль.
|
|
|
09.05.2019, 14:53
|
#410
|
VIP
Регистрация: 04.07.2012
Сообщений: 1,957
Сказал(а) спасибо: 3,992
Поблагодарили 3,545 раз(а) в 1,167 сообщениях
Вес репутации: 1048
|
Цитата:
Сообщение от IStiv
эм...что есть пользовательский параметр?
|
Пользовательские параметры - есть такой справочник в Смете. Параметрами определяются объемы операций, соответственно, есть предустановленные параметры, а есть пользовательские - где вы можете создать свой параметр и использовать его для определения объема операции. В данном случае хочу сделать такой параметр, который будет определять площадь поверхности объекта.
__________________
Автоматизация автоматизаций на АСУ, ТП и тд и тп..
Комплексное решение
|
|
|
|
|
|
Нижняя навигация
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 13:17. Часовой пояс GMT +3.
|