Показать сообщение отдельно
Старый 21.10.2020, 15:52   #75
sergio1982
Местный
 
Регистрация: 01.09.2019
Сообщений: 424
Сказал(а) спасибо: 52
Поблагодарили 480 раз(а) в 147 сообщениях
Вес репутации: 195
sergio1982 - луч света в тёмном царствеsergio1982 - луч света в тёмном царствеsergio1982 - луч света в тёмном царствеsergio1982 - луч света в тёмном царствеsergio1982 - луч света в тёмном царстве
По умолчанию Подсчёт кромки и площади


Расчёт фурнитуры, профилей, погонажа, кромки и площади заготовок всей модели, или выделенного (подсвеченная фурнитура включительно).

2 версия
+ Добавлен общий вес и объём панелей. Смотрите функцию WeightAndVolumeCalc. В данном примере если в имени материала есть "стекло" (в любом регистре) - то используется коэффициент Q_STEKLO, иначе Q_LDSP.
Для вычисления коэффициента вводим в калькулятор веса мебельных фасадов 1000х1000х1000, после миллиард делим на полученные килограммы.
+ Добавлен вывод в файл, надо в сообщении нажать - "Нет", должно открыться в редакторе по умолчанию.
+ Выбор нужно ли добавлять артикул к имени материала.
+ Причесал код.

v2.03
bugfix - не считались вложенные блоки в выделенном.

v2.05

Добавлена возможность исключений в функции MyRules.



Пример: при добавлении ящика из мастера ящиков направляющие создаются в виде профиля, из материала 'Напр. п/в, DB 45 L 450\r9081 Направляющая правая' (или левая). Заменив код в MyRules, они считаются фурнитурой.

Код:
 
function MyRules(obj) {
    if (obj.toString() == '[object TExtrusionBody]'
    && (found = obj.MaterialName.match(/^Напр\. п\/в.*?L (\d*)\r\d* Направляющая (правая|левая)$/))) {
        if (found[2] == 'левая')
            return 1
        MtName = 'Направляющая ' + found[1]
        CheckProp(Fasteners, MtName)
        Fasteners[MtName] += 1
        return 1
    }
    return 0
}

более общий пример

Код:
function MyRules(obj) {
    if (obj.toString() == '[object TExtrusionBody]'
    && (obj.MaterialName.match(/Направляющая (правая|левая)$/i))) {
        MtName = 'Направляющая ' + obj.Thickness
        CheckProp(Fasteners, MtName)
        Fasteners[MtName] += 0.5
        return 1
    }
    return 0
}
[свернуть]


[свернуть]

код



Код:
/*
v2.10
Расчёт фурнитуры, профилей, погонажа, кромки и площади заготовок

http://promebelclub.ru/forum/showthread.php?p=501567#post501567
*/

var AddArticul = 1  // нужно ли добавлять артикул к имени материала

var Q_LDSP = 1333333.333333
var Q_MDF = 1111111.111111
var Q_STEKLO = 400000

var Selected = Model.SelectionCount;
var Panels = [];
var Linears = [];
var Extrusions = [];
var Edges = [];
var Fasteners = [];
var WeightAndVolume = {Weight:0, Volume:0};
var Buffer = [];

for (var i = 0; i < Model.Count; ++i) {
    recurse(Model.Objects[i])
};

for (var key in Buffer) {
    CheckObj(Buffer[key])
};

function CheckObj(obj) {
    if (MyRules(obj))
        return
    var objtype = obj.toString()
    if (obj.AsPanel) {
        MtName = MaterialName(obj.MaterialName)
        Contour = obj.Contour;
        if (obj.MaterialWidth > 0) { // погонный
            CheckProp(Linears, MtName)
            Linears[MtName] += Math.max(Contour.Height, Contour.Width)
        }
        else {
            CheckProp(Panels, MtName)
            Panels[MtName] += (Contour.Height * Contour.Width)
            WeightAndVolumeCalc(Contour.Height * Contour.Width * obj.Thickness, MtName)
        }
        Butts = obj.Butts;
        for (var i = 0; i < Butts.Count; ++i) {
            MtName = MaterialName(Butts[i].Material)
            CheckProp(Edges, MtName)
            Edges[MtName] += GetButtLength(Butts[i], Contour)
        };
    }
    else if (objtype == '[object TFastener]') { // фурнитура
        MtName = MaterialName(obj.Name)
        CheckProp(Fasteners, MtName)
        Fasteners[MtName] += 1
    }
    else if (objtype == '[object TExtrusionBody]') { // профиль
        MtName = MaterialName(obj.MaterialName)
        CheckProp(Extrusions, MtName)
        Extrusions[MtName] += obj.Thickness
    }
}

var string = '';
if (Object.keys(Edges).length) {
    string += '\n              Кромка (метры):\n\n';
    for (var key in Edges) {
        AddString(key, (Edges[key] / 1000).toFixed(2))
    };
}
if (Object.keys(Panels).length) {
    string += '\n              Панели (квадратные метры):\n\n';
    for (var key in Panels) {
        AddString(key, (Panels[key] / 1000000).toFixed(2))
    };
}
if (Object.keys(Linears).length) {
    string += '\n              Погонные материалы (метры):\n\n';
    for (var key in Linears) {
        AddString(key, (Linears[key] / 1000).toFixed(2))
    };
}
if (Object.keys(Extrusions).length) {
    string += '\n              Профили (метры):\n\n';
    for (var key in Extrusions) {
        AddString(key, (Extrusions[key] / 1000).toFixed(2))
    };
}
if (Object.keys(Fasteners).length) {
    string += '\n              Фурнитура (штуки):\n\n';
    for (var key in Fasteners) {
        string += key + '   =   ' + Fasteners[key] + '\n'
    };
}
if (WeightAndVolume.Volume > 0) {
    string += '\n              Вес и объём (только панели):\n\n';
    string += (WeightAndVolume.Weight).toFixed(1) + ' килограмм\n'
    string += (WeightAndVolume.Volume / 1000000000).toFixed(3) + ' кубических метров'
}

if (string =='') {
    alert('Объекты не обнаружены!')
}
else {
    var isselstring = ''
    if (Selected)
        isselstring = 'ИНФО ТОЛЬКО О ВЫДЕЛЕННЫХ И ПОДСВЕЧЕННЫХ!!!\n\n'
    if (!confirm(isselstring + string + '\n\n\n              Чтобы вывести в файл нажмите "Нет"'))
        ButtonExport()
}
Action.Finish()

// -------------------------------------------------

function recurse(obj, sel) {
    if (!obj.List) {
        if (!sel)
            sel = !!((Selected) && (obj.Selected || obj.Highlighted))
        if (Selected && !sel)
            return
        Buffer.push(obj)
    } else {
        var blocksel = !!((Selected) && (sel || obj.Selected || obj.Highlighted))
        for (var i = 0; i < obj.Count; i++) {
            recurse(obj[i], blocksel)
        }
    }
}

function CheckProp(arr, key) {
    if (!arr.hasOwnProperty(key))
        arr[key] = 0
}

function ButtonExport() {
    system.writeTextFile('export.txt', string);
    Path = '"' + Action.Properties.AbsolutePath() + 'export.txt"'
    NewCOMObject('WScript.Shell').run(Path);
}

function GetButtLength(butt, contour) {
    return contour.Objects[butt.ElemIndex].ObjLength()
}

function AddString(key, value) {
    if (value > 0)
        string += key + '   =   ' + value + '\n'
}

function MaterialName(str) {
    if (AddArticul)
        return str.replace("\r", ". Артикул ")
    return str.replace(/\r.*/, '')
}

function WeightAndVolumeCalc(vol, name) {
    if (name.match(/стекло/i))
        Q = Q_STEKLO
    else
        Q = Q_LDSP
    WeightAndVolume.Weight += vol / Q
    WeightAndVolume.Volume += vol
}

function MyRules(obj) {
    return 0
}
[свернуть]

Последний раз редактировалось sergio1982; 22.10.2020 в 00:56.
sergio1982 вне форума   Ответить с цитированием Вверх
12 пользователя(ей) сказали cпасибо: