Форум профессиональных мебельщиков PROMEBELclub
 
PROMEBELclub - Форум для мебельщиков: конструкторов, дизайнеров, мастеров, технологов и всех, кто имеет отношение к производству и изготовлению мебели. Программы для конструирования и дизайна мебели. Мебельная литература и обучающие пособия.
 
 

Вернуться   Форум профессиональных мебельщиков PROMEBELclub > Программы для мебельщиков > Программы для конструирования и дизайна мебели > Система БАЗИС > Базис-мебельщик. Скрипты

Меню

Маркет


беспроводные выключатели для мебели
Ответ
 
Опции темы Опции просмотра
Старый 13.01.2014, 13:22  
БАЗИС 8 - Скрипты
 
Аватар для Igor_482
Igor_482
VIP
Регистрация: 03.09.2008
Сообщений: 174

Сказал(а) спасибо: 34
Поблагодарили 794 раз(а) в 113 сообщениях
Версия для печати Отправить по электронной почте
Igor_482 Igor_482 вне форума 13.01.2014, 13:22
Рейтинг: ()

ВНИМАНИЕ! Правила выкладывания скриптов.

1. Если в скрипте нет ссылок на фурнитуру, фрагменты и.т.д то достаточно его упаковать в архив и выложить.

2. Если в скрипте есть ссылки на фурнитуру, фрагменты и т.д. то архив должен содержать папку с самим скриптом и всеми файлами на которые есть ссылки в тексте скрипта.


Т.к. при запуске скрипта на другом компе возникает ошибка о не возможности открыть то или иной файл и скрипт до конца не отрабатывает свой текст. Не соблюдается "чистота проверки" работы скрипта.

__________________________________________________ _______________

Интересует информация по редактору скриптов в БМ8. Существует ли справочная документация и примеры использования скриптов в БМ8. Какие возможности дает данная функция? Владеющим информацией по данному вопросу просьба поделиться ею.

Новое в скриптописании для БМ:

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

while (true)
Вот полный список новшеств, добавленных в скрипты с момента их выхода:

14 декабря 2014

Добавлена поддержка эластичных блоков

List3D : {
IsElastic: new HDefinition("?Boolean:", 'Являетсяли объект эластичным'),
ElasticResize: new HDefinition("?Vector:newSize", 'Растянуть объект до требуемых размеров'),
}

27 ноября 2014

Вспомогательные геометрические алгоритмы, реализованы в глобальном объекте geometry

geometry : new HDefinition("Geometry2D", 'Вспомогательные геометрические функции'),

Geometry2D : {
Intersect: new HDefinition("?Array.<Point>:elem1,elem2", 'Вычислить точки пересечения двухмерных элементов'),
Compare: new HDefinition("?Boolean:elem1,elem2", 'Сравнить элементы'),
Distance: new HDefinition("?Number:elem1,elem2", 'Найти кратчайшее расстояние между элементами'),
Area: new HDefinition("?Number:contour", 'Найти площадь контура')
}

17 ноября 2014

Работа с пользовательскими свойствами

Object3 : {
UserPropCount: new HDefinition("Number", 'Количество пользовательских свойств'),
UserProperty: new HDefinition('Array.<Object>', 'Значение свойства по его имени или индексу'),
UserPropertyName: new HDefinition('Array.<String>', 'Названия свойств')
}

Новые элементы управления на панели свойств

ScriptProperty: {
NewColor: new HDefinition("?ScriptColorProperty:'Название'", 'Создать свойство типа цвет'),
NewSeparator: new HDefinition("?ScriptProperty", 'Создать разделитель')
}

ScriptColorProperty: {
Value: new HDefinition("Number")
},

----------------------------------------------------------------------------------------------------
29 сентября 2014

system.apiVersion = 90 -> Bazis9
system.apiVersion = 85 -> Bazis8

----------------------------------------------------------------------------------------------------
15 сентября 2014

Contour2D : {
Min: new HDefinition("Point", 'Левый нижний угол охватывающего прямоугольника'),
Max: new HDefinition("Point", 'Правый верхний угол охватывающего прямоугольника'),
AddEquidistant : new HDefinition("?undefined:contour,offset,false,false", 'Добавить эквидистанту контура. Последние 2 параметры отвечают за направление и скругление')
}

ScriptProperty: {
OnDeactivate : new HDefinition("Function", 'Обработчик деактивации свойства или меню'),
OnValueValidate : new HDefinition("Function", 'Проверка корректности значения'),
ValueValid: new HDefinition("Boolean", 'Флаг корректности введенного значения, выставляется обработчиком OnValueValidate'),
Validate: new HDefinition("?Boolean:", 'Проверить значение свойства и вложенных свойств')
}

----------------------------------------------------------------------------------------------------
2 сентября 2014

ScriptProperty: {
NameEditable: new HDefinition("Boolean", 'Разрешить редактирование имени (для создания таблиц)'),
NewSeparator: new HDefinition("?ScriptProperty", 'Создать разделитель')
}

----------------------------------------------------------------------------------------------------
9 августа 2014

Добавлены подменю в кнопки

InButton : {
NewSubMenu : new HDefinition('?InButton:"Меню"', 'Создать подменю'),
Combo: new Definition("Boolean", 'Отдельная стрелка для подменю')
},

Добавлены всплывающие меню и цвет фона для всех свойств. Созданы обработчики активации и изменения свойства.
Прежнее событие OnChange срабатывало не только при изменении самого параметра, но и при изменении дочерних свойств.
OnValueChange срабатывает только при изменении значения свойства.

ScriptProperty: {
BackColor: new HDefinition("Number", 'Цвет фона'),
PopupMenu: new HDefinition("ScriptMenu", 'Всплывающее меню'),
OnActivate : new HDefinition("Function", 'Обработчик активации свойства пользователем'),
OnValueChange : new HDefinition("Function", 'Обработчик изменения свойства')
Tag: new HDefinition("Number", 'Пользовательское число'),
}

Добавлено выпадающее меню:

ScriptProperty: {
DropDownMenu: new HDefinition("ScriptMenu", 'Выпадающее меню')
}

----------------------------------------------------------------------------------------------------
21 апреля 2014:

Добавлены свойства и методы:

ScriptMaterialProperty: {
Width: new HDefinition("Number", "Ширина листа"),
}

ScriptButtProperty: {
Thickness: new HDefinition("Number", "Толщина кромки"),
Width: new HDefinition("Number", "Ширина ленты"),
}

Contour2D : {
IsPointInside: new HDefinition("?Boolean:x,y", "Находится ли точка внутри контура?"),
IsInContour: new HDefinition("?Boolean:contour", "Находится ли контур внутри другого?"),
IsClosedContour: new HDefinition("?Boolean:", "Является ли контур замкнутым?"),
IsContourRectangle: new HDefinition("?Boolean:", "Является ли контур прямоугольным?"),
OrderContours: new HDefinition("?Boolean:true", "Упорядочить элементы контура в одном направлении")
}


----------------------------------------------------------------------------------------------------
6 февраля 2014

Реализовано подключение и вызов функций COM и OLE объектов

ScriptProperty : {
Expanded: new HDefinition("Boolean", 'Развернуты ли вложенные свойства')
}

Добавлен метод:
NewCOMObject: new HDefinition("?IDispatch:'CLSID'", 'Создать новый COM объект по его типу')
[свернуть]

Нажмите на изображение для увеличения
Название: Базис.jpg
Просмотров: 1496
Размер:	36.4 Кб
ID:	86248

Обратите внимание на полезные ответы в этой теме!


Последний раз редактировалось systland; 26.12.2017 в 11:52.. Причина: Добавил объявление.
Просмотров: 1378896
Ответить с цитированием Вверх
6 пользователя(ей) сказали cпасибо:
Старый 02.10.2014, 14:37   #521
Am0ralist
Местный
 
Регистрация: 16.11.2011
Адрес: Москва / Пенза
Сообщений: 1,135
Сказал(а) спасибо: 307
Поблагодарили 1,257 раз(а) в 524 сообщениях
Вес репутации: 515
Am0ralist за этого человека можно гордитсяAm0ralist за этого человека можно гордитсяAm0ralist за этого человека можно гордитсяAm0ralist за этого человека можно гордитсяAm0ralist за этого человека можно гордитсяAm0ralist за этого человека можно гордитсяAm0ralist за этого человека можно гордитсяAm0ralist за этого человека можно гордитсяAm0ralist за этого человека можно гордится
По умолчанию

Цитата:
Сообщение от Briz Посмотреть сообщение
удалять объекты в цикле Model.forEach - плохая затея. Нужно сперва добавить объекты в массив, затем удалить
Не можете помочь еще с одним вопросом?
все решаю задачу о том, как вытащить из сборки все вложенные элементы.
Вот решение "в лоб":

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


VlogzenObj = [];
for(j=0;j<=Asm.length-1;j++) //Asm[] - одномерный массив сборок, которые необходимо разрушить
{
VlogzenObj[j]=[];//инициирую массив массивов
};

Model.forEach
(function(Obj)
{
for(j=0;j<=Asm.length-1;j++)
{
if(Obj.Owner.UID == Asm[j].UID)
{
VlogzenObj[j].push(Obj);//заполняю массив вложенных объектов
};
};
}
)

for(j=0;j<=Asm.length-1;j++)
{
for(i=0;i<=VlogzenObj[j].length-1;i++)
{
koor = VlogzenObj[j][i].ToGlobal(NewVector(0, 0, 0));
VlogzenObj[j][i].Owner = Asm[j].Owner;//меняю владельца вложенных объектов
VlogzenObj[j][i].Position = koor;//препятствую изменению глобальных координат объектов
};
}
[свернуть]

Работает, но медленно Решил прооптимизировать и воспользоваться возможностью получить элемент списка по индексу через метод List3D - Objects (ну и свойства Count), как умный типа

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


for(j=Asm.length-1;j>=0;j--)
{
for(i=Asm[j].Count-1;i>=0;i--)
{
Sbor = Asm[j].Objects[i];
if(Sbor.Owner.UID == Asm[j].UID)
{
koor = Sbor.ToGlobal(NewVector(0, 0, 0));
Sbor.Owner = Asm[j].Owner;
Sbor.Position = koor;
};
};
}
[свернуть]

Так вот, работает то быстрее, но объекты не сохраняют своих глобальных координат и смещаются куда попало от первоначального нахождения объекта...
__________________
Нахожусь в режиме поиска интересных задач, связанных с Базисом. Москва, 2015.
Am0ralist вне форума   Ответить с цитированием Вверх
Пользователь сказал cпасибо:
v22884 (03.10.2014)
Старый 02.10.2014, 16:06   #522
Briz
Местный
 
Регистрация: 30.11.2011
Сообщений: 283
Сказал(а) спасибо: 275
Поблагодарили 803 раз(а) в 179 сообщениях
Вес репутации: 358
Briz - просто великолепная личностьBriz - просто великолепная личностьBriz - просто великолепная личностьBriz - просто великолепная личностьBriz - просто великолепная личностьBriz - просто великолепная личностьBriz - просто великолепная личность
По умолчанию

function Ungroup(Group) {
for (i = Group.Count - 1; i >= 0; i--) {
Sbor = Group.Objects[i];
Undo.Transforming(Sbor);
Undo.OwnerChanging(Sbor);
Sbor.ReTransform(Group, Group.Owner);
Sbor.Owner = Group.Owner;
}
}
// пример:
Ungroup(Model.Selected);
Briz вне форума   Ответить с цитированием Вверх
6 пользователя(ей) сказали cпасибо:
Старый 03.10.2014, 08:07   #523
v22884
Местный
 
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 241
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
v22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордится
По умолчанию

Йищёо чуть исправленные подпятники(на вытянутых вниз не правильно ставились) :

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



FileOptions = 'Подпятники Основные настройки.xml';










MakeProperties();

Action.Properties.Load(FileOptions);



Action.OnFinish = function() {
Action.Properties.Save(FileOptions);
}
BtnMake = NewButtonInput('Закончить');
BtnMake.OnChange = function() {
Make(); //Вызываем функцию построения всех панелей
Action.Finish();
}


Make();



Action.Continue();













true;





//////////////////////////////////////////


//////////////////////////////////////////

////////////////////////////////////////// --------- ОКНО СВОЙСТВ


function MakeProperties() {

Prop = Action.Properties;



otsPered = Prop.NewNumber('Отступ Перед',50);
otsZad = Prop.NewNumber('Отступ Зад',70);


K_row = Prop.NewNumber('Количество на деталь',2);

K_row.OnChange = function() {

if (K_row.Value<1) {

K_row.Value=1
}
}

Krepej = Prop.NewFurniture('Ножки в торец или подпятники');
V_razniyeStorony = Prop.NewBool('В разные стороны')
V_Drugiye_razniyeStorony = Prop.NewBool('В ДРУГИЕ разные стороны')
PovernutDop = Prop.NewCombo('Развернить ножку на X', '0\n90\n180\n270');
PovernutDopY = Prop.NewCombo('Развернить ножку на Y', '0\n90\n180\n270');
PovernutDopZ = Prop.NewCombo('Развернить ножку на Z', '0\n90\n180\n270');
OtrazitX = Prop.NewBool('Отразить X')
OtrazitY = Prop.NewBool('Отразить Y')
OtrazitZ = Prop.NewBool('Отразить Z')



OkBtn = Prop.NewButton('Построить',true);


OkBtn.OnClick = function() {
Make(); //Вызываем функцию построения всех панелей
Action.Finish();
}







Prop.OnChange = function() {
//if (Fas.Value > Hd.Value) alert('Предупреждение! Фаска больше чем высота дна.')
Make(); //Вызываем функцию построения всех панелей
};


}





//Obj = Model.Selected;


function Make()
{
DeleteNewObjects();
//FileFreza = 'Фреза1.frw';
// conturFrezi=NewContour();
// conturFrezi.Load(FileFreza);
Model.forEach (function(Obj) {

if (Obj.Selected == true)

{
Nojki(Obj)




}
} )





}

function Nojki(Obj) {

//if (system.fileExists(Krepej.Value))
if (Krepej.Value)
{


otsPered_=otsPered.Value;
otsZad_=otsZad.Value;

ryadov = K_row.Value;


lnpv = GabarityContura(Obj);


ln =lnpv[0];
pv = lnpv[1];



//Niz = OpredelitNiz(Obj, ln, pv)

// NizWdol = p.ContourWidth
// NizH = p.ContourHeight

// пока не определили

if(V_razniyeStorony.Value)
{

ugolPovorotaPered=(-(135+(90*(ryad-1)/(ryadov-1)))) + Math.round(PovernutDop.Value)
ugolPovorotaZad=(-(45-(90*(ryad-1)/(ryadov-1)))) + Math.round(PovernutDop.Value)

}
else
{

ugolPovorotaPered=0
ugolPovorotaZad=0
}







mejdu_ryadov = (pv.x-ln.x-otsPered_-otsZad_)/(ryadov-1)

seredinaX = ln.x + (pv.x - ln.x) / 2

if (Math.round(ryadov)==1)
{

p1 = NewPoint(seredinaX, ln.y)

podp = Ustanovit1Krepiyoj(Obj, p1, ugolPovorotaPered)


}
else if (ryadov>1)
{
p1 = NewPoint( pv.x - otsPered_ , ln.y)

Ustanovit1Krepiyoj(Obj, p1, ugolPovorotaPered)

otsZad_ = ln.x + otsZad_
p1 = NewPoint(otsZad_, ln.y)


Ustanovit1Krepiyoj(Obj, p1, ugolPovorotaZad)

ryad=3

while (ryad<ryadov+1)
{







p1 = NewPoint(otsZad_+mejdu_ryadov*(ryad-2), ln.y)





Ustanovit1Krepiyoj(Obj, p1, ugolPovorotaPered)



ryad++;
}
}
//Niz.Free()

}


}

function Ustanovit1Krepiyoj(Obj, p1, ugolPovorota, drstorona ) {


pos = Obj.ObjectToGlobal(NewVector(p1.x, p1.y,0))


podp = Krepej.Value.Mount1(Obj, pos, ugolPovorota);



podp.Rotate(podp.NToGlobal(AxisX), Math.round(PovernutDop.Value) * (Math.PI / 180))
podp.Rotate(podp.NToGlobal(AxisY), Math.round(PovernutDopY.Value) * (Math.PI / 180))
podp.Rotate(podp.NToGlobal(AxisZ), Math.round(PovernutDopZ.Value) * (Math.PI / 180))
// podp.Translate(NewVector(SmestitX.Value, SmestitY.Value, SmestitZ.Value))

return podp
}


function OpredelitNiz(Obj, ln, pv)
{
//Obj = Obj.AsPanel
tolshina = Obj.Thickness;
ln_ = Obj.ObjectToGlobal(ln);
pv_ = Obj.ObjectToGlobal(pv);
p = AddPanel(pv.x, tolshina)
p.Thickness = 0.000000001;
p.Translate(ln_)
p.Rotation = Obj.Rotation
p.Rotate(p.NToGlobal(AxisX), 90)

return p

}



function GabarityContura(Obj)

{
var text = '';


ln = NewPoint(0, 0); //левый низ
lv = NewPoint(0, 0); //левый верх
pn = NewPoint(0, 0); //правый низ
pv = NewPoint(0, 0); //правый верх контура

kontur = Obj.Contour;

kstoron = kontur.Count;
// var k_ne_krugov = 0;
for (i = 0; i < kstoron; i++) {
if (kontur[i].ElType != 3) { //k_ne_krugov = k_ne_krugov+1

ln = NewPoint(Math.round(kontur[i].Pos1.x * 10) / 10, Math.round(kontur[i].Pos1.y * 10) / 10);
lv = NewPoint(Math.round(kontur[i].Pos1.x * 10) / 10, Math.round(kontur[i].Pos1.y * 10) / 10);
pn = NewPoint(Math.round(kontur[i].Pos1.x * 10) / 10, Math.round(kontur[i].Pos1.y * 10) / 10);
pv = NewPoint(Math.round(kontur[i].Pos1.x * 10) / 10, Math.round(kontur[i].Pos1.y * 10) / 10);
}

};



for (i = 0; i < kstoron; i++) {
if (kontur[i].ElType != 3) {
Pos1x = Math.round(kontur[i].Pos1.x * 10) / 10;
Pos1y = Math.round(kontur[i].Pos1.y * 10) / 10;
Pos2x = Math.round(kontur[i].Pos2.x * 10) / 10;
Pos2y = Math.round(kontur[i].Pos2.y * 10) / 10;


if (ln.x > Pos1x) {
ln.x = Pos1x
};
if (ln.x > Pos2x) {
ln.x = Pos2x
};
if (ln.y > Pos1y) {
ln.y = Pos1y
};
if (ln.y > Pos2y) {
ln.y = Pos2y
};

if (lv.x > Pos1x) {
lv.x = Pos1x
};
if (lv.x > Pos2x) {
lv.x = Pos2x
};
if (lv.y < Pos1y) {
lv.y = Pos1y
};
if (lv.y < Pos2y) {
lv.y = Pos2y
};

if (pn.x < Pos1x) {
pn.x = Pos1x
};
if (pn.x < Pos2x) {
pn.x = Pos2x
};
if (pn.y > Pos1y) {
pn.y = Pos1y
};
if (pn.y > Pos2y) {
pn.y = Pos2y
};

if (pv.x < Pos1x) {
pv.x = Pos1x
};
if (pv.x < Pos2x) {
pv.x = Pos2x
};
if (pv.y < Pos1y) {
pv.y = Pos1y
};
if (pv.y < Pos2y) {
pv.y = Pos2y
};

}
};

text4 = ('ln ---- ' + ln.x + ' - ' + ln.y + '\n' +
'lv ---- ' + lv.x + ' - ' + lv.y + '\n' +
'pn ---- ' + pn.x + ' - ' + pn.y + '\n' +
'pv ---- ' + pv.x + ' - ' + pv.y + '\n');
// alert(text4);
ln_v = ln; //левый низ выреза
pv_v = pv; //правый верх выреза

if (ln_v.x < lv.x) {
ln_v.x = lv.x
};
if (ln_v.y < pn.y) {
ln_v.y = pn.y
};

if (pv_v.x > pn.x) {
pv_v.x = pn.x
};
if (pv_v.y > lv.y) {
pv_v.y = lv.y
};





SeredinaVisotiPaneli = (pv_v.y - ln_v.y) * 0.5;
SeredinaShiriniPaneli = (pv_v.x - ln_v.x) * 0.5;






lnpv = []




lnpv.push(ln_v);
lnpv.push(pv_v);



return lnpv
}




[свернуть]
v22884 вне форума   Ответить с цитированием Вверх
6 пользователя(ей) сказали cпасибо:
Старый 04.10.2014, 03:00   #524
v22884
Местный
 
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 241
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
v22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордится
По умолчанию

Есть ли возможность Базис скриптом съмулировать нажания клавиш и сочетаний?

или скопировать выделенные в новую модель и сохранить по заданному пути?

наверно рыть в сторону NewCOMObject?

Сообщите, пожалуйста, стоящую ссылку по использованию NewCOMObject.

Последний раз редактировалось v22884; 04.10.2014 в 04:11.
v22884 вне форума   Ответить с цитированием Вверх
Старый 05.10.2014, 07:28   #525
v22884
Местный
 
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 241
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
v22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордится
По умолчанию

Предъистория:
Верхняя задача: отправка в раскрой полностью автоматически, то есть без участия человека.

Для этого надо, чтоб файлы моделей были разложенны по определённым правилам, и т.п. и т.д.

Один из пунктов подготовки файлов: разложить модель на файл "прямых"(в прямолинейный раскрой) и файл "кривых"(в криволинейный раскрой).

Задача: Выделить "Кривые".
"Прямые" -- 1) прямоугольные,
2) треугольники
3) прямоугольные с любым количеством фасок(от 0 до 4) любого размера,
4) прямоугольные с любым количеством сопряжений(от 0 до 4) радиусом не более 30мм.
"Кривые" -- не "Прямые".

Решение:

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



UnSelectAll();


Model.forEachPanel(function(obj) {
if (!obj.IsContourRectangle)


{

if (Triugilnik_Li(obj))

{

// obj.Selected = true;


} else

{

if (!Na4uglahTolkoFaski_i_SkrugleniyaNebolshe30mm(obj)) {

obj.Selected = true;

}



}
//obj.Selected = true;


}
})

function Triugilnik_Li(obj)

{
c = obj.Contour
ck = c.Count
if (ck == 3) {

for (i = 0; i < ck; i++) {
if (!(c[i].ElType == 1)) {
return false
}
}

return true


} else {
return false
}

}


function Na4uglahTolkoFaski_i_SkrugleniyaNebolshe30mm(obj)

{
c = obj.Contour
ck = c.Count


// маскимум элементов 8 (если конечно не ящик с фигурным вырезом вместо ручки)
//возвращаем да если нет кругов
//если есть 4 стороны соответствующие сторонам прямоугольного габарита панели
// если на углах этих сторон либо просто угол 90,
//либо фаска то есть 1 линия от одной стороны до другой стороны,
// либо 1 дуга радиусом не более 30мм от одной стороны до другой


if (ck > 8) {
// докодить случай с ящиком
return false
} else {
if (yestKrugi(obj)) {

return false
} else {

MassStoron = StoronyVdolPriamougolnika(obj)
Storony = MassStoron[0]

if (Storony.length == 4) {

if (tolkoFaski_i_SkrugleniyaDo30mm(c, MassStoron)) {

// alert('tolkoFaski_i_SkrugleniyaDo30mm')
return true

}
else
{

// return true
return false
}
}






}
return false
}
}

function tolkoFaski_i_SkrugleniyaDo30mm(c, MassStoron) {
//здесь у нас всегда 4 стороны
// но сколько дуг или линий между ними не известно
//поэтому надо однозначно убедится что
//в каждом углу не болеечем по 1линии или по 1 дуге
// чтоб убедиться что нет внутреннего триугольника или четырёхугольника
Storony = MassStoron[0]
StoronyGde = MassStoron[1]

ck = c.Count
kolichestvoPoschitannyhStoron = 4
lnpv = GabarityContura(obj);


ln = lnpv[0];
pv = lnpv[1];

//---------------------
lv_sostoyaniye = S_Uglom_Vsio_Horosho('verh', 'levo', NewPoint(ln.x, pv.y), ln, pv, c, MassStoron)

lv_ok = lv_sostoyaniye[0]
kolichestvoPoschitannyhStoron = kolichestvoPoschitannyhStoron + lv_sostoyaniye[1]
if (!lv_ok)
{
// alert('плохой контур')
return false
} else {

//---------------------
pv_sostoyaniye = S_Uglom_Vsio_Horosho('verh', 'pravo', pv, ln, pv, c, MassStoron)

pv_ok = pv_sostoyaniye[0]
kolichestvoPoschitannyhStoron = kolichestvoPoschitannyhStoron + pv_sostoyaniye[1]
if (!pv_ok)
{
// alert('плохой контур')
return false
} else {
//---------------------
ln_sostoyaniye = S_Uglom_Vsio_Horosho('niz', 'levo', ln, ln, pv, c, MassStoron)

ln_ok = ln_sostoyaniye[0]
kolichestvoPoschitannyhStoron = kolichestvoPoschitannyhStoron + ln_sostoyaniye[1]
if (!ln_ok)
{
// alert('плохой контур')
return false
} else {
//---------------------
pn_sostoyaniye = S_Uglom_Vsio_Horosho('niz', 'pravo', NewPoint(pv.x, ln.y), ln, pv, c, MassStoron)

pn_ok = pn_sostoyaniye[0]
kolichestvoPoschitannyhStoron = kolichestvoPoschitannyhStoron + pn_sostoyaniye[1]
if (!pn_ok)
{
// alert('плохой контур')
return false
} else {

if (ck==kolichestvoPoschitannyhStoron)
{
// alert('хороший контур')
return true
} else
{
// alert('плохой контур')
return false
}
}}}}

}





function S_Uglom_Vsio_Horosho(imia1, imia2, tochkaUgla, ln, pv, c, MassStoron) {
//левый верхний угол-------------------------
//берём сторону "верх"
//берём сторону "лево"
//проверяем не соеденены ли они по ближним к углу(в_лв,л_лв) поз1 или поз2
//если нет, то перебором элементов контура ищем по в_лв/л_лв точкам
// дугу или линию у которой и поз1 и поз2 должны быть соеденены
//с в_лв/л_лв
//если Дуга проверяем, что от угла контура в_лв/л_лв на равном расстоянии
//равном радиусу Дуги и и этот радиус не более 30мм.
// далее с остальными тремя углами также.
// ---не-ВСЁ!!! -- проверить все ли элементы контура проверели
// в контуре всё ещё могут пройти вариации из дуг и линий числом не больше 4
// поэтому надо посчитать не соеденённые под 90гр углы и сравнить их количество
//с количеством элементов контура
// теперь вроде всё...(пока)

Storony = MassStoron[0]
st1 = DayStoronu(MassStoron, imia1)
st2 = DayStoronu(MassStoron, imia2)

// alert(c + ' -- ' +st1+ ' - ' +st2 + ': ' + c[st1].Pos1.x + '; ' +c[st1].Pos1.y)



toshka_st1 = blijniaya(tochkaUgla, c[st1])
toshka_st2 = blijniaya(tochkaUgla, c[st2])

// alert(imia1+ ' - ' +imia2 + ': ' + toshka_st1.x + '; ' +toshka_st1.y)

sostoyaniye = [];


if (!((toshka_st1.x == toshka_st2.x) && (toshka_st1.y == toshka_st2.y))) {
// alert("Стороны не соеденены!")

//alert(el == c[Storony[0]])
if (soyedenenyLiLiniyey_ili_DugoyDo30mm(toshka_st1, toshka_st2, tochkaUgla, ln, pv))
//(!(el.x == c[Storony[0]])) && (!(el == c[Storony[1]]))
//&& (!(el == c[Storony[2]]))&& (!(el == c[Storony[3]])) )


{
sostoyaniye.push( true ,1)

return sostoyaniye

//return true
} else {

// return false
sostoyaniye.push( false ,0)

return sostoyaniye
}


} else {


sostoyaniye.push( true ,0)

return sostoyaniye
}





}

function soyedenenyLiLiniyey_ili_DugoyDo30mm(t1, t2, tochkaUgla, ln, pv) {
for (i = 0; i < ck; i++) {
el = c[i]

x1 = okr(el.Pos1.x)
x2 = okr(el.Pos2.x)
y1 = okr(el.Pos1.y)
y2 = okr(el.Pos2.y)

// p = AddPanel(50, 50)
// p.Translate(obj.ToGlobal(el.Pos1))
// p = AddPanel(50, 50)
// p.Translate(obj.ToGlobal(el.Pos2))

//alert(t1.x+ ' -- ' +t2.x+ ' -- ' +x1+ ' -- ' +x2)
//alert ((x2==t1.x && y2==t1.y))





if (((x1 == t1.x && y1 == t1.y) && (x2 == t2.x && y2 == t2.y)) || ((x2 == t1.x && y2 == t1.y) && (x1 == t2.x && y1 == t2.y))) {
//alert(el)
if (el.ElType == 2) {
rad = el.ArcRadius()
// alert(rad < 21)
if (rad > 30) {
return false
} else {
// предпологается что токое скругление всегда обычное сопряжение
//, а не какое-нибудь хитрое соединение дугой
//хотя конечно варианты лучше обработать: оно ж может быть и во внутрь!!!

if (obychnoyeLiSopriajeniye(el, t1, t2, tochkaUgla, ln, pv))
{ return true} else { return false}






}

} else {
return true
}

}

}
return false
}

function obychnoyeLiSopriajeniye(el, t1, t2, tochkaUgla, ln, pv)
{
rad = el.ArcRadius()
conturProverki = NewContour()
cp = conturProverki
cp.AddRectangle(ln.x, ln.y, pv.x, pv.y)
skrDuga = cp.Rounding(tochkaUgla.x, tochkaUgla.y, rad);
// alert(skrDuga)
// pp1 = AddPanel(0, 0)
// pp1.Contour.Clear()
// pp1.Contour.Addition(cp)

cX_el = okr(el.Center.x )
cY_el = okr(el.Center.y )
cX_skr = okr(skrDuga.Center.x )
cY_skr = okr(skrDuga.Center.y )

if (cX_el == cX_skr && cY_el == cY_skr)
{
return true
}
else {
return false
}



}
function blijniaya(tochkaKontura, storona) {

//здесь всегда storona - линия вдоль измерения x или y

xx = okr(tochkaKontura.x)

yy = okr(tochkaKontura.y)

x1 = okr(storona.Pos1.x)
x2 = okr(storona.Pos2.x)


y1 = okr(storona.Pos1.y)
y2 = okr(storona.Pos2.y)


// alert ('Здесь - '+xx + ' -- ' + x1+ ' -- ' + x2)


if (x1 == x2) {
x_ = x1
if (Math.abs(yy - y1) < Math.abs(yy - y2)) {
y_ = y1
} else {
y_ = y2
}
} else
y_ = y1
if (Math.abs(xx - x1) < Math.abs(xx - x2)) {
x_ = x1
} else {
x_ = x2
}

ppp = NewPoint(x_, y_)
return ppp


}

function DayStoronu(MassStoron, imia) {
Storony = MassStoron[0]
StoronyImia = MassStoron[1]

for (i = 0; i < Storony.length; i++) {
//alert( StoronyImia[i] +' - ' +imia + ' - ' + Storony[i]+ ' - ' +Storony.length)
if (StoronyImia[i] == imia) {
// alert( 'Возврат - ' + Storony[i])
return Storony[i]
}
}
alert("Какая-то ошибка!!!\n -- Нет такого имени в названиях сторон.")

}

function yestKrugi(obj) {
c = obj.Contour
ck = c.Count

for (i = 0; i < ck; i++) {
if ((c[i].ElType == 3)) {
return true
}
}

return false




}





function StoronyVdolPriamougolnika(obj) {
c = obj.Contour
ck = c.Count

w = c.Width
h = c.Hight

lnpv = GabarityContura(obj);


ln = lnpv[0];
pv = lnpv[1];

niz = okr(ln.y)
levo = okr(ln.x)
verh = okr(pv.y)
pravo = okr(pv.x)

Storony = [];
StoronyGde = [];
kl = 0
for (i = 0; i < ck; i++) {
if ((c[i].ElType == 1)) {




x1 = okr(c[i].Pos1.x)
x2 = okr(c[i].Pos2.x)

y1 = okr(c[i].Pos1.y)
y2 = okr(c[i].Pos2.y)

// alert(x1 +' -- ' + x2 +' -- ' + levo +'\n'+
// x1 +' -- ' + x2 +' -- ' + pravo +'\n'+
// y1 +' oo ' + y2 +' oo ' + verh +'\n'+
// y1 +' -- ' + y2 +' -- ' + niz )


//if (

if (x1 == x2 & x1 == levo) // |
{

StoronyGde.push('levo');
Storony.push(i);
kl = kl + 1
}

if (x1 == x2 & x1 == pravo) // | ==
{

StoronyGde.push('pravo');
Storony.push(i);
kl = kl + 1
}

if (y1 == y2 & y1 == verh) // |
{

StoronyGde.push('verh');
Storony.push(i);
kl = kl + 1
}

if (y1 == y2 & y1 == niz) // )

{

StoronyGde.push('niz');
Storony.push(i);
kl = kl + 1
}
}
}
// alert (kl)
massivy = [];
massivy.push(Storony);
massivy.push(StoronyGde);
return massivy

}

function okr(chislo) {
return Math.round(chislo * 10) / 10
}


function GabarityContura(Obj)

{
var text = '';


ln = NewPoint(0, 0); //левый низ
lv = NewPoint(0, 0); //левый верх
pn = NewPoint(0, 0); //правый низ
pv = NewPoint(0, 0); //правый верх контура

kontur = Obj.Contour;

kstoron = kontur.Count;
// var k_ne_krugov = 0;
for (i = 0; i < kstoron; i++) {
if (kontur[i].ElType != 3) { //k_ne_krugov = k_ne_krugov+1

ln = NewPoint(Math.round(kontur[i].Pos1.x * 10) / 10, Math.round(kontur[i].Pos1.y * 10) / 10);
lv = NewPoint(Math.round(kontur[i].Pos1.x * 10) / 10, Math.round(kontur[i].Pos1.y * 10) / 10);
pn = NewPoint(Math.round(kontur[i].Pos1.x * 10) / 10, Math.round(kontur[i].Pos1.y * 10) / 10);
pv = NewPoint(Math.round(kontur[i].Pos1.x * 10) / 10, Math.round(kontur[i].Pos1.y * 10) / 10);
}

};



for (i = 0; i < kstoron; i++) {
if (kontur[i].ElType != 3) {
Pos1x = Math.round(kontur[i].Pos1.x * 10) / 10;
Pos1y = Math.round(kontur[i].Pos1.y * 10) / 10;
Pos2x = Math.round(kontur[i].Pos2.x * 10) / 10;
Pos2y = Math.round(kontur[i].Pos2.y * 10) / 10;


if (ln.x > Pos1x) {
ln.x = Pos1x
};
if (ln.x > Pos2x) {
ln.x = Pos2x
};
if (ln.y > Pos1y) {
ln.y = Pos1y
};
if (ln.y > Pos2y) {
ln.y = Pos2y
};

if (lv.x > Pos1x) {
lv.x = Pos1x
};
if (lv.x > Pos2x) {
lv.x = Pos2x
};
if (lv.y < Pos1y) {
lv.y = Pos1y
};
if (lv.y < Pos2y) {
lv.y = Pos2y
};

if (pn.x < Pos1x) {
pn.x = Pos1x
};
if (pn.x < Pos2x) {
pn.x = Pos2x
};
if (pn.y > Pos1y) {
pn.y = Pos1y
};
if (pn.y > Pos2y) {
pn.y = Pos2y
};

if (pv.x < Pos1x) {
pv.x = Pos1x
};
if (pv.x < Pos2x) {
pv.x = Pos2x
};
if (pv.y < Pos1y) {
pv.y = Pos1y
};
if (pv.y < Pos2y) {
pv.y = Pos2y
};

}
};

text4 = ('ln ---- ' + ln.x + ' - ' + ln.y + '\n' +
'lv ---- ' + lv.x + ' - ' + lv.y + '\n' +
'pn ---- ' + pn.x + ' - ' + pn.y + '\n' +
'pv ---- ' + pv.x + ' - ' + pv.y + '\n');
// alert(text4);
ln_v = ln; //левый низ выреза
pv_v = pv; //правый верх выреза

if (ln_v.x < lv.x) {
ln_v.x = lv.x
};
if (ln_v.y < pn.y) {
ln_v.y = pn.y
};

if (pv_v.x > pn.x) {
pv_v.x = pn.x
};
if (pv_v.y > lv.y) {
pv_v.y = lv.y
};





SeredinaVisotiPaneli = (pv_v.y - ln_v.y) * 0.5;
SeredinaShiriniPaneli = (pv_v.x - ln_v.x) * 0.5;






lnpv = []




lnpv.push(ln_v);
lnpv.push(pv_v);



return lnpv
}

[свернуть]
v22884 вне форума   Ответить с цитированием Вверх
4 пользователя(ей) сказали cпасибо:
bolshoy (05.10.2014), maxgmv (05.10.2014), Oldman (05.10.2014), Rdva (09.04.2015)
Старый 05.10.2014, 08:38   #526
Oldman
VIP
 
Аватар для Oldman
 
Регистрация: 26.12.2008
Адрес: Минск
Сообщений: 1,406
Сказал(а) спасибо: 6,645
Поблагодарили 4,866 раз(а) в 1,091 сообщениях
Вес репутации: 1317
Oldman репутация неоспоримаOldman репутация неоспоримаOldman репутация неоспоримаOldman репутация неоспоримаOldman репутация неоспоримаOldman репутация неоспоримаOldman репутация неоспоримаOldman репутация неоспоримаOldman репутация неоспоримаOldman репутация неоспоримаOldman репутация неоспорима
По умолчанию

Цитата:
Верхняя задача: отправка в раскрой полностью автоматически
Еще хорошо было бы добавить детали с пазами и с облицованной пластью.

Последний раз редактировалось Oldman; 05.10.2014 в 13:36.
Oldman вне форума   Ответить с цитированием Вверх
Пользователь сказал cпасибо:
Rdva (09.04.2015)
Старый 05.10.2014, 19:41   #527
PEHAT
Местный
 
Регистрация: 07.09.2014
Сообщений: 187
Сказал(а) спасибо: 182
Поблагодарили 211 раз(а) в 69 сообщениях
Вес репутации: 177
PEHAT - весьма и весьма положительная личностьPEHAT - весьма и весьма положительная личностьPEHAT - весьма и весьма положительная личность
По умолчанию

Помогите разобраться. Делаю возможность уменьшить панель по оси Х, с обоих сторон. При перестроении контура в расчёт берётся СК панели, в следствии чего панель строится не на прежних координатах, а со смещением на величину изначальных координат панели. Пробовал перевести в глобальную СК, никаких изменений не произошло. Удалил строки (перевода в глобальную СК) и после этого панель стала строиться как надо. Установка новой панели и попытка её изменить приводит к смещению панели. Теперь у меня две панели, одна (старая) строится как мне нужно, а вторая (новая) строиться со смещением. В скрипте убрал строки с попыткой перевода в глобальную СК.

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

AddFrontPanel(-800, 0,-300, 500, 0)
Action.Commit();

Obj = Model.Selected;
if (Obj)
Obj = Obj.AsPanel;
if (!Obj)
Obj = GetPanel("Укажите панель");
if (Obj) {
C = Obj.Contour;
StartEditing(Obj);

C.Fit(Obj.GabMin.x + 20, Obj.GabMin.y, Obj.GabMax.x - 20, Obj.GabMax.y);
Obj.Build();
Action.Commit();
};
[свернуть]
PEHAT вне форума   Ответить с цитированием Вверх
Старый 05.10.2014, 20:13   #528
Briz
Местный
 
Регистрация: 30.11.2011
Сообщений: 283
Сказал(а) спасибо: 275
Поблагодарили 803 раз(а) в 179 сообщениях
Вес репутации: 358
Briz - просто великолепная личностьBriz - просто великолепная личностьBriz - просто великолепная личностьBriz - просто великолепная личностьBriz - просто великолепная личностьBriz - просто великолепная личностьBriz - просто великолепная личность
По умолчанию

Замените GabMin/GabMax на GMin/GMax
Briz вне форума   Ответить с цитированием Вверх
3 пользователя(ей) сказали cпасибо:
DTioutiou (05.10.2014), maxgmv (05.10.2014), PEHAT (05.10.2014)
Старый 07.10.2014, 06:05   #529
v22884
Местный
 
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 241
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
v22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордится
По умолчанию

Труба Вертикальная:

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



Krepej = NewFurnitureInput('Трубодержатель');

Bok1 = GetPanel("Укажите Нижнюю панель");
Bok2 = GetPanel("Укажите Верхнюю панель");
//TPro = Bok2.Contour.TProjection;
//alert(Bok1);

//SetCamera(Bok1.PanelSideEnum(true));

//SetCamera(Bok1.PanelSideEnum=true);
y1k = Bok1.GabMax.y
y2k = Bok2.GabMin.y

//x1 = x1k + 1;
//x2 = x2k - 1;

SetCamera(p3dTop )

z1 = Bok1.GabMin.z + 1;
z2 = Bok1.GabMax.z - 20;








function MoveOdj()
{
DeleteNewObjects()

Ext = AddExtrusion('Труба D25');

// выталкиваемый профиль
//truba = 'Труба25.frw'
Ext.Contour.AddCircle(0, 0, 12.5)

// вытянем профиль вдоль оси X
Ext.Orient(AxisY, AxisZ);
// установим длину профиля
Ext.Thickness =y2k-y1k;
Ext.PositionX = Action.Pos3.x
Ext.PositionY = Action.Pos3.y
Ext.PositionZ = Action.Pos3.z
Ext.Translate(NewVector(0, y1k, 0))

Krepej.Mount1(Bok1, Action.Pos3.x, y1k, Action.Pos3.z, 0)
Krepej.Mount1(Bok2, Action.Pos3.x,y2k, Action.Pos3.z, 0)


}

Action.ShowPoints = true;
Action.OnMove = function() {MoveOdj()};
Action.OnClick = function() {Action.Finish()};
Action.Continue();


[свернуть]
v22884 вне форума   Ответить с цитированием Вверх
Пользователь сказал cпасибо:
maxgmv (07.10.2014)
Старый 09.10.2014, 00:04   #530
AndrianoS
Пользователь
 
Регистрация: 21.08.2009
Адрес: Санкт-Петербург
Сообщений: 59
Сказал(а) спасибо: 73
Поблагодарили 15 раз(а) в 9 сообщениях
Вес репутации: 186
AndrianoS на пути к лучшему
По умолчанию

Подскажите пожалуйста,можно ли такое организовать.Когда мы создаем панель свойств с разными группами и подгруппами,то по умолчанию они все развернутые.Можно ли их сделать свернутыми?


Код:
prop();
Action.Continue();

function prop() {
  Prop       = Action.Properties;

  PropGroup1 = Prop.NewGroup('Группа 1:');
    Prop1    = PropGroup1.NewNumber('Свойство 1');
    Prop2    = PropGroup1.NewNumber('Свойство 2');
    Prop3    = PropGroup1.NewNumber('Свойство 3');

  PropGroup2 = Prop.NewGroup('Группа 2:');
    Prop4    = PropGroup2.NewNumber('Свойство 1');
    Prop5    = PropGroup2.NewNumber('Свойство 2');
    Prop6    = PropGroup2.NewNumber('Свойство 3');

  PropGroup3= Prop.NewGroup('Группа 3:');
    Prop7    = PropGroup3.NewNumber('Свойство 1');
    Prop8    = PropGroup3.NewNumber('Свойство 2');
    Prop9    = PropGroup3.NewNumber('Свойство 3');

  PropGroup4 = Prop.NewGroup('Группа 4:');
    Prop10   = PropGroup4.NewNumber('Свойство 1');
    Prop11   = PropGroup4.NewNumber('Свойство 2');
    Prop12   = PropGroup4.NewNumber('Свойство 3');
}
Миниатюры
рис1.jpg   рис2.jpg  
AndrianoS вне форума   Ответить с цитированием Вверх
Ответ

Нижняя навигация
Вернуться   Форум профессиональных мебельщиков PROMEBELclub > Программы для мебельщиков > Программы для конструирования и дизайна мебели > Система БАЗИС > Базис-мебельщик. Скрипты

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
БАЗИС 9 - Скрипты Igor_482 Базис-мебельщик. Скрипты 1441 27.02.2024 10:48
БАЗИС 9 nayrogi Базис-мебельщик 9 785 01.10.2022 23:13
БАЗИС-ЧПУ 8 chingisnah Базис-мебельщик 8 119 21.12.2017 22:04
Заявки на скрипты dr_john Система БАЗИС 37 01.03.2016 10:36
Базис-7,"Народный Базис"и Windows-8 sergeyzak18 "НАРОДНЫЙ" базис 23 16.01.2014 00:37


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


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

џндекс.Њетрика