Перейти к содержанию

Рекомендуемые сообщения

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

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты
15 часов назад, Vozhich сказал:

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

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

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

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

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

 

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

image.png.f52f798452dbf5e53bc6e5190fe56f17.png

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

Ссылка на сообщение
Поделиться на другие сайты
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

Ссылка на сообщение
Поделиться на другие сайты
1 час назад, MCAD сказал:

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

  •  

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

Ссылка на сообщение
Поделиться на другие сайты
29 минут назад, Vozhich сказал:

куда-то делось окно "свойство  объекта".

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

 

img-2020-09-25-13-05-45.png.04cbe0ba5a6fa13c618f2315cce9be1b.png

Ссылка на сообщение
Поделиться на другие сайты
3 минуты назад, MCAD сказал:

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

 

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

Ссылка на сообщение
Поделиться на другие сайты
1 час назад, Vozhich сказал:

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

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

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

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

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

image.png.2d715448076077e1cda163ab8515c50d.png

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

Ссылка на сообщение
Поделиться на другие сайты
29 минут назад, MCAD сказал:

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
1 минуту назад, Vozhich сказал:

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

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

 

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
6 минут назад, MCAD сказал:

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

 

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

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

Пример.dwg

Ссылка на сообщение
Поделиться на другие сайты
31 минуту назад, Vozhich сказал:

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

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

 

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
В ‎24‎.‎09‎.‎2020 в 15:44, Vozhich сказал:

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

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

 

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

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

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

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

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

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

 

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

Ссылка на сообщение
Поделиться на другие сайты
В 25.09.2020 в 17:06, EdwardSt сказал:

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Изменено пользователем EdwardSt
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
4 минуты назад, Vozhich сказал:

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

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

 

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

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

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

 

Ссылка на сообщение
Поделиться на другие сайты
5 минут назад, EdwardSt сказал:

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

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

Ссылка на сообщение
Поделиться на другие сайты
3 минуты назад, Vozhich сказал:

лисповская команда

Просьба приложить файл со скриптом.

Ссылка на сообщение
Поделиться на другие сайты
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-кодов.

 

Ссылка на сообщение
Поделиться на другие сайты
14 минут назад, EdwardSt сказал:

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

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

Ссылка на сообщение
Поделиться на другие сайты
12 минут назад, Vozhich сказал:

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

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

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

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

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

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

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

 

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

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

Ссылка на сообщение
Поделиться на другие сайты
4 минуты назад, EdwardSt сказал:

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

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

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

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

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
1 минуту назад, Vozhich сказал:
9 минут назад, EdwardSt сказал:

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Расскажите друзьям

    Нравится Официальный форум компании Нанософт? Расскажите друзьям!
  • Похожий контент

    • От Танюха
      Установлен стиль печати монохром, а на печать выходят цветные линии, что делать?
       
      Для того чтобы распечатать чертеж в монохроме ( черно-былым) необходимо чтобы цвета на чертеже были указаны в индексах. Если цвет задан RGB( 0,0,0), то СТВ-таблицы его не обрабатывают и на печать выходит цвет.
       
      Lisp "layers(1)"  производит автоматическую замену цвета слоя заданного в RGB на индексированный.
       
      Пример работы:
      1. Цвет слоя задан в RGB 
      2. Загрузить lisp
      3. После выполнения команды CHGTCL  в командной строке появится сообщение о заменённых цветах в слоях
      4. В Диалоге Слои цвет задан индексом
       
       
      layers (1).lsp
    • От A.Kudrjashov
      В AutoLISP различие результата выполнения функций print и prin1 заключается в частности в том, что функция print предваряет вывод очередной порции текста переводом строки.
      В nanoCAD этого не происходит ! 

       
      TestPrint.lsp
       
      test-print_nanoCAD.txt
       
      test-print_AutoCAD.txt
    • От Танюха
      Отрисовка условного обозначения откосов дороги с возможностью регулировать расстояние между штрихами (2,4).
      Ролик снят в nanoCAD 20.1
      otkgp_1.lsp
    • От Танюха
      Значения координат точек (X,Y,Z) выводятся в системе координат nanoCAD, округленные до двух знаков после запятой. Вывод координаты Z можно отрегулировать. 
      geo_koord_mleader_adapt.lsp
    • От Танюха
      Нумерация точек чертежа вручную с возможностью задавать префикс, суффикс и угол поворота текста.
       
      Num_Nc.lsp
×
×
  • Создать...