Jump to content

Recommended Posts

Есть программы которая считывает атрибуты блока и заполняет таблицу (например: общие данные).

Случайно заметил глюк. При очередном открытии файла (после просмотра его автокадом) атрибуты блоков немного "поплыли".

Помогает команда в командной строке "атробновить". Атрибуты в пространстве модели после этого выглядят нормально. Но программное чтение атрибута не видить его значения.

При этом в свойствах блока значения атрибутов видно. Чтобы исправить ситуацию приходится ручками заходить в редактирование атрибута блока и не редактируя выйти.

Что это может быть? и как избежать?

Link to comment
Share on other sites

15 часов назад, Vozhich сказал:

считывает атрибуты блока и заполняет таблицу (например: общие данные)

Вот  тут таблица, которая читает:

  • атрибуты формата;
  • дополнительные свойства файла (dwgProp);
  • разрешает ручной ввод.

Дополнительно читает координаты по Y и по X и проставляет поле "Номер страницы"  (правый верхний угол ) в блок формата.

Связь с атрибутами блока двухсторонняя. и постоянная. Обновление таблицы ( при изменении атрибутов, добавлении блоков) автоматическое.

 

"Пользовательской формы" в платформе не будет, но управлять таблицей можно с помощью "Инспектора"

image.png.f52f798452dbf5e53bc6e5190fe56f17.png

Нумерация поля -Номер страницы-.dwg

  • Like 1
Link to comment
Share on other sites

7 часов назад, XaraMathers сказал:

Код/файл секретные? Или можно взглянуть (хотя бы на lisp-функцию чтения атрибутов блока)?

да секртного нет ничего. Просто мне кажется вопрос и так понятен.

;===========================================
;Функция получения значений атрибутов блока;
;===========================================
;bl    - ссылка на блок
;sp_atr - список запрашиваемых атрибутов
;Возвращается список точечных пар
(defun F_pol_zn_atr_ov (bl sp_atr / at atr_bl sp_zn_atr naz_tek_atr)
  (setq sp_zn_atr (list))
  (setq atr_bl (vlax-safearray->list (vlax-variant-value (vla-GetAttributes bl)))) ;список ссылок на атрибуты
  (foreach at atr_bl;Поиск атрибутов
    (setq naz_tek_atr (vla-get-TagString at)) ;Название текущего атрибута
    (if (/= (member naz_tek_atr sp_atr) nil);Проверяем принадлежность атрибута запрашиваемому списку
      (if (= (vla-get-Visible at) :vlax-true)
    (setq sp_zn_atr (cons (cons naz_tek_atr (vla-get-TextString at)) sp_zn_atr))
    (setq sp_zn_atr (cons (cons naz_tek_atr "Невидемый") sp_zn_atr))
    );if
      );if
    );foreach
  (setq sp_zn_atr sp_zn_atr)
  );F_pol_zn_atr_ov

Link to comment
Share on other sites

1 час назад, MCAD сказал:

Вот  тут таблица, которая читает:

  •  

Возможно совпадение конечно, но после открытия Вашего файла у меня куда-то делось окно "свойство  объекта". И больше ни в одном файле открытом nanoCAD не появляется!

Link to comment
Share on other sites

3 минуты назад, MCAD сказал:

CTRL+1 не спасает ситуацию?

 

Ситуацию спасло. При продолжительном нажатии в левом верхнем углу появилось мальнькое окошко. Теперь все нормально! Спасибо!

  • Like 1
Link to comment
Share on other sites

1 час назад, Vozhich сказал:

после открытия Вашего файла

Там хороший пример, но он ориентирован на пользователей нанокад СПДС и Механика,  которые могут использовать "Пользовательские формы".

Управлять алгоритмом, заданным в примере, через "Инспектор"  достаточно сложно. Алгоритм должен быть другим.

Попробуйте на простом примере. Просто двигайте  блоки по X, Y и перемещайте из по слоям "Радуги".

Следите с атрибутами блока. 

image.png.2d715448076077e1cda163ab8515c50d.png

Двойная нумерация объектов ctlSetValue.dwg

Link to comment
Share on other sites

29 минут назад, MCAD сказал:

Попробуйте на простом примере. Просто двигайте  блоки по X, Y и перемещайте из по слоям "Радуги".

Следите с атрибутами блока. 

Пример интересный. Я предполагал что так можно с таблицами nanoCAD. Даже что-то пробовал изучая возможности. Но изначально вопрос был про глюк после команды "атробновить" при работе в ЛИСП. В Ваше примере после этой команда все хорошо, все также работает как и до нее.

Link to comment
Share on other sites

1 минуту назад, Vozhich сказал:

В Ваше примере после этой команда все хорошо, все также работает как и до нее.

Может выложить файл с  блоком? ;-) 

 

2 минуты назад, Vozhich сказал:

В Ваше примере после этой команда все хорошо, все также работает как и до нее.

Там атрибуты обновляются при любом действии с блоком. 

Link to comment
Share on other sites

6 минут назад, MCAD сказал:

Может выложить файл с  блоком? ;-) 

 

Пожалуйста - файл. Но может Вы не поняли вопроса? и предложи просто другое решение.

Суть вопроса в том что я ЛИСПом читаю атрибуты. Но после команды "атробновить" программа названия атрибутов видит, а их значения нет. Может это особеность ЛИСП, может что-то в настройках, а может глюк nanoCAD&

Пример.dwg

Link to comment
Share on other sites

31 минуту назад, Vozhich сказал:

Вы не поняли вопроса

Я это понял. Предложил альтернативу. 

 

20 часов назад, Vozhich сказал:

заполняет таблицу (например: общие данные).

Могу еще одну , про "Ведомость спецификации", но от этого суть не меняется.  В Вашем случае процедура одноразовая. В примере обновление "Формата" автоматически обновляет таблицу.

Link to comment
Share on other sites

В ‎24‎.‎09‎.‎2020 в 15:44, Vozhich сказал:

При очередном открытии файла (после просмотра его автокадом) атрибуты блоков немного "поплыли".

Помогает команда в командной строке "атробновить".

 

После просмотра атрибуты изменились? Невероятно...

Все-таки, предполагаю, что какие-то действия выполнялись.

Если была попытка редактирования описания блока, то список его атрибутов мог измениться.

Но это не касается уже присутствующих блоков.

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

При этом инспектор объектов может показывать у блока совершенно другой набор атрибутов, чем в его описании. 

 

Не могли бы уточнить, к какому блоку относится выявленная проблема, и в чем собственно она состоит (что именно немного "поплыло")?

Link to comment
Share on other sites

В 25.09.2020 в 17:06, EdwardSt сказал:

Не могли бы уточнить, к какому блоку относится выявленная проблема, и в чем собственно она состоит (что именно немного "поплыло")?

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

Link to comment
Share on other sites

Проблема не воспроизводится. В чертеже после прочистки неиспользуемых объектов осталось 4 блока с атрибутами.

С каким именно проблема?

Edited by EdwardSt
Link to comment
Share on other sites

Блоки с названием начинающимся с "Формат".

18 минут назад, EdwardSt сказал:

Проблема не воспроизводится.

Как воспроизводили? Запускали мою программу в моем файле?

Могу выслать и то и другое.

Link to comment
Share on other sites

4 минуты назад, Vozhich сказал:

Могу выслать и то и другое.

Это тоже может оказаться продуктивным.

 

Но я не увидел изменений в файле после запуска команды обновления атрибутов :(

Может, был невнимателен. Поэтому и спросил , к какому блоку относится проблема.

Повторюсь, их осталось 4 (после прочистки неиспользуемых)

 

Link to comment
Share on other sites

5 минут назад, EdwardSt сказал:

Но я не увидел изменений в файле после запуска команды обновления атрибутов

Я допускаю что изменений в файле не будет. Но вод лисповская команда значения не видит пока не зайдешь и не выйдешь из редактора атрибутов.

Link to comment
Share on other sites

2 часа назад, Vozhich сказал:

пожалуйста

 

Как я понял, не отображаются некоторые атрибуты при выводе их в таблицу.

Хотя они присутствуют, редактируются, а после редактирования уже попадают в твблицу.

 

Проанализировал один из блоков с атрибутами.

При анализе использовал функцию (entget …) , которую считаю более хлопотной в использовании, но значительно более надежной.

Выяснилось следующее:

1. Для атрибута  "НАЗВАНИЕ_Ч"  до редактирования функция выдает

                   ( ... (0 . "ATTRIB")  …  (1 . "") ... (2 . "НАЗВАНИЕ_Ч") ... (1 . "ВЛ 220 кВ \"Кубанская\". Схема и") )

   Из результата удалены все малозначительные DXF-группы. Оставлены только значащие для понимания сути.

        Наблюдаем две группы с кодом 1.  Первая содержит пустую строку, а вторая - текущее значение атрибута

 

Спойлер

DXF-код 1

Текстовая строка

Если длина текстовой строки меньше 250 символов, все символы отображаются в группе с кодом 1. Если строка содержит больше 250 символов, строка делится на блоки по 250 символов, которые отображаются в одной или нескольких группах с кодом 3. Если используются группы с кодом 3, последней группой является группа 1, и она содержит менее 250 символов.

DXF-код 3

Дополнительный текст (всегда в виде фрагментов по 250 символов) (необязательно)

 

 

 

2. После редактирования (просто открыл редактор и закрыл его) для того же атрибута имеем

           (... (0 . "ATTRIB") ... (1 . "ВЛ 220 кВ \"Кубанская\". Схема и") … (2 . "НАЗВАНИЕ_Ч") ... (1 . "ВЛ 220 кВ \"Кубанская\". Схема и") ...)

 

        Снова наблюдаем две группы с кодом 1.

        Первая  группа в точности равна второй.

 

Выдвигаю версию:

1. В результате экспериментов с программированием (или какими-то сторонними приложениями) исходное значение атрибута было модифицировано так, что первая группа с кодом 1 была превращена в пустую строку. При этом отображение атрибута производится в соответствии с наличием групп с кодом 3 и завершающей группы с кодом 1.

2. В результате вызова редактора элемент сначала актуализируется : все группы, начиная со второй приводятся к длине 250 символов, а последняя - сколько останется; первая группа устанавливается равной второй группе. После завершения редактирования, даже без фактического внесения изменений, имеем "правильный" элемент с корректными DXF-группами.  

3. Функция vla-GetAttributes , по-видимому, считывает только первую из групп с кодом 1. Т.е., она не собирает полный атрибут по частям (сначала группы 3 и завершающая группа 1). Что это - недоработка разработчиков или так задумано - вопрос открытый.

 

В качестве решения проблемы можно предложить отказаться от использования этой функции напрямую, а написать ее аналог с использованием комбинации функций (entget ...), (strcat ...) и разбором DXF-кодов.

 

Link to comment
Share on other sites

14 минут назад, EdwardSt сказал:

В результате экспериментов с программированием (или какими-то сторонними приложениями) исходное значение атрибута было модифицировано так, что первая группа с кодом 1 была превращена в пустую строку. При этом отображение атрибута производится в соответствии с наличием групп с кодом 3 и завершающей группы с кодом 1.

Возможно это связано с тем что блок "Формат..." перекочевал из автокада?

Link to comment
Share on other sites

12 минут назад, Vozhich сказал:

Возможно это связано с тем что блок "Формат..." перекочевал из автокада?

Необязательно.

Я только что провел эксперимент: Лиспом "обнулил" первую группу (изображение при этом не изменилось), а войдя в редактор опять актуализировал ее.

Это по-видимому, свойство DWG-формата, а не приложения. А вот реализация функции vla-GetAttributes , может различаться в разных САПРах (не проверял).

И эта тема возникает время от времени: "честный" сбор всего атрибута - довольно хлопотное дело, поэтому им часто пренебрегают.

Типа, атрибут длиной более 250 символов - очень редкое явление.

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

 

Настоятельно рекомендую заморочиться собственным формированием данных через использование изначальных (а, значит, более надежных) функций автолиспа.

vla-, vlax- - это супер. Быстро, но не всегда  универсально и надежно...

Link to comment
Share on other sites

4 минуты назад, EdwardSt сказал:

Типа, атрибут длиной более 250 символов - очень редкое явление.

Так у меня явно не 250 символов.

5 минут назад, EdwardSt сказал:

А вот реализация функции vla-GetAttributes , может различаться в разных САПРах

в автокаде все работало прекрасно.

6 минут назад, EdwardSt сказал:

Настоятельно рекомендую заморочиться собственным формированием данных через использование изначальных (а, значит, более надежных) функций автолиспа.

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

Link to comment
Share on other sites

1 минуту назад, Vozhich сказал:
9 минут назад, EdwardSt сказал:

А вот реализация функции vla-GetAttributes , может различаться в разных САПРах

в автокаде все работало прекрасно.

А вот это можно рассматривать, как прямое обращение к разработчикам.

Данная функция по-разному реализована в NC и АС.

  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт? Tell a friend!
×
×
  • Create New...