среда, 3 октября 2012 г.

Подсчет сварных швов в AutoCAD MEP

AutoCAD MEP - великолепный продукт для прокладки технологических трубопроводов, но не хватает в нем некоторых мелких плюшек и фишек для полного счастья инженера-технолога. Очередной раз обратились ко мне с просьбой упростить жизнь в подсчете количества стыков, т.е. количества сварных швов для выдачи задания сметному отделу. Выбрать и перебрать трубы совершенно несложно. Возник вопрос только с отрезками труб, которые по разным причинам могут быть мизерной длины, например, меньше 1 мм. Было принято решение воспринимать их как отдельный шов и не мучиться с выяснением причин их появления.
В итоге, родилось приложение MEPJointCount.
Протокол работы из командной строки приведен ниже. При протоколировании предполагалось, что труба поставляется длиной 8 метров (8000мм).

Команда: MEPJOINTCOUNT

Выберите объекты: _all
найдено: 371

Выберите объекты:

selected objects count: 371
Enter pipe segment length <1000>: 8000

45x2: 4
57x6,0-20'С': 107
89x6,0-20'С': 25
114x6,0-20'С': 200
159x6,0-20'С': 159
219x8,0-20А: 255
273x8,0-20А: 9
325x8,0-20А: 107
720x9-09ГСФ: 4

Полученные данные можно передавать сметному отделу в задании.


понедельник, 1 октября 2012 г.

Площадь поверхности и объем в AutoCAD MEP

На прошлой неделе меня попросили изучить вопрос получения геометрических параметров труб, арматуры и оборудования в AutoCAD MEP 3D. В частности, площадь поверхности и объем выбранных примитивов. Такие параметры необходимы для формирования задания сметному отделу, где указывается площадь поверхности, которую надо красить или объем изоляции. Меня удивил тот факт, что в AutoCAD MEP 3D нет готовых встроенных функций для такой операции.
Опять пришлось засучить рукава и вооружиться OARX 2013 и C#. Оказалось, что написать приложение для получения геометрических параметров достаточно просто. В итоге, родилось приложение MEPGeomProps. Описывать, как оно работает, наверное нет смысла, просто приведу протокол работы из командной строки.


Command: MEPGEOMPROPS

Select objects: Specify opposite corner: 6 found

Select objects:
Enter scale factor <.001>:

Accepted entities: 6
Skiped entities: 0
Area of accepted entities: 116.347896918749
Area of accepted entities with insulation: 1.59315380862003
Volume of accepted entities: 49.9199242101251
Volume of accepted entities with insulation: 0.151828935367589

Линейный масштабный коэф. по-умолчанию равен 0.001, что соответствует кубическим и квадратным метрам.

В результате, расчет выдает:

  • площадь поверхности обработанных примитивов
  • площадь поверхности обработанных примитивов с учетом изоляции
  • объем обработанных примитивов
  • объем обработанных примитивов с учетом изоляции

Вот и все. Как всегда просто и элегантно.

понедельник, 20 августа 2012 г.

Stora и Samsung 2012

Пару недель назад привезли мне новые телевизоры UE40ES5500 и UE32ES6757. Но общая радость, а особенно детей, т.к. 32" телевизор предназначался для детской, была недолгой. Встроенный AllShare Play видел домашние медиа-серверы с фильмами, мультфильмами и фотографиями, но при подключении писал, что список содержимого пуст.
Как оказалось, что-то не так в "королевстве" Samsung с протоколом DLNA или, возможно, отстает Mediatomb в развитии.
Техническая поддержка Samsung, как я и полагал, ответила, что технически устройство исправно, обновите прошивку и радуйтесь. Как будто они не знают, что при подключении телевизора со Smart TV к сети, первое, что он сделает - обновится!
В общем, как обычно, "спасение утопающих - дело рук самих утопающих". После долгих поисков и разочарований вышел на следующее решение.
Но, решение надо проверить. Тем более, оно рассчитано на, так сказать, полноценный Mediatomb с исходными текстами и компиляцией, а в моем случае использовалcя скомпилированный пакет для NetGear Stora, а вернее для nix'ов внутри нее.
В общем, с помощью друга на виртуальной машине была поднята Ubuntu 11.04. Под нее был скомпилирован Mediatomb с поддержкой javascript и указанным выше патчем. Надежды оправдались! Телевизоры увидели новый медиаплеер в сети, успешно к нему подключились, показали содержимое каталога и даже пытались проигрывать фильмы. Очевидно, из-за нехватки ресурсов попытка проиграть фильмы больше 2 Гб приводили к исчезновению связи с медиасервером.
Разумеется, такое не устроило меня и после недолгих раздумий на домашний "недосервер" была установлена та же Ubuntu 11.04 со всеми полезными пакетами: sshd, vsftpd, transmission, mediatomb, samba.
Подцепить сетевые хранилища удалось с помощью samba. В /etc/fstab прописал:

//192.168.10.5/FamilyLibrary/Audio /home/bsdadm/FamilyLibrary/Audio cifs user=Alxd,password= password 0 0
//192.168.10.5/FamilyLibrary/Video      /home/bsdadm/FamilyLibrary/Video cifs user=Alxd,password=password 0 0
//192.168.10.6/FamilyLibrary/Photos     /home/bsdadm/FamilyLibrary/Photos cifs user=Alxd,password= password 0 0

В настройке Mediatomb пришлось изменить mimetype для mkv в файле /etc/mediatomb/config.xml:
было map from="mkv" to="video/x-matroska"
стало map from="mkv" to="video/x-msvideo"

Кроме этого, там же изменил custom-http-header, чтобы заработали кнопки управления проигрывателем на пульте телевизора:

      add header="transferMode.dlna.org: Streaming"
      add header="contentFeatures.dlna.org: DLNA.ORG_OP=11;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01700000000000000000000000000000"

Также, в настройке Mediatomb включил ffmpegthumbnailer, т.к. на Ubuntu он заработал без проблем (NAS не поддерживает).

Отмечу, что на Ubuntu установленным на "железо" Mediatomb работает очень быстро. И еще, интересно, что некоторые фильмы, которые наотрез отказывались проигрываться посредством Mediatomb установленным на NAS, теперь начали проигрываться без проблем! В общем, теперь, можно просматривать фильмы, фотографии и домашние видеозаписи на любом телевизоре или переносном устройстве с поддержкой DLNA! И все это управляется с телевизионного пульта каждого телевизора!

Дополнение 1:
Ждал подобного комментария. Скачивайте mediatomb и устанавливайте в ubuntu командой apt-get install *.deb


вторник, 24 июля 2012 г.

Yii и дерево

Последнее время активно изучаю Yii Framework, которым весьма доволен. Однако, как всегда это бывает, чего-нибудь да не хватает в готовом решении. В моем случае, возникла потребность в оперировании иерархически упорядоченными данными, иначе - деревом. В Yii есть дерево, но мне оно по некоторым причинам не подошло и пришлось сделать свое.

Критерии:
  1. Источник данных - база данных mysql.
  2. Данные должны располагаться в одной таблице (можно и больше, но мне и одной хватило).
  3. Иерархичность должна обеспечиваться одним полем записи - ParentID (в моем случае - pid).
  4. Таблица данных должна формироваться на стороне mysql (хранимая процедура).
  5. Результат должен быть представлен в виде дерева похожего на "аккордеон".
  6. У каждой записи должен быть доступен набор команд.

Внешний вид, который планировалось получить и который получился в итоге:
Widget получил название  AlxdDataTree. Позволяет отобразить упорядоченный иерархический набор данных в виде раскрываемого как "аккордеон" дерева.
Входные данные для AlxdDataTree:
  1. Данные должны передаваться в AlxdDataTree в виде массива записей упорядоченных так, как они будут отображаться в дереве.
  2. Обязательно должны присутствовать поля: id - идентификатор; title - наименование, которое будет отображаться в дереве; level - уровень записи в дереве; count - количество записей в родителе.
  3. Перечень доступных команд для записей должен описываться в виде массива.
В путь...
Прежде всего, мне потребовалось создать таблицу и написать хранимую процедуру для получения данных, которые будут переданы контроллеру, а позже -  AlxdDataTree. 
Таблица получила название classificator. Вот ее перечень полей:

Описание полей:
id - уникальный идентификатор каждой записи
pid - идентификатор родителя
oid - идентификатор владельца классификатора
code - системное имя классификатора
name - наименование классификатора
createtime - дата создания записи
modifytime - дата изменения записи
Пример хранимых данных:

Следующим шагом стало написание хранимой процедуры. Мне понадобилось две хранимые процедуры. Первая используется рекурсией, вторая вызывается из контроллера и возвращает конечный результат.
Первая процедура получает на входе id родителя и его текущий level. Вторая процедура получает на входе oid владельца классификатора. Если владелец как таковой не нужен, можно удалить соотв. поле oid из таблицы и убрать входной параметр oid. Разумеется, придется поправить и сами процедуры.
Результат выполнения процедуры Call getClassificators(1):

Затем создал модель classificator с помощью Gii и контроллер с CRUD операциями. В коде действия Admin добавил следующее:
$classificators = Yii::app()->db->createCommand('call getClassificators('.$oid.');')->queryAll();

$this->render('admin',array(
'classificators'=>$classificators,
));
где, $oid - идентификатор владельца классификатора.

Как следствие, надо пришлось поправить и файл вида admin.php. Удалил в нем widget создающий CGridView. Добавил следующее:
$this->widget('ext.AlxdDataTree.AlxdDataTree', array(
'data'=>$classificators,
'idField'=>'id',
'titleField'=>'name',
'levelField'=>'lvl',
'countField'=>'cnt',
)
);

Как видно, AlxdDataTree расположен в каталоге extension в папке AlxdDataTree. Вот так:

Результат работы приложения:


Вот и все!

А вот и AlxdDataTree со всеми стилями, скриптами, картинками и sql-запросами. Никакой регистрации приложения в Yii не требуется, достаточно просто распаковать архив в папке extension. Файлы sql исключительно для примера и на работу самого widget'а не влияют. Каждый может написать свою процедуру для получения конечной таблицы данных.



среда, 23 мая 2012 г.

Новенькое в ATable 8.x (май 2012)

Описывать исправленные ошибки как всегда не стану, они были, есть и будут есть. Без них никто не пишет. Стараюсь делать код стабильнее и "непадучее".
Из новенького...
1. Пополнил наконец-то список свойств таблицы в окне свойств объекта


2. Добавил подсвечивание выбранных ячеек в чертеже


3. Добавил опцию управления таблицей через командную строку и выбор ячеек мышкой (пока тестовый режим и не все субопции работают)


Пока все. Удачи!

Таблицы ATable 6.x превращаются в ATable 8.x

Я точно знаю, что на нашей Земле много пользователей, которые использовали и, вероятно, до сих пор используют, ATable 6.x (в основном версию 6.8). В первую очередь для них я написал модуль ATable6x2Grid, который включил в пакет ATable for AutoCAD 2012, который позволяет импортировать таблицы сделанные в старой версии 6.х в новый редактор версии 8.х.

Импорт описывать нет смысла, он вызывается из меню:

























Потом на чертеже достаточно выбрать таблицу сделанную в ATable 6.х и все! Удачи в работе!

AlxdExtension


Хочу отдельно написать о модуле AlxdExtension, который предназначен в первую очередь для добавления математических функций в ATable for AutoCAD, но может быть использован и без последнего.
В настоящий момент в AlxdExtension всего 2 дополнительные функции:
Sum – сумма всех передаваемых параметров. При суммировании отбрасываются те параметры, которые не могут быть интерпретированы как число.
Пример на Lisp: (sum 1 2 a b) результат 3
Пример в ATable: =sum(1;2;a;b) результат 3

Sumproduct – сумма произведений всех передаваемых значений. Значения должны передаваться списками равной длины.
Пример на Lisp: (sum '(1 3) '(2 2)) результат 8
Пример в ATable: =sum(A1:A2;B1:B2) результат 8