Примеры задач, решаемые выгрузкой

Материал из K3-Macro
Макро | Мебельные команды и функции | Выгрузка информации в мебельную базу | Обработки | Информация о мебельных элементах | Панели | Профили | Балюстрады | Длинномеры | Комплектующие | Кромки | Мебельные изделия | Общие параметры сцены | Информация о заказе | Материалы и сборочные единицы | Примеры задач, решаемые выгрузкой

Поскольку база выгрузки данных достаточно сложна, то для решения конкретных прикладных задач нужны упрощенные примеры, описания и алгоритмы. Они собраны в данном разделе.

Данные для раскройных программ[править | править код]

Раскройные программы осуществляют площадной раскрой листовых деталей и\или линейный раскрой профильных материалов. Рассмотрим эти два типа отдельно.

Как правило, для площадных раскройных программ требуется:

1. Материал заготовки детали.

2. Габариты заготовок панелей с учетом направления текстуры или с информацией о том, что направление текстуры отсутствует или им можно пренебречь

3. Информация о том, что деталь криволинейная. Как правило, для криволинейных деталей раскройные программы предусматривают дополнительный допуск на раскрой.

4. Информация о номере той или иной детали в заказе.

Дополнительно может потребоваться:

5. Информация о кромке на той или иной стороне детали.

6. Информация о наличии сверловки и/или крепежа на той или иной стороне детали.

7. Информация о дополнительных обработках сторон детали

Для линейного раскроя требуется следующая информация:

8. Материал профильной заготовки

9. Длина профильной заготовки.

10. Информация о номере той или иной детали в заказе.

Рассмотрим эти пункты отдельно.

Площадной раскрой[править | править код]

Основная таблица, которая потребуется для площадного раскроя – TPanels. В этой таблице содержится список панелей. Поле UnitPos – уникальный номер панели в заказе (п. 4). Также в качестве номера детали могут использоваться поля DetailPos, ParentPos, TopParentPos и CommonPos таблицы TElems. Связь между таблицами TPanels и TElems осуществляется по полю UnitPos.

Материал заготовки хранится в таблице TNNomenclature (п. 1). Для панели из таблицы TPanels идем в таблицу TElems. Там смотрим поле PriceID (ID материала детали) и по этому PriceID читаем данные о материале в TNNomenclature.

Габариты панели (п. 2) содержатся в полях Length и Width таблицы TPanels. Габариты полотна панели (собственно куска материала без кромок и пр.) содержатся в полях PlaneLength и PlaneWidth таблицы TPanels. Как правило, для раскрой нужны именно габариты полотна панели. И для панели, и для полотна панели первый размер указывает габарит вдоль направления текстуры, второй – поперек направления текстуры.

Информация о том, что деталь криволинейная (форма отлична от прямоугольной) (п. 3) содержится в логическом поле CurvePath таблицы TPanels.

Направление текстуры (п. 2) содержится в поле Dir таблицы TPanels. Значение указывает угол текстуры по отношению к положительному направлению оси X. Отрицательное значение говорит о том, что направлением текстуры можно пренебречь.

Поле FormType таблицы TPanels содержит код формы панели (гнутая, плоская и пр.) Значение 0 для плоской негнутой панели.

Информация о кромках, крепеже и обработках сторон панели (п. 5, 6, 7) содержится в таблице TParams. Для этого сначала смотрим таблицу TPaths, которая содержит информацию о контурах панели. Связь таблицы TPaths и таблицы TPanels осуществляется по полю UnitPos таблицы TPanels. Это поле равно полю PanelPos из таблицы TPaths. У каждой панели может быть несколько контуров (внешний контур, вырезы). Под номером 1 всегда идет внешний контур. Также контура могул описывать панели и полотно панели. Признаком того, что контур относится к панели является значение Ложь в поле IsPlanePath. Если значение поля IsPlanePath равно Истина, то контур описывает полотно панели. В таблице TPaths содержится информация о результирующих контурах (том, что получилось в результате наложения на заготовку панели вырезов, наростов и пр.) и образующих контурах (том, из чего складывался результирующий контур). Если контур результирующий – то значение поля IsTCuts равно Ложь. Если образующий – Истина.

Каждый контур представляет собой набор элементов контура – отрезков, дуг, окружностей, сплайнов. Информация о, элементах контура и об обработках, наложенных на данный элемент контура содержится в таблице TParams. Если параметр из таблицы TParams относится к контуру (к таблице TPaths), то значение поля HoldTable должно равняться “TPaths”. Номер панели (поле UnitPos из таблицы TPanels и поле PanelPos из таблицы TPaths) содержится в поле UnitPos таблицы TParams. Номер контура (поле PathID таблицы TPaths) равно полю Hold1 таблицы TParams. Поле Hold3 таблицы TParams содержит последовательно номера элементов контура (1, 2, 3, …). Тип элемента (отрезок, дуга и пр.) содержится в поле Hold2. Имена параметров содержаться в поле ParamName, тип параметра (число, строка) – в поле ParamType, значение в полях NumValue или StrValue. Для каждого элемента контура в таблице TParams есть параметры с именами, описывающими положение (координаты этого элемента (X1, Y1, … - для отрезка, XC, YC, R – для окружности и пр.) также для каждого элемента контура есть параметры с именами IDPoly и IDLine. Эти параметры содержат внутренний идентификатор контура (IDPoly) и внутренний идентификатор элемента контура (IDLine). Для прямоугольной и четырехугольной панели стороны этой панели имеют следующие внутренние идентификаторы:

  • Сторона D. IDPoly=1; IDLine=1;
  • Сторона C. IDPoly=1; IDLine=3;
  • Сторона E. IDPoly=1; IDLine=5;
  • Сторона B. IDPoly=1; IDLine=7;
  • Угол 1. IDPoly=1; IDLine=8;
  • Угол 2. IDPoly=1; IDLine=2;
  • Угол 3. IDPoly=1; IDLine=4;
  • Угол 4. IDPoly=1; IDLine=6;

Если панель строится по произвольному контуру, то идентификаторы элемента имеют номер, начиная с 10.

На каждый элемент контура может быть наложена (а может быть и не наложена) обработка. Обработок может быть несколько. Параметр с именем WorkID для каждого элемента контура содержит идентификатор обработки. По данному идентификатору обработки можно узнать тип обработки. Для этого идем в таблицу обработок TWorks. Поле WorkPos таблицы TWorks равно значению идентификатора обработки (параметр WorkID) из таблицы TParams. Поле Type таблицы TWorks содержит тип обработки (2 – кромление и пр.). Чтобы узнать параметры обработки, идем с нужным нам WorkID опять в таблицу TParams. Для параметров обработок значение поля HoldTable равно “TWorks”. Ищем параметры нужной нам обработки. Для обработок значение поля Hold1 равно значению поля WorkID из таблицы TWorks.. Параметр с именем id1 содержит идентификатор кромочного материала из таблицы TNNomenclature. Параметр с именем id2 содержит идентификатор цвета кромки из таблицы TNNomenclature.

Пример. Что нужно сделать, чтобы найти материал и цвет кромки по стороне E для панели.

1. Идем в таблицу TPanels и смотрим значение поля UnitPos. Это – уникальный идентификатор панели.

2. Идем в таблицу TPaths и смотрим там записи со значением поля PanelPos, равным найденному нами в п. 1

3. Среди этих записей (контуров панели) ищем ту, которая относится к панели, а не полотну панели (поле IsPlanePath равно Ложь) и ту, которая относится к образующему контуру (поле IsTCuts равно Ложь). Если таких записей несколько, запоминаем у них всех значения полей PathID и идем с этими значениями в TParams.

4. ВTParams ищем записи, у который HoldTable равно TPaths, UnitPos равно уникальному идентификатору панели (п.1), поле Hold1 равно PathID (п. 3). Среди найденных записей ищем те, у которых IDPoly=1 (главный результирующий контур) и IDLine равно 5 – сторона E. Запоминаем значение поля Hold3 (номер элемента) для этих записей.

5. Среди найденных в п. 4. записей ищем записи со значение поля ParamName равным WorkID – идентификатор обработки по данному элементу контура. С этими значениями идем в таблицу TWorks – обработки.

6. В таблице TWorks ищем записи, у которых поле WorkPos равно найденным в п. 5. значениям параметра WorkID. Среди найденных записей выбираем те, у которых значение поля Type равно 2 (кромление). Запоминаем из WorkPos.

7. С найденными WorkPos (п. 6) идем в таблицу TParams и ищем там записи, у которых HoldTable равно TWorks и Hold1 равно найденному WorkPos. Среди найденных записей ищем записи с ParamName равным id1 (кромочный материал) и id2 (цвет кромочного материала).

8. С найденными в п.8 значениями параметров с именами id1 и id2 идем в таблицу TNNomenclature и ищем записи, у который поле ID равно найденным id1 и id2. Это и есть материал и цвет кромки.

Задача решена.

Если панель построена по свободному контуру, то, строго говоря, у нее нет сторон B, C, D, E. Их можно определить только достаточно условно: сторона B – сторона, которая содержит точку с наименьшей координатой X, сторона С – с наибольшей координатой X, сторона D – с наименьшей координатой Y, сторона E – с наибольшей координатой Y. Если одна и та же сторона подходит под определение двух и более сторон, например содержит и точку с наименьшей координатой X и наименьшей координатой Y, то в качестве одной из сторон нужно выбрать другую сторону, удовлетворяющую условию. Например, сторону с наименьшей после уже выбранной, координатой Y. После того, как стороны выбраны, нужно запомнить их IDPoly и IDLine и в п. примера использовать эти значения.

Для определения крепежа на той или иной стороне нужно, зная номер панели (поле PanelPos таблицы TPanels), контура (поле PathID таблицы TPaths) и номер элемента контура (таблица TParams поле Hold3 для контуров) идти в таблицу TFixes. В этой таблице PanelPos равно ElemPos, PathID из TPaths равен PathID из TFixes, Hold3 равен SegmentID. Поле TypeID содержит идентификатор типа крепежа.

Для определения сверловки по элементу контура (или пласти панели) нужно найти все отверстия (таблица THoles), которые расположены в торцах или пласти панели. Для этого используются матрицы положения (поля Matr…) таблиц TElems и THoles.

Профильный раскрой[править | править код]

Основная таблица, которая потребуется для площадного раскроя – TProfiles. В этой таблице содержится список профилей. Поле UnitPos – уникальный номер профиля в заказе (п. 10). Также в качестве номера детали могут использоваться поля DetailPos, ParentPos, TopParentPos и CommonPos таблицы TElems. Связь между таблицами TProfiles и TElems осуществляется по полю UnitPos.

Материал профиля хранится в таблице TNNomenclature (п. 8). Для профилей из таблицы TProfiles идем в таблицу TElems. Там смотрим поле PriceID (ID материала детали) и по этому PriceID читаем данные о материале в TNNomenclature.

Длина профиля содержится в поле Length (п. 9) таблицы TProfiles. Идентификатор цвета профиля содержится в поле ColorID. По данному идентификатору можно найти цвет профиля по таблице TNNomenclature.

Тип формы профиля (прямой, гнутый) содержится в поле FormType.

Определение положения отверстий[править | править код]

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

Отверстие в пласти панели[править | править код]

Отверстием в пласти панели будем называть отверстие, расположенное в пласти панели (с любой стороны) и перпендикулярное пласти. Поскольку любое отверстие направлено из точки с координатами (0,0,0) в ЛСК отверстия в точку с координатами (0,0,1) в ЛСК отверстия (вектор отверстия - {0,0,1}), то нам нужно определить направление этого вектора в ЛСК панели. Поскольку любая негнутая панель лежит в плоскости XoY, то, вектор отверстия в ЛСК панели коллинеарен оси Z в ЛСК панели, то отверстие в пласти. Иначе - не в пласти.

Перемножим вектор {0,0,1} на матрицу отверстия и получим вектор {MatrA13,MatrA23,MatrA33} Если отверстие направлено вдоль оси Z, то координаты вектора MatrA13 и MatrA23 равны нулю. Реально же из-за ошибок округления данные коэффициенты матрицы могут быть не равны нулю, а быть очень маленькими. Поэтому желательно сравнивать их с каким-либо предельным минимальным значением.

Таким образом, запрос, выбирающий отверстия, лежащие в пласти панелей

SELECT * FROM THoles WHERE ABS(MatrA13)<0.001 AND ABS(MatrA23)<0.001 AND UnitPos IN (SELECT UnitPos FROM TPanels)

Первая часть запроса выбирает отверстия, направленные вдоль оси Z. Вторая часть запроса требует, чтобы отверстия были именно в панели.

Отверстия в торце панели[править | править код]

Эту задачу можно разделить на две. Первая - найти отверстия в неподрезанных торцах панели, то есть тех торцах, которые параллельны осям X и Y. Вторая задача - найти отверстия, перпендикулярные произвольно расположенному торцу панели.

Решим первую задачу. Решается она аналогично предыдущей. Нужно, чтобы вектор, полученный в результате умножения вектора отверстия на матрицу был коллинеарен оси X или Y. Пользуясь аналогичными рассуждениями, получаем:

SELECT * FROM THoles WHERE ABS(MatrA33)<0.001 AND (ABS(MatrA13)<0.001 OR ABS(MatrA23)<0.001) AND UnitPos IN (SELECT UnitPos FROM TPanels)

Определить сторону панели, где находится отверстие[править | править код]

Разделим задачу на поиск пласти, в которой находится отверстие и поиск торца, в котором находится отверстие.

Сначала разберемся с пластью. Первое условие - отверстие должно быть в пласти. Далее, если отверстие направлено вниз - оно в пласти A, если вверх, то оно в пласти F. Сквозные отверстия всегда располагаются в палсти A. Определить направление отверстия в ЛСК панели можно, умножив вектор отверстия на матрицу. Нас интересует только координата Z (MatrA33) полученного вектора. Переведем все это на язык запросов.

Выбрать все отверстия в пласти A:

SELECT * FROM THoles WHERE ABS(MatrA13)<0.001 AND ABS(MatrA23)<0.001 AND UnitPos IN (SELECT UnitPos FROM TPanels) AND MatrA33<0

Выбрать все отверстия в пласти F:

SELECT * FROM THoles WHERE ABS(MatrA13)<0.001 AND ABS(MatrA23)<0.001 AND UnitPos IN (SELECT UnitPos FROM TPanels) AND MatrA33>0

Теперь рассмотрим отверстия в торцах панели

Разберем прямоугольную панель, имеющую торцы D, C, D, E. Решение здесь аналогичное. Отверстие должно раполагаться в торце панели (то есть быть направлено либо вдоль оси X ЛСК панели, либо вдоль оси Y). То есть , отверстие располагается в торце B, если оно направлено в сторону оси X:

SELECT * FROM THoles WHERE ABS(MatrA33)<0.001 AND MatrA13>0 AND ABS(MatrA23)<0.001 AND UnitPos IN (SELECT UnitPos FROM TPanels)

Отверстие располагается в торце C, если оно направлено в сторону, противоположную оси X:

SELECT * FROM THoles WHERE ABS(MatrA33)<0.001 AND MatrA13<0 AND ABS(MatrA23)<0.001 AND UnitPos IN (SELECT UnitPos FROM TPanels)

Отверстие располагается в торце D, если оно направлено в сторону оси Y:

SELECT * FROM THoles WHERE ABS(MatrA33)<0.001 AND MatrA23>0 AND ABS(MatrA13)<0.001 AND UnitPos IN (SELECT UnitPos FROM TPanels)

Отверстие располагается в торце E, если оно направлено в сторону, противоположную оси Y:

SELECT * FROM THoles WHERE ABS(MatrA33)<0.001 AND MatrA23<0 AND ABS(MatrA13)<0.001 AND UnitPos IN (SELECT UnitPos FROM TPanels)

Определение сквозного отверстия[править | править код]

Сквозным отверстием будем называть отверстие в пласти негнутой панели, глубина которого не меньше толщины панели, и которое пересекает ее насквозь. По первому критерию (отверстие в пласти) мы уже умеем отличать отверстия. Второй критерий - глубина не меньше толщины панели. Нам нужно сравнить толщину панели TPanel.Thickness и глубину отверстия THoles.Depth. Вообще, в системе сделано так, что сквозные отверстия имеют точку начала (0,0,0) в верхней пласти панели. То есть по третьему критерию, нам нужно, чтобы отверстие имело координату Z , равную толщине панели и было направлено вниз. Говоря языком матрицы, нужно, чтобы MatrA34=TPanel.Thickness и MatrA33=-1.

Объединим эти критерии. Получим

SELECT *
FROM THoles, TPanels
WHERE ABS(MatrA13)<0.001 AND ABS(MatrA23)<0.001 
AND THoles.UnitPos IN (SELECT UnitPos FROM TPanels) 
AND THoles.UnitPos=TPanels.UnitPos 
AND THoles.Depth>=TPanels.Thickness 
AND (ABS(MatrA34-TPanels.Thickness)<=0.001 AND MatrA33<0)

Определение линейки крепежа, по которой получено отверстие[править | править код]

Сразу скажу, что отверстие может быть получено и не от линейки крепежа, а, например, от направляющих для ящиков. Более того, линейка крепежа имеет отношение только к торцу панели. А если отверстие в пласти, то и линейка крепежа относится уже не к данной панели, а к соседней.

Но, допустим, ставится задача определить, от какой линейки крепежа получено отверстие.

Каждое отверстие в таблице THoles имеет поле HolderPos. Это поле содержит UnitPos того элемента, которое породило отверстие или 0, если отверстие ничем не порождено (само по себе в сцене). Если быть более точным, то отверстие ставится по отрезку сверловки. И поле HolderPos содержит UnitPos элемента, который является непосредственным "хозяином" этого отрезка. Этим полем мы и воспользуемся.

В линейку крепежа добавляются элементы крепежа. Эти элементы крепежа и порождают отверстия. В результате получаем

SELECT * FROM THoles, TFixes, TElems WHERE TFixes.UnitPos=TElems.ParentPos AND TElems.UnitPos=THoles.HolderPos

Макро | Мебельные команды и функции | Выгрузка информации в мебельную базу | Обработки | Информация о мебельных элементах | Панели | Профили | Балюстрады | Длинномеры | Комплектующие | Кромки | Мебельные изделия | Общие параметры сцены | Информация о заказе | Материалы и сборочные единицы | Примеры задач, решаемые выгрузкой