Форум профессиональных мебельщиков PROMEBELclub

Форум профессиональных мебельщиков PROMEBELclub (https://промебельклуб.рф/forum/index.php)
-   Базис-мебельщик. Скрипты (https://промебельклуб.рф/forum/forumdisplay.php?f=273)
-   -   БАЗИС 10 - Скрипты (https://промебельклуб.рф/forum/showthread.php?t=12463)

Letos 14.06.2019 16:16

Цитата:

Сообщение от TProject (Сообщение 478156)
Уважаемые мебельщики, помогите коллеге. Возникла потребность расстановки позиций с помощью скрипта на выделенные детали. Если у кого то есть подобный скрипт, поделитесь пожалуйста.

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

Сообщение от Ovsyanicov (Сообщение 478192)
Выделяете детали и нажимаете кнопку "Расставить позиции заново".


TProject 14.06.2019 16:26

Цитата:

Сообщение от Letos (Сообщение 478203)
В скриптах расстановка позиций доступна только на всю модель. Пилить собственную расстановку вряд ли кому приходило в голову, потому что сравнение объектов - задача трудоёмкая. В результате остаётся один вариант:

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

v22884 24.06.2019 10:03

Как удалить после Action.Commit() ?

p = Model.Selections[0]
pCopy = AddCopy(p);
Action.Commit()

DeleteObject(pCopy); //Здесь не работает.


Или сразу главный вопрос:
Как определить какие именно отверстия из фурнитуры цепляют конкретную панель?
Если, например, в фурнитурине 6 отверстий и больше.

Letos 24.06.2019 14:44

Цитата:

Сообщение от v22884 (Сообщение 478632)
Как определить какие именно отверстия из фурнитуры цепляют конкретную панель?

можно получить список фурнитуры, скрепляющей панель через panel.FindConnectedFasteners(). Встроенной функции, определяющей, что отверстие находится в конкретной панели, нет. Здесь есть самописный скрипт для выделения панелей с торцевыми отверстиями. В случае вашей задачи, вам не нужна функция CheckWithPanel() (она проверяет соответсвие направления отверстия с направлениями Х и У в ЛСК панели). Основная нужная функция - CheckHole(hole, fast, panel) вернёт true, если отверстие (hole), принадлежащее фурнитуре (fast) находится в панели (panel).
Цитата:

Сообщение от v22884 (Сообщение 478632)
Как удалить после Action.Commit() ?

p = Model.Selections[0]
pCopy = AddCopy(p);
Action.Commit()

DeleteObject(pCopy); //Здесь не работает.

После Action.Commit() объекты копируются из временной области модели в саму модель, соответственно объекта pCopy после коммита не существует. Если вы точно знаете, что будет делать ваш код, то можно попробовать следующий трюк:

Т.к. добавление объектов в модель идёт последовательно, то при добавлении 5 объектов скриптом в модель, последние 5 объектов - добавленные скриптом (небольшая оговорочка - если добавлен блок, содержащий 4 объекта, то в модели последним объектом будет блок, а остальные 4 будут внутри блока, согласно иерархии).
Вот небольшой пример по добавлению объекта, применению изменений и удалению объекта:
PHP код:

// Добавление панели
AddPanel(1001000).Owner;
// Применение действий скрипта с записью в историю
Action.Commit();
// Удаление последнего объекта в модели (панели, добавленной скриптом)
DeleteObject(Model.Objects[Model.Count 1]); 


v22884 27.06.2019 12:55

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

Letos 27.06.2019 16:38

Цитата:

Сообщение от v22884 (Сообщение 478781)
Как получить контур панели с подрезкой канта?

Я так понимаю, подрезка канта берётся из параметров кромки? Раньше уже был такой вопрос:
Цитата:

Сообщение от wizardpnz (Сообщение 478155)
есть способ получить размер заготовки с учётом минуса под подрезку кромки, или только вычислять ?

Написал для этого простой скрипт (простота заключается в том, что он обрабатывает только прямоугольные панели и только линии):
PHP код:

const SHIFT = {
    
unknown 0,
    
left 1,
    
right 2,
    
top 3,
    
bottom 4
}

function 
MakeShift(sTypesValue) {
    return {
        
typesType// тип сдвига
        
valuesValue// значение сдвига
    
}
}
/**
 * Получить положение линии относительно контура
 * @param {Contour2D} cont Контур
 * @param {Line2D} line Линия
 */
function GetLinePos(contline) {
    
/**
     * Центр линии
     */
    
var lineC = {
        
x: (line.Pos1.line.Pos2.x) / 2,
        
y: (line.Pos1.line.Pos2.y) / 2
    
}
    var 
result SHIFT.unknown;
    
// Если точка, сдивнутая в сторону, находится внутри контура, 
    // значит контур надо сдвигать в обратную сторону
    
if (cont.IsPointInside(lineC.xlineC.1))
        
result SHIFT.bottom;
    else if (
cont.IsPointInside(lineC.xlineC.1))
        
result SHIFT.top;
    else if (
cont.IsPointInside(lineC.1lineC.y))
        
result SHIFT.left;
    else if (
cont.IsPointInside(lineC.1lineC.y))
        
result SHIFT.right;
    return 
result;
}

/**
 * Применить сдвиги к контуру
 * @param {Contour2D} cont 
 * @param {*} shifts 
 */
function applyShifts(contshifts) {
    var 
min cont.Min;
    var 
max cont.Max;
    for (var 
0shifts.lengthi++) {
        var 
shift shifts[i];
        switch (
shift.type) {
            case 
SHIFT.left:
                
min.+= shift.value;
                break;
            case 
SHIFT.right:
                
max.-= shift.value;
                break;
            case 
SHIFT.top:
                
max.-= shift.value;
                break;
            case 
SHIFT.bottom:
                
min.+= shift.value;
                break;
        }
    }
    
cont.Fit(min.xmin.ymax.xmax.y);
}
/**
 * Подрезать контур на толщину кромок с подрезкой
 * @param {Contour2D} cont 
 * @param {PanelButts} butts 
 */
function ClipContour(contbutts){
    var 
shifts = [];
    if (
cont.IsContourRectangle()) { // Только прямоугольный контур
        
for (var 0butts.Counti++) {
            var 
butt butts.Butts[i];
            if (
butt.ClipPanel){
                var 
line cont.Objects[butt.ElemIndex];
                if (!
line.IsLine()) // Если элемент не линия - ничего не делаем
                    
continue;
                
shifts.push(MakeShift(GetLinePos(contline), butt.Thickness));
            }
        }
        
applyShifts(contshifts);
    }
}

var 
panel Model.Selected.AsPanel;
var 
cont NewContour();
cont.Addition(panel.Contour);
var 
butts panel.Butts;
ClipContour(contbutts);
var 
size = {
    
xcont.Max.cont.Min.x,
    
ycont.Max.cont.Min.y
}
alert(`Размеры: ${size.x}x${size.y}`); 

В примере нужно выделить панель, запустить скрипт и алертом выведутся размеры подрезанной заготовки. Для вашей задачи (получить подрезанный контур), нужно использовать функцию ClipContour(cont, butts), которая подрезает контур (cont) на основе данных о кромках (butts). Лучше в эту функцию передавать копию контура панели, иначе после выполнения скрипта, контур панели изменится.

Batya452 03.07.2019 08:58

Хорошего дня всем! А сеть скрипт для восстановления пароля от Базы материалов? Найти не могу. Поможете? Спасибо заранее

wizardpnz 04.07.2019 07:15

нужно открыть файл базы данных в стороннем редакторе и там есть таблица типа user или accaunt и удалить там записи с паролями

v22884 06.07.2019 06:21

Главная задача: DXF с отверстиями по слоям с именами, например o7, o8h10, и т.п.

На этом пути промежуточный результат дырки в панелях:
(спасибо Letos)

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



Model.forEachPanel(function(p) {
fs = krepej(p)
//alert(fs[0])
// fs = fs.split(",")
Dyriavim(fs,p)

}
)





function krepej(p)
{
if(!p.AsPanel) {return}
ar = p.FindConnectedFasteners(p)


return ar
}

function Dyriavim(fs,p)
{
// alert(fs[0])
for(iif=0;iif<fs.length;iif++)
{

f=fs[iif]
// alert(f)
c = f.Holes;


var i = 0;

сk = f.Holes.Count;


HoleCon = NewContour();

while (i < сk) {

if(!CheckHole(c[i],f, p)&&!CheckHole2(c[i],f, p))
{
i++
continue
}

if (CheckWithPanel(f.NToGlobal(c[i].Direction), p))
{
i++
continue
}
if (c[i].Radius<1.9/2)
{
i++
continue
}


HolePosG = f.ToGlobal(c[i].Position);


p.Selected = false

HolePosG = p.ToObject(HolePosG)


if (c[i].Contour==null)
{
HoleCon.AddCircle(HolePosG.x, HolePosG.y, c[i].Radius)
}
else
{
HoleCon.AddList(c[i].Contour.MakeCopy());
HoleCon.Move(HolePosG.x, HolePosG.y)
}
i++
}
MoykaPos = c.Position;

StartEditing(p)
Undo.Changing(p)

//StartEditing(p)
p.Contour.Subtraction(HoleCon);
system.log(p.ArtPos+ " -- "+p.Name)
p.Build()

}




}


// Чуть доработан скрипт Letos'a (длинные отверстия не дырявил)
function CheckHole2(hole,fast, panel){
for(id=1;id<20;id++)
{
if(CheckHole(hole,fast, panel,id/20))
{
return true
}
}
return false
}

function CheckHole(hole,fast, panel,delim){
var holeCenter = fast.ToGlobal({
x: hole.Position.x + hole.Direction.x * (hole.Depth * delim),
y: hole.Position.y + hole.Direction.y * (hole.Depth * delim),
z: hole.Position.z + hole.Direction.z * (hole.Depth * delim),
})
holeCenter = panel.ToObject(holeCenter);
return (holeCenter.x > panel.GMin.x) && (holeCenter.x < panel.GMax.x) &&
(holeCenter.y > panel.GMin.y) && (holeCenter.y < panel.GMax.y) &&
(holeCenter.z > panel.GMin.z) && (holeCenter.z < panel.GMax.z);
}


function Equals(n1, n2){
return Math.abs(n1 - n2) < 0.001;
}

function EqualsV(v1, v2) {
return Equals(v1.x, v2.x) &&
Equals(v1.y, v2.y) &&
Equals(v1.z, v2.z);
}

function CheckWithPanel(gDir, panel){
return (EqualsV(gDir, panel.NToGlobal(AxisX)) ||
EqualsV(gDir, panel.NToGlobal(Axis_X)) ||
EqualsV(gDir, panel.NToGlobal(AxisY)) ||
EqualsV(gDir, panel.NToGlobal(Axis_Y)))
}

[свернуть]



Как узнать глубину отверстия в пласти панели? (при допущении что отверстие в пласть входит перпендикулярно, хотя ... может кто знает как найти и угол вхождения в пласть(некоторые станки могут сверлить под углом)??)

Letos 06.07.2019 21:33

Цитата:

Сообщение от v22884 (Сообщение 479217)
Как узнать глубину отверстия в пласти панели? (при допущении что отверстие в пласть входит перпендикулярно, хотя ... может кто знает как найти и угол вхождения в пласть(некоторые станки могут сверлить под углом)??)

При допущении, что отверстие входит в пласть перпендикулярно, можно так (функция для использования в скрипте):
PHP код:

/**
 * Глубина отверстия в пласти панели
 * @param {*} hole Отверстие
 * @param {Object3} fast Фурнитура, которой принадлежит отверстие
 * @param {Panel} panel Панель
 */
function HoleFaceDepth(holefastpanel){
    
// минимум и максимум панели
    
var pMin panel.GMin.zpMax panel.GMax.z;
    
// начальная точка отверстия в ЛСК панели по оси Z (ось пласти панели)
    
var holeStart panel.ToObject(fast.ToGlobal(hole.Position)).z;
    
// конечная точка отверстия в ЛСК панели по оси Z (ось пласти панели)
    
var holeEnd panel.ToObject(fast.ToGlobal({
        
xhole.Position.hole.Direction.hole.Depth,
        
yhole.Position.hole.Direction.hole.Depth,
        
zhole.Position.hole.Direction.hole.Depth
    
})).z;
    
// Если начальная координата больше конечной - меняем их местами
    
if (holeStart holeEnd){
        var 
swap holeStart;
        
holeStart holeEnd;
        
holeEnd swap;
    }
    var 
result Math.min(holeEndpMax) -  Math.max(holeStartpMin);
    return 
result


Угол между вектором направления отверстия и вектором пласти панели (последняя функция, остальные вспомогательные):
PHP код:

function VectorDot(v1v2) { 
    return 
v1.v2.v1.v2.v1.v2.z

function 
VectorLength(v) { 
    return 
Math.sqrt(v.v.v.v.v.v.z


function 
VectorsAngle(v1v2){
    return 
Math.acos(VectorDot(v1v2) / (VectorLength(v1) * VectorLength(v2))) * 180 Math.PI
}
function 
AngleBetweenHoleDirAndPanelFace(holefastpanel){
    var 
pDir panel.NToGlobal(AxisZ);
    var 
hDir fast.NToGlobal(hole.Direction);
    return 
VectorsAngle(pDirhDir);




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

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