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

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

Меню

Маркет


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

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

Этот раздел предназначен для размещения готовых скриптов.
Здесь находятся ТОЛЬКО готовые скрипты. Для обсуждения есть отдельная тема: Обсуждение готовых скриптов.

Авторам:
  1. Давать уникальные названия скриптам (не совпадающие с названием уже выложенных скриптов, за исключением обновлений скрипта)
  2. Указывать работоспособность в разных версиях БМ.
  3. Общее описание работы скрипта.
  4. Если презентованный скрипт платный указывать стоимость, условия и контакты для приобретения.

Версии, указанные модератором, как прошедшие проверку:
8 - Демо-версия 8.0.7.9649
- "народная" 8.0.12.12765
9 - Демо-версия 9.0.8.18908
10 - Демо-версия 10.0.0.21602

Последний раз редактировалось AlexBolton; 03.03.2023 в 21:03..
Просмотров: 569082
Ответить с цитированием Вверх
13 пользователя(ей) сказали cпасибо:
Старый 13.11.2023, 20:52   #271
sannykSV
Местный
 
Аватар для sannykSV
 
Регистрация: 16.03.2008
Адрес: Челябинск CCCР
Сообщений: 466
Сказал(а) спасибо: 836
Поблагодарили 451 раз(а) в 199 сообщениях
Вес репутации: 426
sannykSV - просто великолепная личностьsannykSV - просто великолепная личностьsannykSV - просто великолепная личностьsannykSV - просто великолепная личностьsannykSV - просто великолепная личностьsannykSV - просто великолепная личностьsannykSV - просто великолепная личностьsannykSV - просто великолепная личность
По умолчанию

Цитата:
Сообщение от Артем Валерьевич Посмотреть сообщение
поменяли название, толщину и прочее
в смету передается?
sannykSV вне форума   Ответить с цитированием Вверх
Старый 01.12.2023, 11:02   #272
User1744
Новичок
 
Регистрация: 03.06.2016
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Вес репутации: 0
User1744 пока не определено
По умолчанию Ссылка не работает!

Цитата:
Сообщение от sergio1982 Посмотреть сообщение


v3.70
Добил все свои хотелки.

+ Поле поддерживает ввод табуляций
+ Текст поддерживает начальные и конечные табуляции и пробелы
+ Текст поддерживает пустые строки
+ Шаблоны в поле ввода, а не в свойствах
+ Сноски - указатели на текст
+ Привязки сохраняются и редактируются
+ Авто повтор
+ Ракурс камеры можно вернуть к изначальному
+ Оформление - Крест

Текст.zip


https://youtu.be/8W37aCOGZrw
User1744 вне форума   Ответить с цитированием Вверх
Старый 01.12.2023, 11:53   #273
Ovsyanicov
Местный
 
Регистрация: 30.11.2013
Адрес: Кишинев
Сообщений: 734
Сказал(а) спасибо: 1,529
Поблагодарили 888 раз(а) в 376 сообщениях
Вес репутации: 406
Ovsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордится
По умолчанию

Цитата:
Сообщение от User1744 Посмотреть сообщение
Ссылка не работает!
И не будет работать. Текущая версия скрипта платная. Перейдите на ютуб-канал автора и свяжитесь с ним по контактам, указанным в описании под видео.
Ovsyanicov вне форума   Ответить с цитированием Вверх
Пользователь сказал cпасибо:
sergio1982 (01.12.2023)
Старый 01.12.2023, 12:34   #274
sergio1982
Местный
 
Регистрация: 01.09.2019
Сообщений: 424
Сказал(а) спасибо: 52
Поблагодарили 482 раз(а) в 147 сообщениях
Вес репутации: 197
sergio1982 - луч света в тёмном царствеsergio1982 - луч света в тёмном царствеsergio1982 - луч света в тёмном царствеsergio1982 - луч света в тёмном царствеsergio1982 - луч света в тёмном царстве
По умолчанию

Ссылка на сервисе
sergio1982 вне форума   Ответить с цитированием Вверх
7 пользователя(ей) сказали cпасибо:
Старый 15.02.2024, 20:08   #275
Rafael M
Пользователь
 
Регистрация: 19.02.2017
Сообщений: 38
Сказал(а) спасибо: 16
Поблагодарили 53 раз(а) в 9 сообщениях
Вес репутации: 103
Rafael M скоро придёт к известности
По умолчанию

Скрипт писал для фасадов, но без фурнитуры. Часто надо ставить фасады на шкаф или комод. В этом скрипте реализовано установка фронтальных панелей, можно менять количество по горизонтали и по вертикали
PHP код:
FileOptions "Facade.xml";

function 
PropertiesWindows() {

    
Property Action.Properties;
    
Property.NewLabel('Установка фасадов');

    
MaterialFacade Property.NewMaterial('Материал');
    
MaterialFacade.BackColor 65535;
    
TextureDirection Property.NewCombo('Направление текстуры''Вертикально\nГоризонтально');
    
ZazorVertical Property.NewNumber('Зазоры ║'1);
    
ZazorHorizontal Property.NewNumber('Зазоры ═'1);

    
ZazorPerimetr Property.NewNumber('Зазор по периметру'0);
    
ZazorPerimetr.BackColor 65280;
    
CountHorizont Property.NewNumber('Кол-во по горизонт.'1);
    
CountVertical Property.NewNumber('Кол-во по вертикали'1);

    
FirstBtn Property.NewButton('Продолжить');
    
FirstBtn.OnClick = function() {
        
Action.Commit();
        
Action.AsyncExec(DoorSize);
    }

    
SecondBtn Property.NewButton('Закончить');
    
SecondBtn.OnClick = function() {
        
Action.Finish();
    }

    
Property.OnChange = function() {
        
InstallingPanel();
    }
}

var 
leftrightbottomtopfront;

function 
DoorSize() {
    
SetCamera(p3dFront);
    
ViewAll();
    
first_vertical GetEdge("Укажите 1-ю вертикальную границу"AxisY).First.x;
    
second_vertical GetEdge("Укажите 2-ю вертикальную границу"AxisY).First.x;
    if (
first_vertical second_vertical) {
        
left Math.round(second_vertical);
        
right Math.round(first_vertical);
    } else {
        
left Math.round(first_vertical);
        
right Math.round(second_vertical);
    }

    
first_horizont GetEdge("Укажите 1-ю горизонтальную границу"AxisX).First.y;
    
second_horizont GetEdge("Укажите 2-ю горизонтальную границу"AxisX).First.y;
    if (
first_horizont second_horizont) {
        
bottom Math.round(second_horizont);
        
top Math.round(first_horizont);
    } else {
        
bottom Math.round(first_horizont);
        
top Math.round(second_horizont);
    }
    
SetCamera(p3dLeft);
    
ViewAll();
    
front Math.round(GetEdge("Укажите фронтальную границу"AxisY).First.z);

    
InstallingPanel();
    
SetCamera(p3dIsometric);
    
ViewAll();
    
Action.Continue();
}

function 
InstallingPanel() {
    
DeleteNewObjects();
    
MaterialFacade.SetActive();

    
count_x CountHorizont.Value;
    
count_y CountVertical.Value;
    
lenghtStep Math.round((right left) / count_x);
    
hightStep Math.round((top bottom) / count_y);

    if (
ZazorPerimetr.Value != 0) {
        
x_zazor ZazorPerimetr.Value;
        
y_zazor ZazorPerimetr.Value;
    } else {
        
x_zazor ZazorVertical.Value;
        
y_zazor ZazorHorizontal.Value;
    }

    
position_x 0;
    
position_y 0;

    for (
0count_yi++) {
        for (
0count_xj++) {
            
Facad AddFrontPanel(
                
left x_zazor position_x,
                
bottom y_zazor position_y,
                
left lenghtStep position_x x_zazor,
                
bottom hightStep position_y y_zazorfront);
            
position_x += lenghtStep;
            
Facad.Name "фасад";
            
Facad.Color 16711680;

            switch (
TextureDirection.ItemIndex) {
                case 
0:
                    {
                        
Height.Value hightStep y_zazor 2;
                        
Width.Value lenghtStep x_zazor 2;
                        
Facad.TextureOrientation TextureOrientation.Vertical;
                        break;
                    }
                case 
1:
                    {
                        
Width.Value hightStep y_zazor 2;
                        
Height.Value lenghtStep x_zazor 2;
                        
Facad.TextureOrientation TextureOrientation.Horizontal
                        
break;
                    }
            }
        }
        
position_x 0;
        
position_y += hightStep;
    }
}


PropertiesWindows();

Action.Properties.Load(FileOptions);

Action.OnFinish = function() {
    
SetCamera(p3dIsometric);
    
Action.Properties.Save(FileOptions);
}

Height NewNumberInput("Высота");
Width NewNumberInput("Ширина");

DoorSize(); 

Последний раз редактировалось AlexBolton; 15.02.2024 в 20:51. Причина: оформление
Rafael M вне форума   Ответить с цитированием Вверх
12 пользователя(ей) сказали cпасибо:
Старый 16.02.2024, 08:25   #276
sibmebel
Модератор
 
Аватар для sibmebel
 
Регистрация: 14.04.2010
Адрес: Псков
Сообщений: 2,401
Сказал(а) спасибо: 14,283
Поблагодарили 20,694 раз(а) в 2,727 сообщениях
Вес репутации: 4624
sibmebel репутация неоспоримаsibmebel репутация неоспоримаsibmebel репутация неоспоримаsibmebel репутация неоспоримаsibmebel репутация неоспоримаsibmebel репутация неоспоримаsibmebel репутация неоспоримаsibmebel репутация неоспоримаsibmebel репутация неоспоримаsibmebel репутация неоспоримаsibmebel репутация неоспорима
По умолчанию

Цитата:
Сообщение от Rafael M Посмотреть сообщение
В этом скрипте реализовано установка фронтальных панелей, можно менять количество по горизонтали и по вертикали
Нужное дело!! А есть возможность добавить Зазор/Расстояние от корпуса (Причина: зазор для Tip On, например) и Нанесение кромки? Спасибо!
__________________
Старайся делать хорошо! Плохо само получится...
sibmebel вне форума   Ответить с цитированием Вверх
Старый 23.02.2024, 16:25   #277
chiefconst
Новичок
 
Регистрация: 24.05.2023
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Вес репутации: 0
chiefconst пока не определено
По умолчанию

Добрый день. В дополнение сообщения от 24.05.2023. В комплект скриптов для разборки модели, создания файлов панелей и блоков с монтажной фурнитурой добавлен скрипт выбора текста для фурнитуры. Можно выбрать артикул либо специальный код, установленный пользователем. Видео по ссылке Ссылка на сервисе

Комментарий модератора
AlexBolton:
Привестви в соотвествие с рекомендациями в шапке.

Последний раз редактировалось AlexBolton; 24.02.2024 в 12:22.
chiefconst вне форума   Ответить с цитированием Вверх
Пользователь сказал cпасибо:
ramzai (31.05.2024)
Старый 24.02.2024, 10:25   #278
demanus
Пользователь
 
Регистрация: 08.06.2010
Сообщений: 34
Сказал(а) спасибо: 553
Поблагодарили 19 раз(а) в 8 сообщениях
Вес репутации: 178
demanus на пути к лучшему
По умолчанию

Цитата:
Сообщение от chiefconst Посмотреть сообщение
Добрый день. В дополнение сообщения от 24.05.2023. В комплект скриптов для разборки модели, создания файлов панелей и блоков с монтажной фурнитурой добавлен скрипт выбора текста для фурнитуры. Можно выбрать артикул либо специальный код, установленный пользователем.
Для начала почитайте в шапке правила оформления поста в данной ветке.
Особенно обратите внимание на 4-ый пункт.
demanus вне форума   Ответить с цитированием Вверх
Старый 26.02.2024, 01:26   #279
v22884
Местный
 
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 455
Сказал(а) спасибо: 243
Поблагодарили 1,099 раз(а) в 210 сообщениях
Вес репутации: 389
v22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордитсяv22884 за этого человека можно гордится
По умолчанию

Контур панели с подрезкой крома

Проверялся на БМ10 и БМ10Демо.

Сам по себе практической пользы не несёт.
Мне для подготовки DXF, и обработки на станки, заместо Базис-ЧПУ.

Кстати, вопрос : (у меня БМ10 2018г. ), в новой версии уже есть запуск подготовки Базис-ЧПУ и Базис-Раскрой полностью автоматически без человека из командной строки?


Использование:
1) открыта любая модель(желательно без блоков),
2) запускаем скрипт.
Скрипт копирует оригинальную панель и заменяет её контур на контур с подрезкой крома.

(начат скрипт в 2016. Моих человекочасов занял около 2х недель непрерывного рабочего времени).

В новых версиях БМ уже есть эта функция одной командой?

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



Model.forEachPanel(function (p) {
//AddCopy(p)



Undo.Changing(p); // укажем, что этот объект будет редактироваться
uporyadochitKonturSsohraneniyemKroma(p)


var cP = ConturPodrezan(p)

});


function uporyadochitKonturSsohraneniyemKroma(p) {
var bb = p.Butts
var masEl = []
for (var ib = 0; ib < bb.Count; ib++) {
var b = bb[ib]
var el = p.Contour[bb[ib].ElemIndex]
masEl.push(el.MakeCopy())
}
p.Contour.OrderContours()
p.Build()

for (var ib = 0; ib < bb.Count; ib++) {
var el0 = masEl[ib]
for (var ic = 0; ic < p.Contour.Count; ic++) {
if (geometry.Compare(el0.MakeCopy(), p.Contour[ic].MakeCopy())) {

bb[ib].ElemIndex = ic;
break
}
}
}

p.Build()

}


function ConturPodrezan(p) {
// p.Contour.OrderContours()
// p.Build()
var c = p.Contour
//наружные-внутренние.последовательности. последовательности с подрезкой.
// подрезку каждого элемента можно найти по середине элемента:
//Найти элемент, ближайший к точке с заданными координатами.
//Синтаксис:
//Find(x, y);

var c_ = NarVnuKontury(c)

nar = c_.nar
vnu = c_.vnu

for (var i = 0; i < nar.length; i++) {
var cn = nar[i]


posledovatelnostiPodrezki(cn, p, false)
//testC(cn)



}

for (var i = 0; i < vnu.length; i++) {
var cv = vnu[i]
// testC(cv)
posledovatelnostiPodrezki(cv, p, true)

}








var cP = NewContour()

return cP
}


function posledovatelnostiPodrezki(c0, p, vnutrenniy) {
//c0 -- отделённый от контура панели замкнутый контур наружный или внутренний.
//p.Contour.OrderContours()
//p.Build()
var bb = p.Butts
var cp = p.Contour.MakeCopy()

var arPodr = [] //цифры подрезки для всех индексов элементов c0
var arPosled = [] // контуры последовательностей с одинаковой подрезкой.
var arPodrPosled = [] //цифры подрезки последовательностей
var conPosled = NewContour()
var proshlayaPodr = 999

/*
массив точек соединений последовательностей ДО
и Массив ДВУХ точек соединений последовательностей после.
*/
mSPdo = [] // элемент точка до эквидистанты.
mSPposle = [] // элемент пара точек ПОСЛЕ эквидистант
mS_El = [] // элемент пара элементов соединения


var arPodrVichitaniyem = [] // контуры для вычитания из исходного контура

for (var i = 0; i < c0.Count; i++) {
el0 = c0[i]

// alert('00000'+'\n\n'+el0+'\n\n'+i)

// var elc = 0
for (var j = 0; j < cp.Count; j++) {
if (geometry.Compare(el0.MakeCopy(), cp[j].MakeCopy())) {
elc = cp[j]

// alert('----'+'\n\n'+elc+'\n\n'+el0+'\n\n'+j+'\n\n'+i)

break
}
}
// здесь контур упорядочен и замкнут и отдельный. Поэтому
//перебирая индексы с0 -- они последовательны.
var podr = 0
for (var ib = 0; ib < bb.Count; ib++) {
b = bb[ib]
if (bb[ib].ElemIndex == (j)) {
if (b.ClipPanel) {
podr += b.Thickness
// alert(elc+'\n\n'+podr+'\n\n'+j+'\n\n'+cp[bb[ib].ElemIndex])
system.log(elc + '\n\n' + podr + '\n\n' + j + '\n\n' + cp[bb[ib].ElemIndex])
}
}
}
arPodr.push(podr)


// перебираем элементы, берём все подрезки со всех кантов
// если это первый элемент добавляем в контур новой последовательности
// если величина подрезки та же что и в прошлом элементе -- добавляем в тот же контур последовательности
// если величина подрезки не ровна подрезке прошлого элемента -- текущий контур в массив, создаём новый контур
// если элемент последний
// если его подрезка отличается то новый контур и его в массив
// если его подрезка НЕ отличается то добавить в текущий контур и этот контур в массив

// первый/последний/ниПервыйНиПоследний, какПрошлая/другая

//continue
if (i == 0) {
proshlayaPodr = podr // для закидывания в массив величин подрезки
}



if (proshlayaPodr != podr) {
arPosled.push(conPosled)
arPodrPosled.push(proshlayaPodr)
conPosled = NewContour()
proshlayaPodr = podr
conPosled.Add(el0.MakeCopy())
}
else { conPosled.Add(el0.MakeCopy()) }

if (i == c0.Count - 1) {
arPosled.push(conPosled)
arPodrPosled.push(proshlayaPodr)
}
}

if (arPodrPosled.length > 1) {
if (arPodrPosled[0] == arPodrPosled[arPodrPosled.length - 1]) {
arPosled[0].AddList(arPosled[arPodrPosled.length - 1].MakeCopy())
arPosled.pop()
arPodrPosled.pop()
}
}
for (var i = 0; i < arPosled.length; i++) {
//testC(arPosled[i])
}

//return [arPodrPosled, arPosled]

//------------------------------------------------здесь готовы участки и величины подрезки
//-----------------------------------------Далее подрезаем

/*
Варианты подрезки:
1. 1 участок — 1 замкнутый контур.
1. Круг — контур из 1 элемента.
2. Несколько элементов.
Во всех этих вариантах делаем эквидистанту и проверяем для наружного контура эквидистанта должна стать меньше, для внутреннего — больше.


2. Несколько участков ► не замкнуты.
Далее надо определить направление эквидистанты для каждого участка. Варианты:
1. сделать эквидистанту и проверить с[0].Pos1 в контуре панели ли.
2. сделать эквидистанту и проверить с[0].Line/ArcCenter() в контуре панели ли.
Всегда предполагаем, что величина подрезки положительна, то есть контур будет уменьшаться, а не увеличиваться.

*/

if (arPosled.length == 1) {
var cPodr0 = arPosled[0].MakeCopy()
var podr = arPodrPosled[0]

cPodr0.OrderContours()

var napr = true

var c_Podr = NewContour()
c_Podr.AddEquidistant(cPodr0, podr, napr, false)

if ((podr > 0) &&

(((vnutrenniy) && (c_Podr.Width < cPodr0.Width))
||
((!vnutrenniy) && (c_Podr.Width > cPodr0.Width))



)
) {
napr = !napr

var c_Podr = NewContour()
c_Podr.AddEquidistant(cPodr0, podr, napr, false)

}
arPosled[0] = c_Podr.MakeCopy()
//arPodrVichitaniyem.push(c_Podr)



}
else {



for (var i = 0; i < arPosled.length; i++) {
// if(arPodrPosled[i]==0) {continue}


mSPdo.push(arPosled[i].Pos1)



/*
для последовательностей которые нужно подрезать, т. е. с подрезкой >0
можно сделать эквидистанту подрезки и эквидистанту в другую сторону на 0.1мм.
потом !!СОЕДЕНИТЬ В ЗАМКНУТЫЙ КОНТУР И ВЫЧЕСТЬ!! его из исходного
*/

var podr = arPodrPosled[i]
if (podr != 0) // если величина подрезки не равна 0
{

/* if(el0.IsCircle()){

var napr = false
}
else
{
var napr = !vnutrenniy
}
*/



// ---------------------- 2. сделать эквидистанту и проверить с[0].Line/ArcCenter() в контуре панели ли.

var napr = false


var c_Podr0 = NewContour()
c_Podr0.AddEquidistant(arPosled[i], arPodrPosled[i], napr, false)
var c_Podr = NewContour()
c_Podr.AddEquidistant(c_Podr0, 0, napr, false)


// var c_Podr2 = NewContour()// ПОЧЕМУ-ТО эквидистанта разворачивает направление, чтоб вернуть направление ещё раз еквидистанта с отстпупом 0.
// c_Podr2.AddEquidistant(c_Podr,0,false,false)
// var c_Podr = c_Podr2.MakeCopy()

// Проверим в ту ли сторону качнулась эквидистанта:
// IsInContour() не даёт стабильные результаты ►
// проверим каждую срендую и первую точку всех элементов последовательности IsPointInside()
// ----- большинство точек внутри ли или снаружи. !!! -----------------------



var da = 0 // ------------- не работает на прямоугольнике!!!!!!!
var net = 0
for (var it = 0; it < c_Podr.Count; it++) {
var elT = c_Podr[it].ElType

if (elT == 1) {
var testP = c_Podr[it].LineCenter()
}
else if (elT == 2) {
var testP = c_Podr[it].ArcCenter()
}

var testP2 = c_Podr[it].Pos1


if (podr > 0) // ? лучше бы проверить до цикла ?
{
if (!vnutrenniy) {
if (c0.IsPointInside(testP)) { da += 1 }
else { net += 1 }
/*
if(c0.IsPointInside(testP2))
{ da += 1 }
else{net += 1 }
*/




}
else if (vnutrenniy) {

if (c0.IsPointInside(testP)) { net += 1 }
else { da += 1 }
/*
if(c0.IsPointInside(testP2))
{ net += 1 }
else{da += 1 }
*/

}
}
}
if (da < net)

/*
if((podr>0)&& // ? лучше бы проверить до цикла ?


(((vnutrenniy)&&(c_Podr.IsInContour(c0)))
||
((!vnutrenniy)&&(!c_Podr.IsInContour(c0)))

)

)*/ {
napr = !napr

var c_Podr0 = NewContour()
c_Podr0.AddEquidistant(arPosled[i], arPodrPosled[i], napr, false)
var c_Podr = NewContour()
c_Podr.AddEquidistant(c_Podr0, 0, napr, false)


}
//25,02,2024
// !!! ЕСЛИ прямоугольная панель и 1 кант "СВЕРХУ" ИЛИ 1 кант "СПРАВА" -- ЭКВИДИСТАНТА НЕ В ТУ СТОРОНУ ???
// ?ПО ИТОГУ ПЕРЕДВИГАЕТ НЕ ТУ ТОЧКУ ЭЛЕМЕНТА БЕЗ ПОДРЕЗКИ.?
//либо эквидистанта не в ту сторону, либо не определяет что контуры пересечены когда
// ДА ЭКВИДИДИСТАНТА РАЗВОРАЧИВАЕТ ПОЧЕМУ-ТО 1) левую сторону, 2) верх 3) лево и верх.

//ОКАЗАЛОСЬ ЕЩЁ ТЯЖЕЛЕЕ: Выдернув элемент в эквидистанту последовательность остатка не "последовательна":
// первый элемент, потом дырка, а потом остаток. А должно быть от первого до последнего безразрыва -- последовательно соеденены.
// Вариант решения перепроверить последовательную соеденённость. И в случае "не последовательности" -- перестроить.


/* var c_Podr0 = NewContour()
c_Podr0.AddList(c_Podr.MakeCopy())
var c_Podr = NewContour()
c_Podr.AddEquidistant(c_Podr0, 0, !napr, false)

*/

// c_Podr.InvertDirection()





arPosled[i] = c_Podr.MakeCopy()

//------------------------------------ до сюда с вероятностью 99,999% имеем последовательности эквидистант
//---------------------- Далее их надо собрать в замкнутый контур
if (arPosled.length == 1) {
p.Contour.Clear()
p.Contour.AddList(arPosled[0].MakeCopy())
}
//11,02,24 --- до сюда всё работает
// ------------------------- осталось соединить последовательности
else {








}

}


}

//










}

for (var i = 0; i < arPosled.length; i++) {
ispravitPosledovatelnost(arPosled[i])

}


var cSoyed = NewContour()
for (var i = 0; i < arPosled.length-1; i++) {
//testC(arPosled[i])
posl1 = arPosled[i]
posl2 = arPosled[i+1]
p1 = posl1[posl1.Count-1].Pos2
p2 = posl2[0].Pos1
mSPposle.push([p1,p2])
mS_El.push([posl1[posl1.Count-1],posl2[0]])
cSoyed.AddLine(p1,p2)

}

//testC(arPosled[arPosled.length-1])


posl1 = arPosled[arPosled.length-1]
posl2 = arPosled[0]
p1 = posl1[posl1.Count-1].Pos2
p2 = posl2[0].Pos1

mSPposle.push([p1,p2])
mS_El.push([posl1[posl1.Count-1],posl2[0]])

cSoyed.AddLine(p1,p2)


//testC(cSoyed)








if (arPosled.length > 1) {

for (var i = 0; i < arPosled.length-1; i++) {


var p1_podr = arPodrPosled[i]
var p1_con = arPosled[i]
//p1_con.OrderContours()
//test2(p1_con)
var p2_podr = arPodrPosled[i+1]
var p2_con = arPosled[i+1]

soyedinitPosledovatelnosti(p1_con,p1_podr,p2_con,p2_podr,arPosled.length,mSPdo[i],mSPposle[i],mS_El[i])





}

var i = arPosled.length-1
var p1_podr = arPodrPosled[i]
var p1_con = arPosled[i]
//p1_con.OrderContours()
//test2(p1_con)
var p2_podr = arPodrPosled[0]
var p2_con = arPosled[0]

soyedinitPosledovatelnosti(p1_con,p1_podr,p2_con,p2_podr,arPosled.length,mSPdo[i],mSPposle[i],mS_El[i])

}
var konturPodrezan = NewContour()
for (var i = 0; i < arPosled.length; i++) {
//arPosled[i].InvertDirection()
//test2(arPosled[i])

konturPodrezan.AddList(arPosled[i].MakeCopy())
}

//pp00 = AddPanel(10,10)
pp00 =AddCopy(p)
cp00 = pp00.Contour
cp00.Clear()
cp00.AddList(konturPodrezan.MakeCopy())


}

function ispravitPosledovatelnost(c)
{
if(c.Count ==1){return}

posledovatelny = true
for(var i=0;i<c.Count-1;i++)
{
var e1 = c[i]
var e2 = c[i+1]
var p1 = e1.Pos2
var p2 = e2.Pos1
if(!((Math.round(p1.x*100000)==Math.round(p2.x*100000))
&&(Math.round(p1.y*100000)==Math.round(p2.y*100000))))
{
posledovatelny = false
break
}
}
if(posledovatelny){return}

var e0 = e2.MakeCopy() // элемент на котором закончили -- первый

c.OrderContours()
var p1 = e0.Pos1
var p2 = c[0].Pos1

if(!((p1.x==p2.x)&&(p1.y==p2.y)))
{
c.InvertDirection()
}


// ещё раз проверим на всякий случай.
posledovatelny = true
for(var i=0;i<c.Count-1;i++)
{
var e1 = c[i]
var e2 = c[i+1]
var p1 = e1.Pos2
var p2 = e2.Pos1
if(!((p1.x==p2.x)&&(p1.y==p2.y)))
{
posledovatelny = false
break
}
}
if(posledovatelny)
{return}
else
{
alert("Не удалось сделать последовательным контур!!! Возможно два обрыва." )

test2(c,"Возможно два обрыва.")



}




}

function soyedinitPosledovatelnosti(c1,podr1,c2,podr2, vsegoPodrezok,SPdo,mSPposle,mS_El) {


var rasst = Math.abs (podr1-podr2)
var e1= mS_El[0]
var e2= mS_El[1]

var e1p2 = mSPposle[0] // конец соединения первого элемента
var e2p1 = mSPposle[1] // конец соединения второго элемента


ai = geometry.Intersect(e1, e2)
if(ai.length==1)//пересекаются 1 раз -- Перерисовать оба
{


c1[c1.Count-1].Pos2 = ai[0]

c2[0].Pos1 = ai[0]



}
else if(ai.length>1)//пересекаются более 1 раза --Взять ближайшее пересечение к изначальной точке пересечения SPdo, и Перерисовать оба
{
alert(ai.length+'++++++++')

}
else//не пересекаются
{
/*
2. Соседние элементы соседних последовательностей не пересекаются. -- Попробовать продлить оба и посмотреть через какое расстояние пересекаются,
1. если «???не очень большое», то перерисовать до точки пересечения.
2. Если «?большое», то ? Соединить линией?.
*/


// alert(ai.length)

var e1 = c1[c1.Count - 1]
var e2 = c2[0]

var dist = rasst + 1


var dist = 20
if (e1.ElType == 1) {
var angle = e1.LineAngle() * 180 / Math.PI

} else if (e1.ElType == 2) {
var angle = (e1.Pos2Angle() * 180 / Math.PI) - 90
}


var ctest = NewContour()
ltest = ctest.AddLine(NewPoint(-dist, 0), NewPoint(dist, 0))
ctest.Rotate(0, 0, angle)
ctest.Move(e1.Pos2.x, e1.Pos2.y)
//testC(ctest)


var test3 = NewContour()
test3.Add (ctest[0].MakeCopy())

ai = geometry.Intersect(test3[0], e2)

if (ai.length==1) // если продление e1 пересекается с исходным e2.
{
if (e1.ElType == 1) {
//c1[c1.Count-1].Pos2 = ai[0]
c1[c1.Count-1].Pos2 = ai[0]

c2[0].Pos1 = ai[0]

} else if (e1.ElType == 2) {
// если дуга -- в итоговую последовательно добавить линию от конца дуги до пересечения,
// но после всех циклов чтоб не нарушать последовательность элементов.
// ************* !!!!! МОЖНО ПОКА перенести точку. По идее не должно ЗНАЧИТЕЛЬНО исказить линию
//c1[c1.Count-1].Pos2 = ai[0]
c1[c1.Count-1].Pos2 = ai[0]

c2[0].Pos1 = ai[0]
}

}
else // если пересечения не достигли -- проверяем продление е2 с оригинальным е1
{

if (e2.ElType == 1) {
var angle = e2.LineAngle() * 180 / Math.PI

} else if (e2.ElType == 2) {
var angle = (e2.Pos1Angle() * 180 / Math.PI) - 90
}

system.log(angle)


var ctest2 = NewContour()
ltest2 = ctest2.AddLine(NewPoint(-dist, 0), NewPoint(dist, 0))
ctest2.Rotate(0, 0, angle)
ctest2.Move(e2.Pos1.x, e2.Pos1.y)

//testC(ctest2)

//Action.Commit()
test4 = NewContour()
test4.Add(ctest2[0].MakeCopy())
//test3.Add(ctest2[0].MakeCopy())
// testC(test4)
ai = geometry.Intersect(e1, test4[0])
if (ai.length==1) // если продление e2 пересекается с исходным e1.
{
if (e2.ElType == 1) {
//c2[0].Pos1 = ai[0]
c1[c1.Count-1].Pos2 = ai[0]

c2[0].Pos1 = ai[0]

} else if (e2.ElType == 2) {
// если дуга -- в итоговую последовательно добавить линию от конца дуги до пересечения,
// но после всех циклов чтоб не нарушать последовательность элементов.
// ************* !!!!! МОЖНО ПОКА перенести точку. По идее не должно ЗНАЧИТЕЛЬНО исказить линию
//c2[0].Pos1 = ai[0]
c1[c1.Count-1].Pos2 = ai[0]

c2[0].Pos1 = ai[0]
}

}
else // если пересечения не достигли -- проверяем продление е1 с продлением е2
{

ai = geometry.Intersect(test3[0], test4[0])

//-----------------------------------------------------------------------111111111111

if(ai.length==1)
{
c1[c1.Count-1].Pos2 = ai[0]

c2[0].Pos1 = ai[0]





}
else if(ai.length>1)//пересекаются более 1 раза --Взять ближайшее пересечение к изначальной точке пересечения SPdo, и Перерисовать оба
{
alert(ai.length+'-----')

}
else//не пересекаются
{
alert(ai.length+'-----!!!')

}


}
}












}








/*
Соединить последовательности.
1. Определять соседние концы по расстоянию между ними = подрезка одного - подрезка другого. Не 100%, но 99,99999 -- достаточно.
2. Варианты соединения:
1. Соседние элементы соседних последовательностей пересекаются( всегда предполагаем только 1 раз). -- Перерисовать оба.
2. Соседние элементы соседних последовательностей не пересекаются. -- Попробовать продлить оба и посмотреть через какое расстояние пересекаются,
1. если «???не очень большое», то перерисовать до точки пересечения.
2. Если «?большое», то ? Соединить линией?.
3. Точка одного находится на другом. -- перерисовать на котором точка.
*/



/*
1. Определять соседние концы по расстоянию между ними = подрезка одного - подрезка другого. Не 100%, но 99,99999 -- достаточно.
? заранее не известно соединять ли п1эZ c п2э1 .
Надо определить элементы обоих последовательностей
это могут быть только э1 и эz(первый или последний элементы последовательностей)
то есть надо перебрать 4 варианта: определить расстояние
1) п1э1 и п2э1
1) п1э1 и п2эz
1) п1эz и п2э1
1) п1эz и п2эz.
тогда проблема: если последовательностей всего 2, тогда совпадет не правильный вариант.
? Тогда надо рассматривать этот случай индивидуально.

*/
/*
if (vsegoPodrezok==2)
{

}
else{
rasst = Math.abs (podr1-podr2)

c1e0 = c1[0]
c2e0 = c2[0]

c1eZ = c1[c1.Count-1]
c2eZ = c2[c2.Count-1]






//------------
c1e0p1 = c1e0.Pos1
c1e0p2 = c1e0.Pos2

c2e0p1 = c2e0.Pos1
c2e0p2 = c2e0.Pos2

//----

c1eZp1 = c1eZ.Pos1
c1eZp2 = c1eZ.Pos2

c2eZp1 = c2eZ.Pos1
c2eZp2 = c2eZ.Pos2

//---


massPos = []

massPos.push([c1e0p1,c2e0p1, c1e0,'1',c2e0,'1'])
massPos.push([c1e0p1,c2e0p2, c1e0,'1',c2e0,'2'])

massPos.push([c1e0p2,c2e0p1, c1e0,'2',c2e0,'1'])
massPos.push([c1e0p2,c2e0p2, c1e0,'2',c2e0,'2'])

massPos.push([c1eZp1,c2e0p1, c1eZ,'1',c2e0,'1'])
massPos.push([c1eZp1,c2e0p2, c1eZ,'1',c2e0,'2'])

massPos.push([c1eZp2,c2e0p1, c1eZ,'2',c2e0,'1'])
massPos.push([c1eZp2,c2e0p2, c1eZ,'2',c2e0,'2'])

//---

massPos.push([c1e0p1,c2eZp1, c1e0,'1',c2eZ,'1'])
massPos.push([c1e0p1,c2eZp2, c1e0,'1',c2eZ,'2'])

massPos.push([c1e0p2,c2eZp1, c1e0,'2',c2eZ,'1'])
massPos.push([c1e0p2,c2eZp2, c1e0,'2',c2eZ,'2'])

massPos.push([c1eZp1,c2eZp1, c1eZ,'1',c2eZ,'1'])
massPos.push([c1eZp1,c2eZp2, c1eZ,'1',c2eZ,'2'])

massPos.push([c1eZp2,c2eZp1, c1eZ,'2',c2eZ,'1'])
massPos.push([c1eZp2,c2eZp2, c1eZ,'2',c2eZ,'2'])

//--

for(var i=0;i<massPos.length;i++)
{

var p1 = massPos[i][0]
var p2 = massPos[i][1]
rasst2 = Distance(p1, p2)
if(rasst2==rasst)
{

var el1 = massPos[i][2]
var el2 = massPos[i][4]

ai = geometry.Intersect(el1, el2)
if(ai.length==1)//пересекаются 1 раз
{


}
else if(ai.length>1)
{


}
else//не пересекаются
{

}
*/

/*
Варианты соединения:
1. Соседние элементы соседних последовательностей пересекаются( всегда предполагаем только 1 раз). -- Перерисовать оба.
2. Соседние элементы соседних последовательностей не пересекаются. -- Попробовать продлить оба и посмотреть через какое расстояние пересекаются,
1. если «???не очень большое», то перерисовать до точки пересечения.
2. Если «?большое», то ? Соединить линией?.
3. Точка одного находится на другом. -- перерисовать на котором точка.
*/





/* el2 = c2[c2.Count-1]

rasst2 = geometry.Distance(el1,el2)

if(rasst2>rasst)
{
alert("Ошибка программы. Делай Базисом-ЧПУ.")
throw "stop"
}
*/
/*}



}
}*/
}

function test2(c, name = '') {

var ctest = NewContour()
var rad = 3
for (var ii = 0; ii < c.Count; ii++) {
el000 = c[ii]
if (el000.IsLine()) { pp = el000.LineCenter() }
else if (el000.IsArc()) { pp = el000.ArcCenter() }

ctest.AddCircle(pp, rad)

rad += 5
}
testC(ctest)
testC(c, name )

}


function testC(c00, name = '') {
var c0 = AddContour()
c0.Name = name
var c = c0.Contour
c.AddList(c00.MakeCopy())

return c0
}

function NarVnuKontury(c) {

var contours = FindClosedContours(c);
var messages = ['Найдено ' + contours.length + ' контуров'];
for (var k = 0; k < contours.length; k++)
messages.push('Длина контура ' + k + ' = ' + contours[k].ObjLength());
//alert(messages.join('\r\n'));

var vnutr = 0
var avnu = []
var naruj = 0
var anar = []
var cnar = []
var cvnu = []
c_nar = NewContour()
c_vnu = NewContour()
var messages = ['Найдено ' + contours.length + ' контуров'];
for (var k = 0; k < contours.length; k++) {
vnutr2 = false
for (var k2 = 0; k2 < contours.length; k2++) {
if (k == k2) {
continue
}
if (contours[k].IsInContour(contours[k2])) {
vnutr2 = true
break
}

}
if (vnutr2) {
vnutr = vnutr + 1
avnu.push(k)
cvnu.push(contours[k])
c_vnu.AddList(contours[k].MakeCopy())
} else {
naruj = naruj + 1
anar.push(k)
cnar.push(contours[k])
c_nar.AddList(contours[k].MakeCopy())
}
// messages.push('Длина контура ' + k + ' = ' + contours[k].ObjLength());

}
messages.push('Наружных ' + ' = ' + naruj + ' \r\n' + anar.join('\r\n'))
messages.push('Внутренних ' + ' = ' + vnutr + ' \r\n' + avnu.join('\r\n'))
//alert(messages.join('\r\n'));

panleli_c = []
for (var inar = 0; inar < anar.length; inar++) {
panlel_c = []
panlel_c.push(cnar[inar])
for (var i = 0; i < contours.length; i++) {
if (!(geometry.Compare(contours[i][0], cnar[inar][0]))) {
if (contours[i].IsInContour(cnar[inar])) {
panlel_c.push(contours[i])
}
}
}
panleli_c.push(panlel_c)
}



var messages = ['Найдено ' + panleli_c.length + ' панелей'];

for (var i = 0; i < panleli_c.length; i++) {
messages.push('У панели ' + i + ' -- ' + panleli_c[i].length + ' контуров\r\n')
}
system.log(messages.join('\r\n'));



c_ = {}
c_.vnu = cvnu
c_.nar = cnar
return c_

}



function FindClosedContours(contour) {
// создаем копию исходного контура панели
var contourCopy = NewContour();
contourCopy.Addition(contour);
var result = [];
while (true) {
closedContour = NewContour();
// выделяем замкнутые контуры и добавляем их в результирующий массив
if (contourCopy.FindContour(closedContour, true))
result.push(closedContour)
else
break;
}
return result;
}




//sdelat(p)


function sdelat(p) {

cp = p.Contour
cp.OrderContours(true)
bb = p.Butts
pcon = cp.MakeCopy()
for (i = 0; i < bb.Count; i++) {
if (bb[i].ClipPanel) {
PodrezatKrom(bb[i], pcon)
}
}
c1 = AddContour('Контур')
c1.Name = 'Контур'
c1.Contour.AddList(pcon.MakeCopy())
}

function PodrezatKrom(b, pcon) {
offset = b.Thickness
el = pcon[b.ElemIndex]
co = NewContour()
co.AddCopy(el)
c = NewContour()
c.AddEquidistant(co, offset, false, false)
pel = c[0]
system.log(pel.ElType)
pcon.Add(c[0])
}


function Distance(p1, p2) {
var dx = p2.x - p1.x;
var dy = p2.y - p1.y;
var dz = 0;
return Math.sqrt(dx * dx + dy * dy + dz * dz);
}






function TochkaLiniiNaRasstoyaniiOtTochki(p1,p2,dist)
{
Rac = dist
Xa = p1.x
Xb = p2.x

Ya = p1.y
Yb = p2.y

Rab = Math.sqrt(Math.pow((Xb - Xa), 2) + Math.pow((Yb - Ya) , 2))
k = Rac / Rab
Xc = Xa + (Xb - Xa) * k
Yc = Ya + (Yb - Ya) * k


/*

Имеется отрезок AB с координатами A(Xa, Ya) и B(Xb, Yb).
Требуется найти координаты точки C(Xc, Yc), лежащей на отрезке AB на расстоянии Rac от точки A.

-------------------------------------------------

Rab = sqrt((Xb - Xa) ^ 2 + (Yb - Ya) ^ 2)
k = Rac / Rab
Xc = Xa + (Xb - Xa) * k
Yc = Ya + (Yb - Ya) * k

-------------------------------------------------

Обозначения:
f ^ n - возведение f в степень n, в нашем случае (первом) f будет Xb - Xa и n будет 2.
sqrt(f) - квадратный корень из f, в нашем случае f будет (Xb - Xa) ^ 2 + (Yb - Ya) ^ 2.
f / n - деление f на n, в нашем случае f будет Rac и n будет Rab.
f * n - умножение f на n, в нашем случае (первом) f будет Xb - Xa и n будет k.

*/


return NewPoint(Xc, Yc)

}
[свернуть]
v22884 вне форума   Ответить с цитированием Вверх
2 пользователя(ей) сказали cпасибо:
Ovsyanicov (26.02.2024), PravCom (26.02.2024)
Старый 26.02.2024, 04:01   #280
Ovsyanicov
Местный
 
Регистрация: 30.11.2013
Адрес: Кишинев
Сообщений: 734
Сказал(а) спасибо: 1,529
Поблагодарили 888 раз(а) в 376 сообщениях
Вес репутации: 406
Ovsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордитсяOvsyanicov за этого человека можно гордится
По умолчанию

Цитата:
Сообщение от v22884 Посмотреть сообщение
в новой версии уже есть запуск подготовки Базис-ЧПУ и Базис-Раскрой полностью автоматически без человека из командной строки?
Нет, это фантастика. Воз и ныне там, только количество построцессоров увеличивается.
Насчёт автоматической подготовки для ЧПУ не в курсе, но из того софта, что мне известен, автоматический раскрой может выполнять Cut Rite Professional, установленный на сервере и соответствующе настроенный (даже без командной строки).

Цитата:
Сообщение от v22884 Посмотреть сообщение
В новых версиях БМ уже есть эта функция одной командой?
Тоже нет и вряд ли будет.
Ovsyanicov вне форума   Ответить с цитированием Вверх
Пользователь сказал cпасибо:
v22884 (26.02.2024)
Ответ

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


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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
БАЗИС 11-2024 - Скрипты AlexBolton Базис-мебельщик. Скрипты 1001 13.06.2024 10:55
БАЗИС 10 - Скрипты systland Базис-мебельщик. Скрипты 715 14.04.2024 07:03
БАЗИС 8 - Скрипты Igor_482 Базис-мебельщик. Скрипты 1525 30.03.2024 15:03
Скрипты в чертежах sergio1982 Базис-мебельщик. Скрипты 35 10.02.2024 15:45
Заявки на скрипты dr_john Система БАЗИС 37 01.03.2016 10:36


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


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

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