|
|
|
|
|
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..
|
Просмотров: 433557
|
09.05.2019, 16:22
|
#411
|
Пользователь
Регистрация: 02.12.2016
Сообщений: 84
Сказал(а) спасибо: 21
Поблагодарили 55 раз(а) в 27 сообщениях
Вес репутации: 109
|
Цитата:
Сообщение от bbb i ko
В данном случае хочу сделать такой параметр, который будет определять площадь поверхности объекта.
|
Параметры навешиваются так:
PHP код:
let startPropsName = "name";
obj.UserPropertyName = startPropsName;// создаем параметр
obj.UserProperty[startPropsName] = 1; // пишем инфу
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
12.05.2019, 00:15
|
#412
|
VIP
Регистрация: 04.07.2012
Сообщений: 1,956
Сказал(а) спасибо: 3,990
Поблагодарили 3,545 раз(а) в 1,167 сообщениях
Вес репутации: 1048
|
речь не пользовательских свойствах. В Смете в Базе Операций есть справочник Параметры с модели, там есть Пользовательские вычисляемые параметры, которые позволяют определить этот параметр через произвольный скрипт. Вот в этом скрипте не понятно как обратиться к объекту, поскольку там нет Model, Object, Object3 ... есть панель - Panel, но тогда скрипт работает только для объектов модели, построенных как панель. Вот непонятно как обратиться к произвольному объекту
__________________
Автоматизация автоматизаций на АСУ, ТП и тд и тп..
Комплексное решение
|
|
|
12.05.2019, 09:55
|
#413
|
VIP
Регистрация: 04.07.2012
Сообщений: 1,956
Сказал(а) спасибо: 3,990
Поблагодарили 3,545 раз(а) в 1,167 сообщениях
Вес репутации: 1048
|
Разобрался:
выдержка из мануала по Скриптам:
"Глобальные свойства БАЗИС Смета:
Panel
Доступ к параметрам панели.
Синтаксис:
Panel;
Тип данных:
Panel
Holes
Список отверстий панели
Синтаксис:
Holes;
Тип данных:
PanelHoles
Holes: свойство типа PanelHoles " 'Список отверстий панели
Material
Текущий материал
Синтаксис:
Material;
Тип данных:
String
Material: свойство типа String " "Текущий материал"
Result
Результат вычисления параметра
Синтаксис:
Result;
Тип данных:
Number
Result: свойство типа Number " 'Результат вычисления параметра'
Objects
Объекты скрипта
Синтаксис:
Objects;
Тип данных:
EstimateObjectList"
__________________
Автоматизация автоматизаций на АСУ, ТП и тд и тп..
Комплексное решение
|
|
|
Пользователь сказал cпасибо:
|
|
23.05.2019, 17:09
|
#414
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,030 раз(а) в 366 сообщениях
Вес репутации: 344
|
Цитата:
Сообщение от Letos
Попытался сделать пример подсчёта площади поверхности для выделенного объекта, но сразу оговорюсь - кроме того, что считаются все треугольники (будут проблемы со стыками объектов, если считать суммарную площадь нескольких объектов), ещё, из-за операций с вещественными числами (в основном, деление и корень), будет возникать погрешность (скорее всего неприемлемая). Например: есть шар с радиусом 100. Его площадь поверхности: 4*Pi*R^2 = 125663.706. Скрипт же у меня выдаёт 110134.391.
Код для получения площади
PHP код:
// длина вектора
function VectorLength(v) {
return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z)
}
/**
* Вычитание векторов
* @param {Vector} v1
* @param {Vector} v2
* @returns {Vector}
*/
function VectorSub(v1, v2) {
return {
x: v1.x - v2.x,
y: v1.y - v2.y,
z: v1.z - v2.z
}
}
/**
* Сложение векторов
* @param {Vector} v1
* @param {Vector} v2
* @returns {Vector}
*/
function VectorAdd(v1, v2) {
return {
x: v1.x + v2.x,
y: v1.y + v2.y,
z: v1.z + v2.z
}
}
// скалярное произведение векторов
function VectorDot(v1, v2) {
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
}
/**
* Проекция точки на линию
* @param {Vector} p Исходная точка
* @param {Vector} ls точка на линии
* @param {Vector} ld направление линии
* @returns {Vector}
*/
function PointLineProj(p, ls, ld) {
var v = VectorSub(p, ls)
var c1 = VectorDot(v, ld);
var c2 = VectorDot(ld, ld);
var c = c1 / c2;
return {
x: ls.x + ld.x * c,
y: ls.y + ld.y * c,
z: ls.z + ld.z * c
}
}
/**
* Расстояние от точки до линии
* @param {Vector} p Исходная точка
* @param {Vector} ls точка на линии
* @param {Vector} ld направление линии
*/
function PointLineDistance(p, ls, ld) {
var proj = PointLineProj(p, ls, ld);
var dv = VectorSub(proj, p);
return VectorLength(dv)
}
// Площадь треугольника - Основание * Высота / 2 (a*h/2)
// Точки p1, p2, p3 - вершины треугольника
// Если p1p2 - основание, тогда высота - расстояние от точки p3 до линии, на
// которой лежит основание.
//
// p3
// /|\
// / | \
// / | \
// / |h \
// /____|____\
// p1 a p2
//
function Square(tri) {
var p1 = tri.Vertex1, p2 = tri.Vertex2, p3 = tri.Vertex3;
var ld = VectorSub(p1, p2)
var a = VectorLength(ld);
var h = PointLineDistance(p3, p1, ld);
return a * h / 2;
}
var obj = Model.Selected;
var s = 0;
if (obj.TriListsCount > 0) {
for (var t = 0; t < obj.TriListsCount; t++) {
var list = obj.TriLists[t];
for (var i = 0; i < list.Count; i++) {
var tri = list[i];
if (tri) {
s += Square(tri);
}
}
}
}
alert('s = ' + s + 'mm');
[свернуть]
|
Некоторое время гуглил, как получше искать площадь поверхности и набрёл на англоязычную фразу "Surface Area". Оказалось, что у списка треугольников есть такой метод, поэтому скрипт может выглядеть гораздо короче:
PHP код:
var area = 0;
// Получение площади поверхности объекта
function GetSurfaceArea(obj){
var result = 0;
if (obj.TriListsCount > 0) {
for (var t = 0; t < obj.TriListsCount; t++) {
var list = obj.TriLists[t];
result += list.SurfaceArea();
}
}
return result;
}
//Обработка объекта и вложенных объектов.
function ProcessObject(obj){
if (obj.List){
for (var i = 0; i < obj.AsList().Count; i++){
ProcessObject(obj[i]);
}
}
else
area += GetSurfaceArea(obj);
}
for (var i = 0; i < Model.SelectionCount; i++){
var obj = Model.Selections[i];
ProcessObject(obj);
}
alert('Площадь поверхности выделенных объектов = ' + area + 'mm\u00b2');
P.S. Также я заметил, что погрешность вычислений зависит от параметров "Гладкость дуг" (меньше - хуже) и "ядро C3D" (выкл. - хуже).
Последний раз редактировалось Letos; 23.05.2019 в 17:15.
Причина: Удалил лишнюю цитату
|
|
|
5 пользователя(ей) сказали cпасибо:
|
|
24.05.2019, 09:44
|
#415
|
Местный
Регистрация: 02.07.2011
Сообщений: 191
Сказал(а) спасибо: 93
Поблагодарили 105 раз(а) в 44 сообщениях
Вес репутации: 196
|
Цитата:
Сообщение от bbb i ko
речь не пользовательских свойствах. В Смете в Базе Операций есть справочник Параметры с модели, там есть Пользовательские вычисляемые параметры, которые позволяют определить этот параметр через произвольный скрипт. Вот в этом скрипте не понятно как обратиться к объекту, поскольку там нет Model, Object, Object3 ... есть панель - Panel, но тогда скрипт работает только для объектов модели, построенных как панель. Вот непонятно как обратиться к произвольному объекту
|
в смете тоже можно запустить скрипт? и там уже другая область видимости?
как в смете запустить скрипт?
|
|
|
24.05.2019, 11:20
|
#416
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,030 раз(а) в 366 сообщениях
Вес репутации: 344
|
Цитата:
Сообщение от wizardpnz
в смете тоже можно запустить скрипт? и там уже другая область видимости?
как в смете запустить скрипт?
|
Насколько я знаю, в смете, в базе операций, есть "Пользовательские параметры" для модели и для объекта, но там уже немного по-другому всё устроено (нет Action'а, другие глобальные свойства/функции, но скелет - структура 3д объектов - та же). Потом это вроде в сопутствия назначаются. Я думал разобраться в сметовских скриптах, запустил Смету (в первый раз), написал скриптовый параметр, но заставить его запуститься не получилось, в результате я оставил изучение Сметы до лучших времён.
|
|
|
24.05.2019, 14:08
|
#417
|
VIP
Регистрация: 18.01.2008
Сообщений: 1,047
Сказал(а) спасибо: 2,864
Поблагодарили 1,853 раз(а) в 435 сообщениях
Вес репутации: 695
|
Я тут решил проверить свои писательские способности.
Попробовал написать инструкцию как написать скрипт для Базис-Сметы и подключить его.
Поскольку текст с картинками, то написал в Wordе и прикрепил этот файл во вложении.
Прошу сильно не пинать. Чукча не писатель
|
|
|
13 пользователя(ей) сказали cпасибо:
|
|
24.05.2019, 23:53
|
#418
|
VIP
Регистрация: 04.07.2012
Сообщений: 1,956
Сказал(а) спасибо: 3,990
Поблагодарили 3,545 раз(а) в 1,167 сообщениях
Вес репутации: 1048
|
Цитата:
Сообщение от wizardpnz
как в смете запустить скрипт?
|
Заходите в справочник Операции, далее Параметры с модели - Правка - Пользовательские вычисляемые. Там можете добавить свой параметр, который вы сможете применить исключительно для расчета объема операции и более ни для чего. Этот самый объем (результат работы скрипта) вы должны записать в переменную Result - тогда все сработает. Соответственно в скрипте пользовательского параметра вы не можете обратиться к любому объекту модели , есть только текущий объект, с которым работает Смета через этот скрипт. Что это за объект? В общем случае Objects (не путайте с объектами модели, этот Objects относится только к текущим объектам скрипта - почему их может быть много я пока не в курсе) - можно так:
Код:
for (var i = 0; i < Objects.Count; i++){
var obj = Objects.Items[i];
if (obj.IsPanel())
но самое простое - это свойство Panel: в теле скрипта можете обращаться к этой переменной и если текущий объект - панель, то получите все свойства панели: материал, кромки, контур и тд.
Ну и еще: не все что работает в Мебельщике, работает и в Смете. Есть отличия, те же треугольники не получится получить для импортированного из автокада объекта (я надеюсь - это временно)) )
Цитата:
Сообщение от zorro
Я тут решил проверить свои писательские способности.
|
О! не сразу обратил внимание - все четко расписано, респект.
__________________
Автоматизация автоматизаций на АСУ, ТП и тд и тп..
Комплексное решение
Последний раз редактировалось bbb i ko; 25.05.2019 в 00:36.
|
|
|
4 пользователя(ей) сказали cпасибо:
|
|
26.05.2019, 16:26
|
#419
|
Местный
Регистрация: 02.07.2011
Сообщений: 191
Сказал(а) спасибо: 93
Поблагодарили 105 раз(а) в 44 сообщениях
Вес репутации: 196
|
в смете можно получить доступ к смете изделия, которую выводит базис смета , чтобы из этих данных запилить свой отчёт???
Последний раз редактировалось wizardpnz; 27.05.2019 в 10:39.
|
|
|
07.06.2019, 10:47
|
#420
|
Новичок
Регистрация: 10.05.2018
Сообщений: 2
Сказал(а) спасибо: 1
Поблагодарили 20 раз(а) в 1 сообщении
Вес репутации: 0
|
Можно ли с помощью скрипта разрушить существующий блок?
|
|
|
|
|
|
Нижняя навигация
|
|
Опции темы |
|
Опции просмотра |
Линейный вид
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 07:33. Часовой пояс GMT +3.
|