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

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


Реклама на портале PROMEBELclub
шкаф-купе со скидкой по акции
Реклама на портале PROMEBELclub

искусственный камень Мебель196. Мебельный интернет-магазин в Екатеринбурге.
Ответ
 
Опции темы Опции просмотра
Старый 13.01.2014, 11:22  
БАЗИС 8 - Скрипты
 
Аватар для Igor_482
Igor_482
VIP
Регистрация: 03.09.2008
Сообщений: 145

Сказал(а) спасибо: 31
Поблагодарили 635 раз(а) в 84 сообщениях
Версия для печати Отправить по электронной почте
Igor_482 Igor_482 вне форума 13.01.2014, 11:22
Рейтинг: (6 голосов - 5.00 средняя оценка)

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

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
Просмотров: 1100
Размер:	36.4 Кб
ID:	86248

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


Последний раз редактировалось systland; 26.12.2017 в 10:52.. Причина: Добавил объявление.
Просмотров: 722422
Ответить с цитированием Вверх
4 пользователя(ей) сказали cпасибо:
Beard (20.06.2017), female (15.01.2016), Kerby (21.11.2015), v22884 (04.11.2014)
Старый 24.03.2020, 23:04   #1261
Letos
Консультант
 
Регистрация: 28.06.2017
Сообщений: 517
Сказал(а) спасибо: 117
Поблагодарили 838 раз(а) в 336 сообщениях
Вес репутации: 252
Letos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личность
По умолчанию

Цитата:
Сообщение от sergio1982 Посмотреть сообщение
Ещё такой вопрос, в Базисе ужасная вещь, что у кромлёной панели нельзя изменить размеры в панели свойств. Есть ли какая таблетка от этого?
Пример для вписывания контура панели в габаритный прямоугольник от (0, 0) до (500, 500) (по сути, задание размера 500х500):
PHP код:
var Model.Selected.AsPanel;
Undo.Changing(p);
p.Contour.Fit(00500500);
p.Build(); 
Letos вне форума   Ответить с цитированием Вверх
Пользователь сказал cпасибо:
Meshok (25.03.2020)
Старый 24.03.2020, 23:19   #1262
Letos
Консультант
 
Регистрация: 28.06.2017
Сообщений: 517
Сказал(а) спасибо: 117
Поблагодарили 838 раз(а) в 336 сообщениях
Вес репутации: 252
Letos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личность
По умолчанию

Цитата:
Сообщение от sergio1982 Посмотреть сообщение
Получилось, вроде правильно считает. Хорошо если подскажете что в коде можно упростить.

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

Код:
// расчёт кромки и площади заготовок

var Selected = 0 // true - инфо только о выделенных

Materials = [];
MaterialsSquare = [];
Edges = [];
EdgesLength = [];


if (!Selected)
    Model.forEachPanel(CheckObject)
else {
    for (var i = 0; i < Model.SelectionCount; i++) {
        var obj = Model.Selections[i];
        if (obj.AsPanel)
            CheckObject(obj);
        else
            Panels(obj);
    }
}

function Panels(obj) {
    for (var i = 0; i < obj.Count; i++) {
        pan = obj.Objects[i]
        if (pan.List)
            Panels(pan);
        if (pan.AsPanel)
            CheckObject(pan);
    }
};

function CheckObject(Obj) {
    MtName = Obj.MaterialName.replace("\r", " арт. ");
    Butts = Obj.Butts;
    Contour = Obj.Contour;
    Index = Materials.indexOf(MtName);

    if (Index < 0) {
        Index = Materials.push(MtName) - 1;
        MaterialsSquare[Index] = 0;
    }
    MaterialsSquare[Index] +=
        (Contour.Height * Contour.Width / 1000000);

    for (var i = 0; i < Butts.Count; ++i) {
        Sign = Butts[i].Material.replace("\r", " арт. ");
        Index = Edges.indexOf(Sign);
        if (Index < 0) {
            Index = Edges.push(Sign) - 1;
            EdgesLength[Index] = 0;
        }
        Length = GetButtLength(Butts[i], Contour);
        EdgesLength[Index] += Length;
    }
}

function GetButtLength(butt, contour) {
    var index = butt.ElemIndex;
    var elem = contour.Objects[index];
    return elem.ObjLength();
};

var string = 'Кромка м:\n\n';

for (var i = 0; i < Edges.length; ++i) {
    string += Edges[i] + '  \t  = ' + (EdgesLength[i] / 1000).toFixed(1) + '\n'
};

string += '\n\nПанели кв/м:\n\n';

for (var i = 0; i < Materials.length; ++i) {
    string += Materials[i] + '  \t  = ' + MaterialsSquare[i].toFixed(1) + '\n'
};

if (!Edges.length && !Materials.length)
    if (Selected)
        alert('Нет выделенных панелей!');
    else
        alert('Панели не обнаружены!');
else
    alert(string);
[свернуть]
Можно так подправить (я мог нгде-то опечататься\ошибиться):

Код

PHP код:
// расчёт кромки и площади заготовок

var Selected // true - инфо только о выделенных

Materials = [];
MaterialsSquare = [];
Edges = [];
EdgesLength = [];


if (!
Selected)
    
Model.forEachPanel(CheckPanel)
else {
    for (var 
0Model.SelectionCounti++) {
        
CheckObject(Model.Selections[i]);
    }
}

function 
CheckPanel(panel) {
    
MtName panel.MaterialName.replace("\r"" арт. ");
    
Butts panel.Butts;
    
Contour panel.Contour;
    
Index Materials.indexOf(MtName);

    if (
Index 0) {
        
Index Materials.push(MtName) - 1;
        
MaterialsSquare[Index] = 0;
    }
    
MaterialsSquare[Index] +=
        (
Contour.Height Contour.Width 1000000);

    for (var 
0Butts.Count; ++i) {
        
Sign Butts[i].Material.replace("\r"" арт. ");
        
Index Edges.indexOf(Sign);
        if (
Index 0) {
            
Index Edges.push(Sign) - 1;
            
EdgesLength[Index] = 0;
        }
        
Length GetButtLength(Butts[i], Contour);
        
EdgesLength[Index] += Length;
    }
}

function 
CheckObject(obj) {
    if (
obj.AsPanel) {
        
CheckPanel(obj)
    }
    else if (
obj.List) {
        for (var 
0obj.Counti++) {
            
CheckObject(obj[i])
        }
    }
}

function 
GetButtLength(buttcontour) {
    var 
index butt.ElemIndex;
    var 
elem contour.Objects[index];
    return 
elem.ObjLength();
};

var 
string 'Кромка м:\n\n';

for (var 
0Edges.length; ++i) {
    
string += Edges[i] + '  \t  = ' + (EdgesLength[i] / 1000).toFixed(1) + '\n'
};

string += '\n\nПанели кв/м:\n\n';

for (var 
0Materials.length; ++i) {
    
string += Materials[i] + '  \t  = ' MaterialsSquare[i].toFixed(1) + '\n'
};

if (!
Edges.length && !Materials.length)
    if (
Selected)
        
alert('Нет выделенных панелей!');
    else
        
alert('Панели не обнаружены!');
else
    
alert(string); 
[свернуть]
Letos вне форума   Ответить с цитированием Вверх
Старый 25.03.2020, 12:15   #1263
sergio1982
Пользователь
 
Регистрация: 01.09.2019
Сообщений: 54
Сказал(а) спасибо: 14
Поблагодарили 1 раз в 1 сообщении
Вес репутации: 0
sergio1982 пока не определено
По умолчанию

Цитата:
Сообщение от Letos Посмотреть сообщение
Для поворота вокруг точки на заданный угол написал функцию и пример как её пользоваться:
Никак не могу это допилить для правильного поворота тел вращения. И у панели иногда вращает не по центру а по краю.

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

Код:
/**
 * Повернуть объект вокруг точки
 * @param {Object3} obj Объект
 * @param {Vector} pointGCS Точка в ГСК
 * @param {Vector} axis Ось поворота
 * @param {Number} angle Угол поворота
 */
function RotateAroundPoint(obj, pointGCS, axis, angle){
    var localPoint = obj.ToObject(pointGCS);
    obj.RotateGCS(axis, angle);
    var newPointGCS = obj.ToGlobal(localPoint);
    console.log(pointGCS);
    console.log(newPointGCS);
    var diff = {
        x: pointGCS.x - newPointGCS.x,
        y: pointGCS.y - newPointGCS.y,
        z: pointGCS.z - newPointGCS.z,
    }
    console.log(diff);
    obj.TranslateGCS(diff);
}
var pan = Model.Selected
// поворот относительно центра панели в нижней точке по оси Y на 90 градусов
RotateAroundPoint(
    pan,
    pan.ToGlobal({
        x: pan.GCenter.x,
        y: 0,
        z: pan.GCenter.z
    }),
    AxisY,
    90);
[свернуть]
sergio1982 вне форума   Ответить с цитированием Вверх
Старый 25.03.2020, 15:14   #1264
Letos
Консультант
 
Регистрация: 28.06.2017
Сообщений: 517
Сказал(а) спасибо: 117
Поблагодарили 838 раз(а) в 336 сообщениях
Вес репутации: 252
Letos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личность
По умолчанию

Цитата:
Сообщение от sergio1982 Посмотреть сообщение
Никак не могу это допилить для правильного поворота тел вращения. И у панели иногда вращает не по центру а по краю.

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

Код:
/**
 * Повернуть объект вокруг точки
 * @param {Object3} obj Объект
 * @param {Vector} pointGCS Точка в ГСК
 * @param {Vector} axis Ось поворота
 * @param {Number} angle Угол поворота
 */
function RotateAroundPoint(obj, pointGCS, axis, angle){
    var localPoint = obj.ToObject(pointGCS);
    obj.RotateGCS(axis, angle);
    var newPointGCS = obj.ToGlobal(localPoint);
    console.log(pointGCS);
    console.log(newPointGCS);
    var diff = {
        x: pointGCS.x - newPointGCS.x,
        y: pointGCS.y - newPointGCS.y,
        z: pointGCS.z - newPointGCS.z,
    }
    console.log(diff);
    obj.TranslateGCS(diff);
}
var pan = Model.Selected
// поворот относительно центра панели в нижней точке по оси Y на 90 градусов
RotateAroundPoint(
    pan,
    pan.ToGlobal({
        x: pan.GCenter.x,
        y: 0,
        z: pan.GCenter.z
    }),
    AxisY,
    90);
[свернуть]
Точка и ось вращения сориентированы относительно глобальной системы координат. Проверьте, что у вас точки указаны корректно. Если все равно поворачивает не так, как надо, пришлите пример модели и скрипт, который неправильно работает с описанием, как должно быть правильно.
Letos вне форума   Ответить с цитированием Вверх
Старый 25.03.2020, 16:01   #1265
sergio1982
Пользователь
 
Регистрация: 01.09.2019
Сообщений: 54
Сказал(а) спасибо: 14
Поблагодарили 1 раз в 1 сообщении
Вес репутации: 0
sergio1982 пока не определено
По умолчанию

Скрипт постом выше, модель приложил.
У меня поворачивает не относительно центров самой трубы, и не параллельно осям x y z.
Вложения
Тип файла: zip 1.zip (4.7 Кб, 4 просмотров)

Последний раз редактировалось sergio1982; 25.03.2020 в 17:00.
sergio1982 вне форума   Ответить с цитированием Вверх
Старый 25.03.2020, 20:21   #1266
Funman
Новичок
 
Регистрация: 01.01.2020
Сообщений: 9
Сказал(а) спасибо: 6
Поблагодарили 0 раз(а) в 0 сообщениях
Вес репутации: 0
Funman пока не определено
По умолчанию

Подскажите, реально ли в версии 11, узнать что кромка закрыта панелью. Иногда случается что сделаешь шкаф, расставишь кромку, а потом приходится что-то перемещать, уменьшать, увеличивать и кромка попадает туда, где быть не должна. Если можно то как?
Funman вне форума   Ответить с цитированием Вверх
Старый 26.03.2020, 00:13   #1267
sergio1982
Пользователь
 
Регистрация: 01.09.2019
Сообщений: 54
Сказал(а) спасибо: 14
Поблагодарили 1 раз в 1 сообщении
Вес репутации: 0
sergio1982 пока не определено
По умолчанию

Свойство IsButtVisible говорит о том что торец панели виден.
То есть если торец не виден, и на нём есть кромка, то...
Кстати как выделить торцы панели?
sergio1982 вне форума   Ответить с цитированием Вверх
Пользователь сказал cпасибо:
Funman (26.03.2020)
Старый 26.03.2020, 06:16   #1268
Letos
Консультант
 
Регистрация: 28.06.2017
Сообщений: 517
Сказал(а) спасибо: 117
Поблагодарили 838 раз(а) в 336 сообщениях
Вес репутации: 252
Letos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личность
По умолчанию

Цитата:
Сообщение от sergio1982 Посмотреть сообщение
Скрипт постом выше, модель приложил.
У меня поворачивает не относительно центров самой трубы, и не параллельно осям x y z.
Чуть некорректно пример я тогда написал. В вашем случае лучше считать с помощью глобальных габаритов объекта. Пример для поворота относительно центра штанги на 90 градусов по глобальной оси Y:

Код

PHP код:
/**
 * Повернуть объект вокруг точки
 * @param {Object3} obj Объект
 * @param {Vector} pointGCS Точка в ГСК
 * @param {Vector} axis Ось поворота
 * @param {Number} angle Угол поворота
 */
function RotateAroundPoint(objpointGCSaxisangle){
    var 
localPoint obj.ToObject(pointGCS);
    
obj.RotateGCS(axisangle);
    var 
newPointGCS obj.ToGlobal(localPoint);
    var 
diff = {
        
xpointGCS.newPointGCS.x,
        
ypointGCS.newPointGCS.y,
        
zpointGCS.newPointGCS.z,
    }
    
obj.TranslateGCS(diff);
}
var 
pan Model.Selected;
Undo.Changing(pan);
var 
center = {
    
x: (pan.GabMax.pan.GabMin.x) / 2,
    
ypan.GabMax.y,
    
z: (pan.GabMax.pan.GabMin.z) / 2
}
// поворот относительно центра панели в нижней точке по оси Y на 90 градусов
RotateAroundPoint(
    
pan,
    
center,
    
AxisY,
    
90); 
[свернуть]


8 под рукой не оказалось, проверял в 9. Убрал вызов лога (до 10 версии console.log не было, скорее всего из-за этого не до конца поворачивал). Если вдруг угол будет не 90 градусов (как у меня в БМ9 оказалось), значит угол поворота задаётся в радианах. Перевод градусов в радианы простой: <градусы> / 180 * Math.PI
Letos вне форума   Ответить с цитированием Вверх
Старый 26.03.2020, 06:18   #1269
Letos
Консультант
 
Регистрация: 28.06.2017
Сообщений: 517
Сказал(а) спасибо: 117
Поблагодарили 838 раз(а) в 336 сообщениях
Вес репутации: 252
Letos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личностьLetos - просто великолепная личность
По умолчанию

Цитата:
Сообщение от sergio1982 Посмотреть сообщение
Кстати как выделить торцы панели?
Из скриптов - никак. Можно выделять только сами объекты, а не их части.
Letos вне форума   Ответить с цитированием Вверх
Старый 26.03.2020, 08:20   #1270
sergio1982
Пользователь
 
Регистрация: 01.09.2019
Сообщений: 54
Сказал(а) спасибо: 14
Поблагодарили 1 раз в 1 сообщении
Вес репутации: 0
sergio1982 пока не определено
По умолчанию

Цитата:
Сообщение от Letos Посмотреть сообщение
<градусы> / 180 * Math.PI
Так трубу поворачивает правильно, но теперь панели только на 2 градуса.
Может быть посмотреть в сторону Orient.

Цитата:
Сообщение от Letos Посмотреть сообщение
Можно выделять только сами объекты, а не их части.
Печально, странно что этого нет в доступном апи.
sergio1982 вне форума   Ответить с цитированием Вверх
Ответ

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

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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
БАЗИС 9 nayrogi Базис-мебельщик 9 768 16.03.2020 08:31
БАЗИС 9 - Скрипты Igor_482 Базис-мебельщик. Скрипты 1426 17.03.2019 23:00
БАЗИС-ЧПУ 8 chingisnah Базис-мебельщик 8 119 21.12.2017 21:04
Заявки на скрипты dr_john Система БАЗИС 37 01.03.2016 09:36
Базис-7,"Народный Базис"и Windows-8 sergeyzak18 "НАРОДНЫЙ" базис 23 15.01.2014 22:37


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


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
© 2007-2020 PROMEBEL