| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как сделать "attsync" для одного или нескольких выбранных блоков?

Как сделать "attsync" для одного или нескольких выбранных блоков?

Ответ
Поиск в этой теме
Непрочитано 14.12.2016, 14:23 #1
Как сделать "attsync" для одного или нескольких выбранных блоков?
Nike
 
Шаражпроектхалтурмонтаж
 
Талды-Париж
Регистрация: 29.10.2004
Сообщений: 5,989

Привет всем!

Копирую блок со смещенными атрибутами с помощью (command "_copybase" ...

Нужно после копирования вернуть атрибуты блока на свои домашние места.

Команда "attsync" влияет на все вхождения блока.

В Toolpac есть такая команда - "reinsert", функция (c:dstp_blkreins), но мне бы лиспом.

Кто знает, подскажите, пожалуйста.

Просмотров: 5746
 
Непрочитано 14.12.2016, 20:05
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Ну, определяешь все параметры вхождения (цвет, вес и тип линии, слой, систему координат, точку вставки и т.п.), потом с ее учетом (и не забывая про выравнивания) вычисляешь все необходимые параметры для атрибутов и назначаешь.
Звучит просто, но реализовать - геморройно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.12.2016, 21:28
#3
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


Кулик Алексей aka kpblc, мне бы только атрибуты на родное место вернуть, остальные параметры не интересуют.
Как до точки расположения атрибута добраться и где хранится информация о точке расположения, заданная при определении блока даже и представить пока не могу.
Буду дальше искать, спасибо!
Nike вне форума  
 
Непрочитано 14.12.2016, 22:52
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Если коротко (а длинно, извини, не получится): находишь указатель на описание блока, проходишь по его примитивам, фильтруешь атрибуты, высчитываешь их точки вставки и выравнивания, а потом уже преобразования выполняешь, ориентируясь на вхождения этого блока.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.12.2016, 07:55
#5
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Как-то так
Вложения
Тип файла: lsp attreturnall.lsp (8.5 Кб, 40 просмотров)

Последний раз редактировалось roaa, 20.12.2016 в 05:43.
roaa вне форума  
 
Автор темы   Непрочитано 15.12.2016, 10:41
#6
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


roaa, спасибо!

Работает, но при этом происходит ошибка

Код:
[Выделить все]
 Команда: (_sensor_att_blk_return (vlax-ename->vla-object (car (entsel))))

Выберите объект: ; ошибка: Ошибка Automation. Неприменимо
на строках

Код:
[Выделить все]
 (vlax-3d-point 
         (setq _atText 
                       (mapcar '+ _blkins 
                         (mapcar '(lambda (x)(* x _blkscal)) _atStart)
                       ) ;_ end mapcar
         ) ;_ end setq
       )
А вторая просит функцию _SENSOR_PRIM_SEL

Код:
[Выделить все]
 Команда: (mapcar '(lambda (x)(_sensor_att_blk_return x))(_sensor_prim_sel (ssget) 't))
Выберите объекты: найдено: 1

Выберите объекты:
; ошибка: no function definition: _SENSOR_PRIM_SEL





Вот еще нашел программу от Lee Mac:

Код:
[Выделить все]
 ;; Restore Attribute Position  ~  By Lee McDonnell (Lee Mac)  ~  12.12.2009

(defun c:ResAtt (/ *error* BLK DOC ENT NPT OBJ UFLAG VEC)
  (vl-load-com)

  (setq doc (vla-get-ActiveDocument
              (vlax-get-acad-object)))

  (defun *error* (msg)
    (and uflag (vla-EndUndoMark doc))
    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
        (princ (strcat "\n** Error: " msg " **")))
    (princ))
    

  (while
    (progn
      (setq ent (car (nentsel "\nSelect Attribute to Reset: ")))

      (cond (  (eq 'ENAME (type ent))

               (if (eq "AcDbAttribute"
                       (vla-get-ObjectName
                         (setq obj (vlax-ename->vla-object ent))))
                 
                 (if (eq :vlax-true (vla-get-LockPosition obj))
                   (princ "\n** Invalid Attribute Type **")

                   (progn
                     (setq uflag (not (vla-StartUndoMark doc)))

                     (vlax-for sub (vla-item
                                     (vla-get-Blocks doc)
                                       (vla-get-Name
                                         (setq blk (vla-ObjectIdtoObject doc (vla-get-OwnerID obj)))))

                       (if (and (eq "AcDbAttributeDefinition" (vla-get-ObjectName sub))
                                (apply (function eq)
                                       (mapcar (function strcase)
                                               (mapcar (function vla-get-TagString) (list obj sub)))))
                         
                         (setq vec (vlax-safearray->list
                                     (vlax-variant-value

                                       (vlax-get-property sub
                                         
                                         (if (eq acAlignmentLeft (vla-get-Alignment obj))

                                           'InsertionPoint 'TextAlignmentPoint)))))))

                     (if vec
                       (progn
                         (setq nPt (mapcar (function +) (vlax-safearray->list
                                                          (vlax-variant-value
                                                            (vla-get-InsertionPoint blk))) vec))
                         (vlax-put-property obj
                         
                           (if (eq acAlignmentLeft (vla-get-Alignment obj))
                             
                             'InsertionPoint 'TextAlignmentPoint)

                           (vlax-3D-point nPt))))
                     
                     (setq uflag (vla-EndUndoMark doc))))
                 
                 (princ "\n** Object Must be an Attribute **"))))))
  (princ))
Но в ней не учитывается масштаб вхождения блока и для блоков с масштабом, отличным от 1, атрибуты смещаются некорректно.

Последний раз редактировалось Nike, 15.12.2016 в 12:10.
Nike вне форума  
 
Непрочитано 15.12.2016, 12:53
#7
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Nike,
Кое что поправил (пост выше) ...пробуйте. Acad 2017 x32 - проблем нет
Цитата:
Сообщение от Nike Посмотреть сообщение
Но в ней не учитывается масштаб вхождения блока и для блоков с масштабом, отличным от 1, атрибуты смещаются некорректно.
атрибуты перемещаются в точку вставки блока

Последний раз редактировалось roaa, 15.12.2016 в 13:11.
roaa вне форума  
 
Автор темы   Непрочитано 15.12.2016, 13:17
#8
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


Цитата:
Сообщение от roaa Посмотреть сообщение
атрибуты перемещаются в точку вставки блока
Нет, не в точку вставки блока, а на своё место, но как если бы блок был бы в масштабе 1, т.е. масштаб блока не учитывается.
Nike вне форума  
 
Непрочитано 15.12.2016, 13:24
#9
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Цитата:
Сообщение от Nike Посмотреть сообщение
(if (eq acAlignmentLeft (vla-get-Alignment obj)) 'InsertionPoint 'TextAlignmentPoint)
в самом коде
roaa вне форума  
 
Автор темы   Непрочитано 15.12.2016, 13:26
#10
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


Цитата:
Сообщение от roaa Посмотреть сообщение
в самом коде
в коде мне не понять что, но при масштабе 1 атрибут попадает не в точку вставки блока, а на свое место, а если при другом масштабе покрутить колесом, то увидем вот что точка вставки блока и ручка атрибута не совпадают

Цитата:
Сообщение от roaa Посмотреть сообщение
Кое что поправил (пост выше) ...пробуйте. Acad 2017 x32 - проблем нет
Атрибут первого блока отрабатывается, а затем происходи та же ошибка
на строках
Код:
[Выделить все]
        (vlax-3d-point 
         (setq _atText 
                       (mapcar '+ _blkins 
                         (mapcar '(lambda (x)(* x _blkscal)) _atStart)
                       ) ;_ end mapcar
         ) ;_ end setq
       ) ;_ end vlax-3d-point
и программа прерывается

AutoCAD 2011

Последний раз редактировалось Nike, 15.12.2016 в 14:14.
Nike вне форума  
 
Непрочитано 19.12.2016, 10:25
#11
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Вот что у меня получилось
Вложения
Тип файла: lsp attreturnall.lsp (8.0 Кб, 17 просмотров)

Последний раз редактировалось roaa, 20.12.2016 в 05:43.
roaa вне форума  
 
Автор темы   Непрочитано 19.12.2016, 12:29
#12
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


Ув. roaa, спасибо!

Однако:

Код:
[Выделить все]
 Команда: attreturn
Выберите атрибут для перемещения: ; ошибка: no function definition: 
_SENSOR_PRIM_ATT_VLA_LST
; сброс после ошибки

_SENSOR_PRIM_ATT_VLA_LST нашел в предыдущей версии программы, вставил в код.

При выполнении выбранный атрибут возвращается на место, затем происходит ошибка:
Код:
[Выделить все]
 Команда: attreturn

Выберите атрибут для перемещения: ; ошибка: неверный тип аргумента: VLA-OBJECT 
nil
; сброс после ошибки
на строке
Код:
[Выделить все]
 (vla-EndUndoMark doc) t
Закомментировал StartUndoMark и EndUndoMark - выполняется нормально.

То же с attreturnall.

(_sensor_att_blk_return (vlax-ename->vla-object (car (entsel)))) не работает:

Код:
[Выделить все]
 Команда: (_sensor_att_blk_return (vlax-ename->vla-object (car (entsel))))
Выберите объект: ; ошибка: слишком мало аргументов
; сброс после ошибки
Nike вне форума  
 
Непрочитано 19.12.2016, 12:39
#13
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


извините, забыл функцию впопыхах


Цитата:
Сообщение от Nike Посмотреть сообщение
(_sensor_att_blk_return (vlax-ename->vla-object (car (entsel)))) не работает:
(_sensor_att_blk_return (vlax-ename->vla-object (car (entsel))) nil) для возврата всех атрибутов блока
(_sensor_att_blk_return (vlax-ename->vla-object (car (entsel))) <name attribut>) для возврата определенного атрибута (строковая)

Команда attreturn выполняется на основе nentsel и зациклен на точное попадание по атрибуту.
Поэтому attreturnall предпочтительней для выполнения (на основе ssget).
Вложения
Тип файла: lsp attreturnall.lsp (9.0 Кб, 48 просмотров)

Последний раз редактировалось roaa, 20.12.2016 в 05:41.
roaa вне форума  
 
Автор темы   Непрочитано 19.12.2016, 21:55
#14
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


roaa, спасибо!
Всё работает (только без UndoMark, иначе - ошибка).
Nike вне форума  
 
Непрочитано 19.12.2016, 23:55
1 | #15
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Метки отмены (ИМХО) лучше делать все же в вызываемой команде: http://adn-cis.org/undomarks-lisp.html
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.12.2016, 05:42
1 | #16
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Добавил проверку на атрибут. Пост выше
roaa вне форума  
 
Автор темы   Непрочитано 20.12.2016, 12:37
#17
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


roaa, спасибо, все работает.
Nike вне форума  
 
Непрочитано 21.12.2016, 09:15
1 | #18
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


чуть не в тему немного переделанный attmove от Aleksandr Smirnov attmove.lsp
roaa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как сделать "attsync" для одного или нескольких выбранных блоков?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перенос блоков с одного документа на другой magvd AutoCAD 8 09.05.2012 21:37
При переносе блока из одного файла в другой он пропадает что сделать? dextron3 AutoCAD 8 26.10.2011 20:05
Как сделать связь с ж\б коллонной и выпусками арматуры из пенобетонных блоков???((( Сергей454 Железобетонные конструкции 14 20.08.2011 02:35
Как сделать динамический блок из нескольких солид тел? Scrubber Динамические блоки 5 22.09.2010 22:29
Печать нескольких чертежей из одного файла myrs AutoCAD 19 14.06.2008 16:31