|
|
|
|
|
13.01.2014, 13:22
|
|
Скрипты. Готовые решения для БМ8-2023
Igor_482
VIP
Регистрация: 03.09.2008
Сообщений: 174
Сказал(а) спасибо: 34
Поблагодарили 794 раз(а) в 113 сообщениях
13.01.2014, 13:22
Рейтинг:
()
Этот раздел предназначен для размещения готовых скриптов.
Здесь находятся ТОЛЬКО готовые скрипты. Для обсуждения есть отдельная тема: Обсуждение готовых скриптов.
Авторам: - Давать уникальные названия скриптам (не совпадающие с названием уже выложенных скриптов, за исключением обновлений скрипта)
- Указывать работоспособность в разных версиях БМ.
- Общее описание работы скрипта.
- Если презентованный скрипт платный указывать стоимость, условия и контакты для приобретения.
Версии, указанные модератором, как прошедшие проверку:
8 - Демо-версия 8.0.7.9649
8н - "народная" 8.0.12.12765
9 - Демо-версия 9.0.8.18908
10 - Демо-версия 10.0.0.21602
Последний раз редактировалось AlexBolton; 03.03.2023 в 21:03..
|
Просмотров: 536927
|
13 пользователя(ей) сказали cпасибо:
|
|
22.05.2019, 16:33
|
#61
|
Новичок
Регистрация: 07.05.2018
Сообщений: 7
Сказал(а) спасибо: 14
Поблагодарили 12 раз(а) в 1 сообщении
Вес репутации: 0
|
Ростановка фурнитуры
Тут на форуме нашел скрипт установки крепежа, немного переработал под вертикальные и горизонтальные панели, может кому пригодится
PHP код:
FileOptions = 'Кріплення.xml';
function MakeProperties()
{
Prop = Action.Properties;
Type = Prop.NewCombo('Тип','Горизонтальна\nВерикальна');
BlockVisible = Prop.NewFurniture('Кріплення видиме');
BlockInVisible = Prop.NewFurniture('Кріплення приховане');
ShkantType = Prop.NewFurniture('Шкант');
FurnVis = Prop.NewCombo('Видима боковина, верх чи дно','Видима ліва, або верх\nВидима права, або дно\nОбидві видимі\nОбидві не видимі');
NumberOnTheSide = Prop.NewCombo('Кіл-ть кріплень по стороні', 'Одне\nДва\nТри');
FastenerPosition = Prop.NewCombo('Положення кріплення', 'Знизу, чи ліворуч від панелі\nЗверхи, чи праворуч від панелі');
TypeBasing = Prop.NewCombo('База кріплення', 'Від переднього торця\nВід заднього торця');
ShcantWith = Prop.NewCombo('Ставити шкант', 'Ні\nЛіворуч або верх\nПраворуч або дно\nЗ обох боків');
InitialSize = Prop.NewNumber('Min. відстань', 37);
StepFastener = Prop.NewNumber('Крок кріплення', 32);
}
MakeProperties()
Action.Properties.Load(FileOptions);
Action.OnFinish = function()
{
Model.UnPickAll();
Action.Properties.Save(FileOptions);
}
Bok1 = GetPanel("Вкажіть ліву або верхню панель");
Bok2 = GetPanel("Вкажіть праву або нижню панель");
x1 = Bok2.GabMin.x + 1;
x2 = Bok1.GabMax.x - 1;
while (true)
{
Polka = GetPanel("Виберіть панель що закріплюється");
if (FastenerPosition.Value == 'Зверхи, чи праворуч від панелі') {Py = Polka.GabMax.y - 1}
else {Py = Polka.GabMin.y + 1};
z1 = Polka.GabMin.z;
z2 = Polka.GabMax.z;
if (Type.Value == 'Горизонтальна')
{
CoordinateA = x2;
CoordinateB = x1;
CoordinateC = Py;
CoordinateD = Py;
}
if (Type.Value == 'Верикальна')
{
CoordinateA = Py;
CoordinateB = Py;
CoordinateC = x1;
CoordinateD = x2;
}
if (TypeBasing.Value == 'Від переднього торця')
{
ZKrep1 = Bok1.GabMax.z - InitialSize.Value;
while (ZKrep1 > z2 - StepFastener.Value) { ZKrep1 = ZKrep1 - StepFastener.Value }
ZKrep2 = ZKrep1 - StepFastener.Value;
while (ZKrep2 > z1 + 2 * StepFastener.Value) { ZKrep2 = ZKrep2 - StepFastener.Value }
ZKrep3 = ZKrep1 - StepFastener.Value;
while (ZKrep3 > (z2 / 2 ) + StepFastener.Value) { ZKrep3 = ZKrep3 - StepFastener.Value }
}
else
{
ZKrep1 = Bok1.GabMin.z + InitialSize.Value;
while (ZKrep1 < z1 + StepFastener.Value) { ZKrep1 = ZKrep1 + StepFastener.Value }
ZKrep2 = ZKrep1 + StepFastener.Value;
while (ZKrep2 < z2 - 2 * StepFastener.Value) { ZKrep2 = ZKrep2 + StepFastener.Value }
ZKrep3 = ZKrep1 + StepFastener.Value;
while (ZKrep3 < (z2 / 2 ) - StepFastener.Value) { ZKrep3 = ZKrep3 + StepFastener.Value }
}
//alert("CoordinateA = "+CoordinateA+"\n"+"CoordinateB = "+CoordinateB+"\n"+"CoordinateC = "+CoordinateC+"\n"+"CoordinateD = "+CoordinateD+"\n"+"Py = "+Py+"\n");
if (NumberOnTheSide.Value == 'Одне')
{
if (FurnVis.Value == 'Обидві видимі')
{
BlockInVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1)
BlockInVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1)
}
if (FurnVis.Value == 'Видима ліва, або верх')
{
BlockInVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1)
BlockVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1)
}
if (FurnVis.Value == 'Видима права, або дно')
{
BlockVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1)
BlockInVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1)
}
if (FurnVis.Value == 'Обидві не видимі')
{
BlockVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1)
BlockVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1)
}
if (ShcantWith.Value == 'Ліворуч або верх')
{
if (TypeBasing.Value == 'Від переднього торця')
{
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1 - StepFastener.Value)
}
else
{
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2 + StepFastener.Value)
}
}
if (ShcantWith.Value == 'Праворуч або дно')
{
if (TypeBasing.Value == 'Від переднього торця')
{
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1 - StepFastener.Value)
}
else
{
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2 - StepFastener.Value)
}
}
if (ShcantWith.Value == 'З обох боків')
{
if (TypeBasing.Value == 'Від переднього торця')
{
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1 - StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1 - StepFastener.Value)
}
else
{
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2 + StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2 - StepFastener.Value)
}
}
}
if (NumberOnTheSide.Value == 'Два')
{
if (FurnVis.Value == 'Обидві видимі')
{
BlockInVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2)
BlockInVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2)
BlockInVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1)
BlockInVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1)
}
if (FurnVis.Value == 'Видима ліва, або верх')
{
BlockInVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2)
BlockVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2)
BlockInVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1)
BlockVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1)
}
if (FurnVis.Value == 'Видима права, або дно')
{
BlockVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2)
BlockInVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2)
BlockVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1)
BlockInVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1)
}
if (FurnVis.Value == 'Обидві не видимі')
{
BlockVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2)
BlockVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2)
BlockVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1)
BlockVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1)
}
if (ShcantWith.Value == 'Ліворуч або верх')
{
if (TypeBasing.Value == 'Від переднього торця')
{
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2 + StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1 - StepFastener.Value)
}
else
{
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2 - StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1 + StepFastener.Value)
}
}
if (ShcantWith.Value == 'Праворуч або дно')
{
if (TypeBasing.Value == 'Від переднього торця')
{
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2 + StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1 - StepFastener.Value)
}
else
{
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2 - StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1 + StepFastener.Value)
}
}
if (ShcantWith.Value == 'З обох боків')
{
if (TypeBasing.Value == 'Від переднього торця')
{
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2 + StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2 + StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1 - StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1 - StepFastener.Value)
}
else
{
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2 - StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2 - StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1 + StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1 + StepFastener.Value)
}
}
}
if (NumberOnTheSide.Value == 'Три')
{
if (FurnVis.Value == 'Обидві видимі')
{
BlockInVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2)
BlockInVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2)
BlockInVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1)
BlockInVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1)
BlockInVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep3)
BlockInVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep3)
}
if (FurnVis.Value == 'Видима ліва, або верх')
{
BlockInVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2)
BlockVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2)
BlockInVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1)
BlockVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1)
BlockInVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep3)
BlockVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep3)
}
if (FurnVis.Value == 'Видима права, або дно')
{
BlockVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2)
BlockInVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2)
BlockVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1)
BlockInVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1)
BlockVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep3)
BlockInVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep3)
}
if (FurnVis.Value == 'Обидві не видимі')
{
BlockVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2)
BlockVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2)
BlockVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1)
BlockVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1)
BlockVisible.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep3)
BlockVisible.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep3)
}
if (ShcantWith.Value == 'Ліворуч або верх')
{
if (TypeBasing.Value == 'Від переднього торця')
{
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2 + StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1 - StepFastener.Value)
}
else
{
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2 - StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1 + StepFastener.Value)
}
}
if (ShcantWith.Value == 'Праворуч або дно')
{
if (TypeBasing.Value == 'Від переднього торця')
{
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2 + StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1 - StepFastener.Value)
}
else
{
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2 - StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1 + StepFastener.Value)
}
}
if (ShcantWith.Value == 'З обох боків')
{
if (TypeBasing.Value == 'Від переднього торця')
{
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2 + StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2 + StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1 - StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1 - StepFastener.Value)
}
else
{
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep2 - StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep2 - StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok1, CoordinateA, CoordinateC, ZKrep1 + StepFastener.Value)
ShkantType.Value.Mount(Polka, Bok2, CoordinateB, CoordinateD, ZKrep1 + StepFastener.Value)
}
}
}
Action.Commit();
}
|
|
|
12 пользователя(ей) сказали cпасибо:
|
|
23.05.2019, 17:18
|
#62
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,030 раз(а) в 366 сообщениях
Вес репутации: 344
|
Подсчёт площади поверхности объекта
Скрипт для подсчёта всей площади поверхности объекта. Погрешность вычислений зависит от параметров Базиса "Гладкость дуг" (меньше - хуже) и "ядро C3D" (выкл. - хуже).
Обсуждение скрипта и предложения по доработке писать сюда
Код
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');
[свернуть]
|
|
|
14 пользователя(ей) сказали cпасибо:
|
|
15.08.2019, 12:35
|
#63
|
Местный
Регистрация: 30.11.2013
Адрес: Кишинев
Сообщений: 734
Сказал(а) спасибо: 1,529
Поблагодарили 884 раз(а) в 376 сообщениях
Вес репутации: 402
|
Поиск панелей по позициям
Цитата:
Сообщение от Uncle
К стати, одно неудобство в данном скрипте... Если скрипт запустить, но сразу же нажать кнопку Отмена, Базис слегка зависает, а потом выделяется все, что есть на модели. Нельзя как то устранить эту малоприятную особенность? Что бы просто, нажав Отмену, скрипт тут же закончил свою работу.
|
Добавил в скрипт выделения панелей по позициям обработчик, чтобы при отмене скрипта не выделялись какие-либо панели
Код
PHP код:
UnSelectAll();
Action.OnFinish = function(){
if(positions == '')
UnSelectAll();
}
var positions = prompt("Введите номера позиций через пробел");
var nums = positions.split(' ');
var finded = [];
function contains(arr, elem) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] === elem) {
return true;
}
}
return false;
}
Model.forEach(function(obj) {
if (obj) {
if (nums.indexOf(obj.ArtPos) >= 0) {
obj.Selected = true;
finded.push(obj.ArtPos);
}
}
})
str = '';
for (i=0;i<nums.length;i++){
if (!contains(finded, nums[i])){
str=str+nums[i]+',';
}
}
if (!str==''){
alert('Не найдены позиции: '+str)
}
[свернуть]
UPD:
"Причесал" вывод сообщения о ненайденных панелях - немного раздражала лишняя запятая в конце строки ))
Код
PHP код:
UnSelectAll();
Action.OnFinish = function(){
if(positions == '')
UnSelectAll();
}
var positions = prompt("Введите номера позиций через пробел");
var nums = positions.split(' ');
var finded = [];
var not_finded = [];
function contains(arr, elem) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] === elem) {
return true;
}
}
return false;
}
Model.forEach(function(obj) {
if (obj) {
if (nums.indexOf(obj.ArtPos) >= 0) {
obj.Selected = true;
finded.push(obj.ArtPos);
}
}
})
//str = '';
for (i=0;i<nums.length;i++){
if (!contains(finded, nums[i])){
//str=str+nums[i]+',';
not_finded.push(nums[i]);
}
}
if (not_finded.length > 0){
alert('Не найдены позиции: '+not_finded)
}
[свернуть]
Последний раз редактировалось Ovsyanicov; 15.08.2019 в 15:47.
Причина: Дополнение
|
|
|
16 пользователя(ей) сказали cпасибо:
|
|
11.10.2019, 12:25
|
#64
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,030 раз(а) в 366 сообщениях
Вес репутации: 344
|
Цитата:
Сообщение от v22884
Надписи на панели с предварительно подготовленными вектарами.
надпись берётся из Имени панели.
В этом варианте возможны только цифры,
потому что подготовлены вектора только для цифр.
мне лично нужно чтоб отправлять в DXF и знать где какая деталь, потому что много очень похожих деталей, но надо точно знать где какая.
(Апроксимирую вогнутый выпуклый поворот стола полосками пластика)
|
Изменил скрипт.
В новой версии добавлена возможность брать позицию панели. Также можно отключить интерактивный режим (не требовать от пользователя при каждом запуске выбирать, откуда брать панель). Для этого нужно выставить значение переменной interactive равное false и задать значение переменной mode.
Код скрипта v5
PHP код:
const settingsFile = 'PanelNumbers.xml';
/**
* Масштаб фрагмента
*/
const fragScale = 10;
/**
* Режим работы скрипта
* 0 - надпись из имени панели
* 1 - надпись из позиции
*/
var mode = 0;
/**
* Константа, указывающая, является ли скрипт интерактивным
* Правится вручную под нужды пользователя
*/
const interactive = true;
/**
* ДЛя БМ8
* @param {Contour2D} cont
*/
function GetMax(cont) {
var result = {
x: -100000000,
y: -100000000
}
for (var i = 0; i < cont.Count; i++) {
var item = cont.Objects[i];
switch (item.ElType) {
case (1): //ElementType.Line
var p1 = item.AsLine().Pos1;
var p2 = item.AsLine().Pos2;
result.x = Math.max(result.x, p1.x, p2.x);
result.y = Math.max(result.y, p1.y, p2.y);
break;
case (2): //ElementType.Arc
var p1 = item.AsArc().Pos1;
var p2 = item.AsArc().Pos2;
var c = item.AsArc().Center;
result.x = Math.max(result.x, p1.x, p2.x, c.x);
result.y = Math.max(result.y, p1.y, p2.y, c.y);
break;
case (3): //3ElementType.Circle
var cir = item.AsCircle();
var c = cir.Center;
result.x = Math.max(result.x, c.x + cir.CirRadius);
result.y = Math.max(result.y, c.y + cir.CirRadius);
}
}
return result;
}
/**
* ДЛя БМ8
* @param {Contour2D} cont
*/
function GetMin(cont) {
var result = {
x: 100000000,
y: 100000000
}
for (var i = 0; i < cont.Count; i++) {
var item = cont.Objects[i];
switch (item.ElType) {
case (1): //ElementType.Line
var p1 = item.AsLine().Pos1;
var p2 = item.AsLine().Pos2;
result.x = Math.min(result.x, p1.x, p2.x);
result.y = Math.min(result.y, p1.y, p2.y);
break;
case (2): //ElementType.Arc
var p1 = item.AsArc().Pos1;
var p2 = item.AsArc().Pos2;
var c = item.AsArc().Center;
result.x = Math.min(result.x, p1.x, p2.x, c.x);
result.y = Math.min(result.y, p1.y, p2.y, c.y);
break;
case (3): //ElementType.Circle
var cir = item.AsCircle();
var c = cir.Center;
result.x = Math.min(result.x, c.x - cir.CirRadius);
result.y = Math.min(result.y, c.y - cir.CirRadius);
}
}
return result;
}
// В БМ8 у контура нет свойств Min и Max, поэтому приходится выкручиваться.
// Берём наиболее удалённую точку и ищем ближайшую точку контура.
// На непрямоугольных панелях может некорректно работать.
/**
*
* @param {Contour2D} cont
*/
function GetContourMin(cont) {
if (cont.Min) {
return cont.Min
}
else { //ДЛя БМ8
return GetMin(cont)
// var min = {
// x: -10000000,
// y: -10000000
// }
// return cont.ClosestPoint(min);
}
}
/**
*
* @param {Contour2D} cont
* @returns {Point}
*/
function GetContourMax(cont) {
if (cont.Max) {
return cont.Max
}
else { //ДЛя БМ8
return GetMax(cont);
// var max = {
// x: 10000000,
// y: 10000000
// }
// return cont.ClosestPoint(max);
}
}
var combo;
if (interactive) {
combo = Action.Properties.NewCombo('Брать из панели', 'Имя\nПозицию');
combo.OnChange = combo.OnValueChange =
function () {
mode = combo.ItemIndex
};
Action.Properties.NewButton('Применить').OnClick = function () {
Do();
Action.Finish();
}
Action.Properties.Load(settingsFile);
mode = combo.ItemIndex;
Action.OnFinish = function () {
Action.Properties.Save(settingsFile);
}
Action.Continue();
}
else
Do();
function CorrectSubContourPositionByPoint(sub, src, p) {
if (!src.IsPointInside(p)) {
var closedSrc = src.ClosestPoint(p);
var shift = {
x: closedSrc.x - p.x,
y: closedSrc.y - p.y
}
sub.Move(shift.x, shift.y);
// sub.Move(shift);
return true;
}
return false;
}
/**
* Попытка вписать вычитаемый контур в исходный
* @param {Contour2D} sub Вычитаемый контур
* @param {Contour2D} src Исходный контур
*/
function CorrectSubContourPosition(sub, src) {
var subMax = GetContourMax(sub);
var corrected = CorrectSubContourPositionByPoint(sub, src, subMax);
var subMin = GetContourMin(sub);
corrected |= CorrectSubContourPositionByPoint(sub, src, subMin);
if (corrected) {
subMin = GetContourMin(sub);
subMax = GetContourMax(sub);
}
var p1 = {
x: subMax.x,
y: subMin.y,
}
corrected = CorrectSubContourPositionByPoint(sub, src, p1)
if (corrected) {
subMin = GetContourMin(sub);
subMax = GetContourMax(sub);
}
var p2 = {
x: subMin.x,
y: subMax.y,
}
corrected = CorrectSubContourPositionByPoint(sub, src, p2)
}
function Do() {
for (var i = 0; i < Model.SelectionCount; i++) {
/** @type {Panel}*/
var pan = Model.Selections[i].AsPanel;
if (pan) {
Undo.Changing(pan);
var c = pan.Contour
var n = '';
switch (mode) {
case 0:
n = pan.Name;
break;
case 1:
n = pan.ArtPos;
break;
}
n.toUpperCase();
nl = n.length
var min = GetContourMin(c);
var max = GetContourMax(c);
var center = {
x: (min.x + max.x) / 2,
y: (min.y + max.y) / 2
}
var polojeniyePosledSimvola = 0;
const rasstoyaniyemejdusimvolami = 0.2
var s = NewContour();
for (ni = 0; ni < nl; ni++) {
var add = NewContour()
add.Load(n[ni] + '.frw');
var ss = MashtabirovaniyeContura(add, fragScale)
polojeniyePosledSimvola = polojeniyePosledSimvola + rasstoyaniyemejdusimvolami * ss.Width
ss.Move(polojeniyePosledSimvola, 0)
polojeniyePosledSimvola = polojeniyePosledSimvola + ss.Width
s.Addition(ss);
}
system.log(JSON.stringify(center));
var sCenter = {
x: (GetContourMin(s).x + GetContourMax(s).x) / 2,
y: (GetContourMin(s).y + GetContourMax(s).y) / 2,
};
system.log(JSON.stringify(sCenter));
s.Move(center.x - sCenter.x, center.y - sCenter.y);
CorrectSubContourPosition(s, c);
var sCenter = {
x: (GetContourMin(s).x + GetContourMax(s).x) / 2,
y: (GetContourMin(s).y + GetContourMax(s).y) / 2,
};
system.log(JSON.stringify(sCenter));
c.Subtraction(s);
pan.Build()
}
}
}
function MashtabirovaniyeContura(scontur, scale) {
s = scontur
sh = s.Height
sw = s.Width
s.Fit(0, 0, sw, sh)
ss = NewContour()
sc = s.Count
for (i = 0; i < sc; i++) {
if (s[i].ElType == 1) {
x1 = s[i].Pos1.x * scale
y1 = s[i].Pos1.y * scale
x2 = s[i].Pos2.x * scale
y2 = s[i].Pos2.y * scale
ss.AddLine(x1, y1, x2, y2)
}
if (s[i].ElType == 2) {
p1 = NewPoint(s[i].Pos1.x * scale, s[i].Pos1.y * scale)
p2 = NewPoint(s[i].Pos2.x * scale, s[i].Pos2.y * scale)
centre = NewPoint(s[i].Center.x * scale, s[i].Center.y * scale)
//проверка тру или фелс в направлении дуги
p1t = NewPoint(s[i].Pos1.x, s[i].Pos1.y)
p2t = NewPoint(s[i].Pos2.x, s[i].Pos2.y)
centre_t = NewPoint(s[i].Center.x, s[i].Center.y)
st = NewContour()
st.AddArc(p1t, p2t, centre_t, true)
if (st[0].ObjLength() == s[i].ObjLength()) {
napravleniye = true
}
else {
napravleniye = false
}
//----проверка тру или фелс в направлении дуги
ss.AddArc(p1, p2, centre, napravleniye)
}
if (s[i].ElType == 3) {
xc = s[i].Center.x * scale
yc = s[i].Center.y * scale
rad = s[i].CirRadius * scale
ss.AddCircle(xc, yc, rad)
}
}
return ss
}
[свернуть]
Обновление 1: поправил работу скрипта в 8 версии.
Обновление 2: поправил работу скрипта с контурами, начинающимися не с 0 по ЛСК и обновил код в спойлере
Обновление 3 (12.10.19): Добавил сохранение настроек. Поправил положение надписи- теперь центр надписи совпадает с центром контура панели.
Обновление 4 (14.10.19): Поправил работу скрипта в БМ8 (у контура отсутствовали свойства Min и Max), поправил загрузку настроек (Загружалась в свойства настройка "Позиция", а режим в скрипте не менялся, поэтому брался режим "Имя").
Обновление 5 (17.10.19): - Поправил работу с нестандартными контурами: Если при расположении контура вычитания в центре габаритного прямоугольника контура панели контур вычитания выходит за границы контура панели, скрипт пытается сдвинуть контур вычитания так, чтобы он весь уместился на контуре панели.
- Исправил вычисления минимума/максимума для контура в БМ8.
Из-за отсутствия свойств Min и Max у контура в БМ8 возможны различия в позиционировании контура вычитания между версиями БМ8 и БМ9+
Обсуждение скрипта и предложения по доработке писать сюда
Последний раз редактировалось Letos; 17.10.2019 в 09:57.
Причина: обновление 5
|
|
|
23 пользователя(ей) сказали cпасибо:
|
|
15.01.2020, 11:24
|
#65
|
VIP
Регистрация: 18.01.2008
Сообщений: 1,047
Сказал(а) спасибо: 2,864
Поблагодарили 1,852 раз(а) в 435 сообщениях
Вес репутации: 695
|
Скрипт для построение панели по трем любым точкам не обязательно лежащим на плоскостях координат. Панель тогда будет наклонена под "дикими" углами.
Строится треугольная панель из текущего материала. Если точки задавать по часовой стрелке, толщина панели идет "от нас". Если точки задавать против часовой стрелки, толщина панели идет "на нас". Все по "правилу буравчика". Построенную панель можно вызвать на редактирование и треугольный контур заменить на любой другой. Все "дикие" углы поворота относительно осей сохраняются. Углы МЕЖДУ панелями можно померить Измерения/Угол между плоскостями. Около координат показывается острый и тупой угол. Угол нужен для расчета угла зарезания для паза Фаска. Линию пересечения плоскостей можно найти Вспомогательные построения/Пересечение плоскостей. По линии пересечения строится вспомогательная линия. При редактировании панели она не исчезает и точки пересечения этой линии с контуром панели можно захватить и тем самым обрезать панель до линии пересечения.
PHP код:
while (true)
{
p1 = GetPoint("Укажите точку 1");
p2 = GetPoint("Укажите точку 2");
p3 = GetPoint("Укажите точку 3");
p1 = new Vector(p1.x, p1.y, p1.z);
p2 = new Vector(p2.x, p2.y, p2.z);
p3 = new Vector(p3.x, p3.y, p3.z);
v1 = p1.subtract(p2);
v2 = p1.subtract(p3);
normal = v1.cross(v2);
panel = AddHorizPanel(0, 0, 10, 10, 0);
panel.Orient(normal, v1);
panel.Contour.Clear();
panel.Position = p1;
p2 = panel.ToObject(p2);
p3 = panel.ToObject(p3);
panel.Contour.AddLine(0, 0, p2.x, p2.y);
panel.Contour.AddLine(p2.x, p2.y, p3.x, p3.y);
panel.Contour.AddLine(p3.x, p3.y, 0, 0);
//panel.Thickness = 1;
panel.Build();
Action.Commit();
}
Последний раз редактировалось AlexBolton; 03.03.2023 в 17:54.
|
|
|
20 пользователя(ей) сказали cпасибо:
|
|
14.02.2020, 21:03
|
#66
|
Местный
Регистрация: 11.04.2018
Адрес: г.Маркс
Сообщений: 162
Сказал(а) спасибо: 57
Поблагодарили 242 раз(а) в 45 сообщениях
Вес репутации: 137
|
Скрипт обувница
Скрипт для построения обувницы с выбором по количеству отсеков. Делал для себя, надоело вставлять фрагменты.
Работает в версиях:
8н в остальных не проверял.
|
|
|
31 пользователя(ей) сказали cпасибо:
|
|
05.05.2020, 21:18
|
#67
|
Местный
Регистрация: 15.04.2012
Адрес: Санкт-Петербург
Сообщений: 104
Сказал(а) спасибо: 56
Поблагодарили 276 раз(а) в 63 сообщениях
Вес репутации: 211
|
Скрипт построения гайки
Учился работать в JS с контурами, написал скрипт который чертит гайки. Может кому пригодиться.
создать гайку или головку болта
PHP код:
function okrugl(ch, n) {
// функция округления числа с заданной тоносттью
// ch - число
// n - количество знаков
if(isNaN(ch) || isNaN(n)) return false;
var m = Math.pow(10,n);
return Math.round(ch*m)/m;
}
var Sq = 13; //prompt("размер ключа "); // Размер «под ключ» //условно = 1.0
var lz = 1.25; //prompt("шаг резьбы "); // Размер «под ключ» //условно = 1.0
lz = lz * 1;
Sq = Sq - lz/6;
var Panel = AddPanel();
var C = Panel.Contour ;
// строим шестигранник
var c = okrugl(Sq * 1.1547005/2, 3); // радиус описанной окружности //условно = 0.577'35025
var a = okrugl(Sq/2, 3); // отступы по "X" //условно = 0.5
var b = okrugl(Sq * 1.1547005/4, 3); // отступы по "Y" //условно = 0.288'67512599
Panel.Thickness = c - lz/2; // //Толщина гайки
Panel.Name = 'Головка болта';
Panel.MaterialName = 'Сталь';
//------------------------------------
var Line = [];
var i = 0;
Line[++i] = C.AddLine(0, c, a, b);
Line[++i] = C.AddLine(a, b, a, -b);
Line[++i] = C.AddLine(a, -b, 0, -c);
Line[++i] = C.AddLine(0, -c, -a, -b);
Line[++i] = C.AddLine(-a, -b, -a, b);
Line[++i] = C.AddLine(-a, b, 0, c);
var fas = Panel.AddCut('Ключ на '+ okrugl(Sq, 0));
fas.Trajectory.AddCircle(0, 0, c+0.125/2)
var Fg = fas.Contour;
//++++++++++++++++++++++++++++
// контур внешней фаски головки болта 6 линий
var dw = lz*1.25; //диаметр внешней фаски
var d_w = dw/12.5; //малая фаска
var hf = lz*1.1; //высота фаски
var lf = lz*0.5; //ширина фаски
var wf = Panel.Thickness + dw/10; //длина ребра
Line[++i] = Fg.AddLine(-dw/10, -dw/10, dw, -dw/10); // нижняя граница паза
Line[++i] = Fg.AddLine(-dw/10, wf, dw, wf); // верхняя граница паза
Line[++i] = Fg.AddLine(-dw/10, -dw/10, -dw/10, wf); // левая вертикальная
Line[++i] = Fg.AddLine(lf/4, lf, lf/4, wf-lf); // правая вертикальная
Line[++i] = Fg.AddLine(lf/4, wf-lf, dw, wf);// верхняя наклонная
Line[++i] = Fg.AddLine(lf/4, lf, dw, -dw/10);// нижняя наклонная
var hz = okrugl(lz*0.866025403784439, 3); // lz*√3/2 = "шаг резьбы" х 0.866025403784439
var dn = okrugl(c - hz, 1); //номинальный диаметр резьбы
//alert("диаметр контура" + dn );
Line[++i] = C.AddCircle(0, 0, okrugl(dn/2 , 3) ); // добавляем отверстие в панель
Panel.Name = 'Гайка шестигранная, М'+ okrugl(a+lz, 0) + 'х' + okrugl(Panel.Thickness, 1);
Panel.ArtPos = 'ГОСТ 5927-70(DIN 934)';
var rezba = Panel.AddCut('Резьба М'+ okrugl(a+lz, 0));
rezba.Trajectory.AddCircle(0, 0, okrugl(dn-0.01, 3) /2)
var zub = rezba.Contour;
rezba.Name = 'Резьба М'+ okrugl(a+lz, 0);
rezba.Sign = 'М'+ okrugl(a+lz, 0);
//++++++++++++++++++++++++++++
// котур контур нарезки резьбы
qWf = okrugl((wf+lz)/lz -1, 0); //количество витков резьбы
//alert("количество витков резьбы " + qWf);
grN = wf/2 - qWf*lz/2 // расчет горизонтальной оси
for (var id_l = 0;id_l < qWf; ++id_l )
{
Line[++i] = zub.AddLine(0, lz, hz, lf);// верхняя наклонная
Line[++i] = zub.AddLine(hz, lf, 0, 0);// верхняя наклонная
zub.Move(0, lz)
}
zub.Move(-0, -lz)
Line[++i] = zub.AddLine(0, 0, 2*lz,0);// горизонтальная
Line[++i] = zub.AddLine(2*lz,0, 2*lz, qWf*lz);// вертикальная
Line[++i] = zub.AddLine(2*lz, qWf*lz, 0,qWf*lz);// горизонтальная
//alert("зуб замкнут " + zub.IsClosedContour());
zub.Move(-hz/5*4, -lf*0.7)
//++++++++++++++++++++++++++++++++++
[свернуть]
Добавлено через 4 минуты
Тело по траектории нельзя сверлить или присаживать, а вот профилированную панель можно
Скрипт строит профильную трубу нужного сечения и толщины стенок
PHP код:
function okrugl(ch, n) {
// функция округления числа с заданной точностью
// ch - число
// n - количество знаков
if(isNaN(ch) || isNaN(n)) return false;
var m = Math.pow(10,n);
return Math.round(ch*m)/m;
}
/* контур прямой прфильной или круглой трубы*/
var w_ = 40; //ширина рофиля
var h_ = 25; //толщина профиля
var tS = 2.5; //толщина стенки
var rTs = okrugl(tS*0.292893, 3)
var Panel = AddPanel(w_, 1000);
Panel.Thickness = h_; // //Толщина гайки
Panel.Name = 'Труба профильная';
Panel.MaterialName = 'Труба ' + h_ +"x"+ w_ +"x"+tS;
var point = Panel.GabMin;
var Rect = [];
var ip = 0;
var pr = Panel.AddCut('профиль трубы '+ w_ +"x"+ h_ +"x"+tS); //фрезеруем профиль
pr.Trajectory.AddLine(point.x+w_, point.y, point.x+w_, point.y+1000); // траектория паза)
var fr = pr.Contour; //fr - это контур паза
var stik = NewContour(); //контур вычитаемого стыка
Rect[++ip] = fr.AddRoundRect(0.025, 0.025, w_-0.025, h_- 0.025, tS);
Rect[++ip] = fr.AddRectangle(-0.5,-0.005, w_+0.005, h_+0.005);
Rect[++ip] = fr.AddRectangle(tS, tS, w_-tS, h_-tS);
Rect[++ip] = stik.AddRectangle(tS,h_+0.03, w_ - tS, h_-0.03);
fr.Subtraction(stik)
Rect[++ip] = stik.AddRectangle(w_/2,-0.005, w_/2+0.005, tS+1);
fr.Addition(stik)
Rect[++ip] = fr.AddLine(w_ - tS, h_-0.025, w_-tS, h_+0.005);
[свернуть]
__________________
С уважением Кузнецов Александр
|
|
|
6 пользователя(ей) сказали cпасибо:
|
|
20.06.2020, 12:36
|
#68
|
Местный
Регистрация: 11.04.2018
Адрес: г.Маркс
Сообщений: 162
Сказал(а) спасибо: 57
Поблагодарили 242 раз(а) в 45 сообщениях
Вес репутации: 137
|
Просмотр свойств объекта
Работает в версии 8.
В переменную "о" вносим нужные нам свойства и получаем значения. В примере укажите евровинт и узнаете много нового о нем). Писал для себя, чтоб найти примерно где и что. Хотелось бы в него внести, что то , но сам не знаю что).
Код HTML:
var obj = GetObject("Укажите объект");
//Вносим нужные функции
var o = obj.Holes.List[1];
var st = 'Список значений';
for(var k in o){
st = st + '\n' + ( "Ключ: " + k + " значение: " + o[k] ) ;
}
alert('Oбъект ' + o + '\n' + st);
|
|
|
3 пользователя(ей) сказали cпасибо:
|
|
14.10.2020, 10:04
|
#69
|
Пользователь
Регистрация: 22.07.2014
Адрес: Sochi
Сообщений: 83
Сказал(а) спасибо: 143
Поблагодарили 134 раз(а) в 36 сообщениях
Вес репутации: 153
|
Выделение по маске.
Параметры выделения:
1) Кромка.
2) Паз.
3) Имя панели.
4) Имя панели содержит.
5) Контур не прямоугольный.
6) Контур с дугами или окружностями.
Версии:
10
11
|
|
|
11 пользователя(ей) сказали cпасибо:
|
|
14.10.2020, 13:01
|
#70
|
Местный
Регистрация: 12.01.2008
Адрес: Украина
Сообщений: 345
Сказал(а) спасибо: 8,120
Поблагодарили 1,244 раз(а) в 242 сообщениях
Вес репутации: 481
|
Выделение по маске,Dmitry Silaev выложил в телеграмм канале BazissofT, больше функционала для выделения.
|
|
|
22 пользователя(ей) сказали cпасибо:
|
|
|
|
|
Нижняя навигация
|
|
Опции темы |
|
Опции просмотра |
Линейный вид
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 21:21. Часовой пояс GMT +3.
|