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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Изменить точку вставки блока

Изменить точку вставки блока

Ответ
Поиск в этой теме
Непрочитано 04.10.2007, 15:10 #1
Изменить точку вставки блока
Apelsinov
 
Проектировщик ВК. LISP-любитель.
 
Москва
Регистрация: 15.12.2003
Сообщений: 1,202

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

Есть ли способ сделать это иначе, кроме как исправлением точки вставки блока (например - расположение параметра точки вставки в блокэдиторе), и последующим перемещением вставок соответственно смещению точки вставки?
__________________
apel.fas
Просмотров: 40167
 
Непрочитано 04.10.2007, 15:45
#2
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Вот тут
http://www.autocad.ru/cgi-bin/f1/board.cgi?t=38163rN
я глупо бился над этой проблемой.
Пришел к выводу, что без программирования не обойтись.
Profan вне форума  
 
Непрочитано 04.10.2007, 15:50
#3
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


А какая цель преследуется? Если надо существующий блок "вставлять за другое место" - (без приколов пожалуста) - то можно просто добавить параметр выравнивания, а если для чего-то другого :?: то напиши для чего.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 04.10.2007, 15:58
#4
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


А в редакторе блоков поменять местоположение параметра "базовая точка" не то, что требуется?
Упс, виноват, не дочитал...
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Автор темы   Непрочитано 04.10.2007, 16:51
#5
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Цитата:
Сообщение от Дима_
А какая цель преследуется? Если надо существующий блок "вставлять за другое место" - (без приколов пожалуста) - то можно просто добавить параметр выравнивания, а если для чего-то другого :?: то напиши для чего.
В основном нужно для исправления криворукосделаных чертежей, где точки вставки блоков находятся чертигде, но только не в пределах габаритов самих этих блоков. С такими чертежами тяжело работать.
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 04.10.2007, 20:41
#6
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


С такими образцами надо бороться решительно и навсегда - переделывать их нафиг целиком - ибо если их за основу брать наверняка еще куча неизвестно-чего вылезет, ищи потом какую он там переменную настроил - лучше день помучаться, а потом за 5 минут долететь.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 04.10.2007, 22:18
#7
T-Yoke

Артиллерист - вертолётчик. Дипломированный инженер-механик. Technologist
 
Регистрация: 29.11.2004
Где-то около Москвы
Сообщений: 16,753
Отправить сообщение для T-Yoke с помощью Skype™


Цитата:
Сообщение от Apelsinov
Цитата:
Сообщение от Дима_
А какая цель преследуется?...
...В основном нужно для исправления криворукосделаных чертежей, где точки вставки блоков находятся чертигде, но только не в пределах габаритов самих этих блоков. С такими чертежами тяжело работать.
Вот всегда так! Вместо того чтобы, пару раз лишить премии или устроить "темную" криворукому автору. Решаем как его творчество улучшать. Мой вам совет, "Не надо бороться со следствием, боритесь с причиной"
__________________
«Артиллерия не токмо грохот, но и наука!» Пётр I
T-Yoke вне форума  
 
Непрочитано 04.10.2007, 23:32
#8
Кулик Алексей aka kpblc
Moderator

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


Если бы была гарантия того, что все блоки вставлены в мировой системе координат, что текущая система координат мировая, не изменена base, insbase, что блоки имеют масштабы по осям, равные 1, еще можно было бы попытаться что-то изобразить. А так... Голову сломаешь.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.10.2007, 10:39
#9
cheeppy

Инженер
 
Регистрация: 22.01.2006
Краснодар
Сообщений: 16


Я сумел только тупо сделать это
Цитата:
изменить расположение точки вставки блока, но так, чтобы расположение примитивов вставок блока относительно чертежа осталось прежним, то есть - вставки не "уехали" вслед за измененной точкой вставки
программно, переопределяя блок с новой точкой вставки и перемещая блоки чертежа соответственно, с учетом угла поворота и масштаба.
Но результат иногда(правда редко), в зависимости от единиц вставки блока, сиситемы координат вставки и т.п., не радует. Ну и динамические блоки, мультивставки - не воспринимает вообще.
Если еще нужно, могу выложить лиспик "как есть"(типа работает и ладно)
__________________
То, чего нельзя сделать в Acade, не существует.
cheeppy вне форума  
 
Непрочитано 05.10.2007, 13:27
#10
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Когда-то подобное делал для 3D моделей - пробовал через матрицы трансформации, через синусы-косинусы - чуть не свихнулся! и всё равно не всегда правильно получалось с углами поворота!!!
А потом плюнул на всё и сделал "по тупому" - работает идеално в моих условиях. Код примерно такой:

Код:
[Выделить все]
;|
xyz - координата новой базы в системе координат блока, можно список (x y z) или variant
name - имя этого блока
пример вызова:    (ad-move-basa-block '(0 0 -1596) "beton-1")
|;

(defun ad-move-basa-block (xyz name / adoc blocks temp_name temp_block item xyz000 block bl)
  (vl-load-com)
  (if (= (type xyz) 'list)
    (setq xyz (vlax-3d-point xyz))
    ) ;_ end if
  (setq adoc       (vla-get-activedocument (vlax-get-acad-object))
        blocks     (vla-get-blocks adoc)
        xyz000     (vlax-3d-point 0.0 0.0 0.0)
        temp_name  (strcat "ad-temp_" (itoa (fix (getvar "date"))))
        block      (vla-item blocks name)
        temp_block (vla-add blocks xyz000 temp_name)
        insert     (vla-insertblock temp_block xyz000 Name 1.0 1.0 1.0 0.0)
        ) ;_ end setq
  (vla-put-Explodable block :vlax-true)
  (vla-put-Explodable temp_block :vlax-true)
  (vla-move insert xyz xyz000)
  (vla-explode insert)
  (vla-delete insert)
  (vlax-for item block (vla-delete item))
  (vla-insertblock block xyz temp_name 1.0 1.0 1.0 0.0)
  (vlax-for bl blocks
    (vlax-for item bl
      (and (= (vla-get-objectname item) "AcDbBlockReference")
           (= (vla-get-name item) name)
           ;|####  Можно через  (vl-cmdf "_.explode"), см. описание в конце  ###|;
           (not (vl-catch-all-error-p
                  (vl-catch-all-apply 'vla-explode (list item))
                  ) ;_ end vl-catch-all-error-p
                ) ;_ end not
           (vla-delete item) ;|####  .....  ###|;
           ) ;_ end and
      ) ;_ end vlax-for
    ) ;_ end vlax-for
  (vla-delete block)
  (vla-put-name temp_block name)
  (princ)
  ) ;_ end defun
Идея простая, но надёжная, все слои должны быть разблокированы. Ограничения только на масштабы вставок - должны быть равны по модулю на всех осях (это ограничение для vla-explode). Если и это важно. то можно использовать (vl-cmdf "_.explode"), но она работает только в активном пространстве, позтому для вложеных блоков придётся повозиться немного (я не хочу).
Евгений А. вне форума  
 
Непрочитано 19.10.2007, 22:54
#11
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Условия: Куча копий блока в разных местах и с разными углами поворота. Точки вставки светятся как звезды на небе, но не на самих блоках.
Надо: Чтобы точки вставки были на графике, но чтобы графика осталась на месте.

Решения: Их два. Первое попроще, но ручное, второе посложнее и для макроса.
Первое решение:
1. Переименовываем блок. Делаем ему имя "Технический" (к примеру). Все блоки теперь - "Технический". И обязательно purge - удаляем из таблицы блок с первоначальным именем. (хотя там их не должно быть)
2. Копируем в буфер любую из копий и открываем второй чистый файл (теперь открыто два файла первый - с моделью и второй чистый)
3. Вставляем из буфера в чистый файл блок.
4. Возвращаем ему его первоначальное имя.
5. Открываем его редактором и наводим порядок с положением точки вставки
6. Выходим из редактора и копируем отремонтированный блок в буфер
7. Возвращаемся в файл с моделью.
8. Открываем редактором блок "Технический"
9. Вставляем из буфера на место графики блок с первоначальным именем и правильной точкой вставки. Я с начала линию подвожу к месту куда точка вставки должна стать, затем убиваю графику и вставляю из буфера блок. Он сволочь, вставляется не туда, куда я показываю, а в 0,0 и приходится его перетаскивать к линии. После чего сношу линию. Если рядом с графикой атрибуты есть - снести.
10. Выходим из редактора, включаем ручки у всех копий блока "Технический" (ну макросом естественно) и взрываем.
После взрыва блока, его начинка остается на своем месте а она является блоком с первоначальным именем.
Если сравнить порядок расположения вхождений блока "Технический" и порядок вновь появившегося блока, то они по идее совпадут. не проверял. А это значит, что перед всеми этими манипуляциями можно сохранить значения динамических свойств, а потом эти значения прописать новичкам.

Второй вариант:
1. Создаем блок "Точка" с точкой внутри на месте точки вставки. Короче все в одной точке.
2. Заходим в редактор блока и ставим эту точку на графику в то место, куда потом станет точка вставки.
3. Выходим из редактора и программно делаем следующее:
3.1. Создаем набор из всех вхождений этого блока
3.2. К каждому элементу набора применяем следующую последовательность действий
3.2.1. Записать метку блока (любые ориентиры на вхождение)
3.2.2. Взорвать блок
3.2.3. Включить через моделспейс ручку у блока "Точка"
3.2.4. Записать ее координаты в моделе и привязать к метке блока
3.2.5. Вернуть Undo-й блок в целостное состояние
4. Открываем редактором блока наш блок и ставим графику на место. В модели все блоки разлетаются кто куда.
5. Программно переносим каждое вхождение блока по координатам привязанным к его метке.
Все. Пригодно даже для динамических блоков, даже если при перемещении графики внутри блока заново переопределяешь привяку к элементам.
Supermax вне форума  
 
Непрочитано 20.10.2007, 15:53
#12
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


-> Supermax
Собственно код выше примерно так и работает (всё даже немного проще)
Евгений А. вне форума  
 
Непрочитано 20.10.2007, 16:48
#13
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Отлично!
Как побочный эффект - восстановилась видимость выключенных деталей. Надо набирать лисп выражение - грусть. А так - супер.
Надо запускать редактор через commands просить указать точку и сваливать. Загруженный и запущенный лисп продолжает работать пока не закончится. Смело можно ползать по файлам и пространствам.

Да, к сожалению, динамические блоки разваливаются.

У динамических блоков перенос графики может разрушить динамические свойства. Но я двигал по Z и все остается работоспособным. А X и Y можно просто точку вставки с 0,0,0 перенести.

Открываем прямо из под лиспа редактор блоков, просим указать новую точку вставки, запоминаем X, Y, Z двигаем графику только по Z, а потом
(Command "_BParameter" "B" "872.2095,997.3218") и вываливаемся.

Последний раз редактировалось Supermax, 20.10.2007 в 17:15.
Supermax вне форума  
 
Непрочитано 20.10.2007, 19:30
#14
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Попробуй мой готовый вариант (он работает немного по другому), правда попробовал динамические блоки - результат странный: вставки и грипса (якобы базовая точка!) остаются на прежнем месте, а у новых блоков грипса базы уже там где надо.

Программа лежит здесь http://ad-cad.narod.ru/Help-Paper.htm команда "AD" (недокументированная) в списке выбираешь "изменить базовые точки у блоков" - будет цикл по всем блокам модели, надо будет указывать новую базу или "esc", чтобы пропустить.
Евгений А. вне форума  
 
Непрочитано 20.10.2007, 21:32
#15
Кулик Алексей aka kpblc
Moderator

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


Исходников, я так понимаю, не будет?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.10.2007, 23:49
#16
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Исходников, я так понимаю, не будет?
Да можно, если устраивает результат
Код:
[Выделить все]
(defun ad-move-basa-block (xyz name / adoc blocks temp_name temp_block item xyz000 block
                           bl vlo)
  (vl-load-com)
  (if (= (type xyz) 'list)
    (setq xyz (vlax-3d-point xyz))
    ) ;_ end if
  (setq adoc       (vla-get-activedocument (vlax-get-acad-object))
        blocks     (vla-get-blocks adoc)
        xyz000     (vlax-3d-point 0.0 0.0 0.0)
        temp_name  (strcat "ad-temp_" (itoa (fix (getvar "date"))))
        block      (vla-item blocks name)
        temp_block (vla-add blocks xyz000 temp_name)
        insert     (vla-insertblock temp_block xyz Name 1.0 1.0 1.0 0.0)
        ) ;_ end setq
  (vlax-for vlo block (vla-move vlo xyz xyz000)) 
  (vla-put-Explodable temp_block :vlax-true)
  (vlax-for bl blocks
    (if (not (equal temp_block bl))
      (vlax-for item bl
        (and (= (vla-get-objectname item) "AcDbBlockReference")
             (= (vla-get-name item) name)
             (null (vla-put-name item temp_name))
             (not (vl-catch-all-error-p
                    (vl-catch-all-apply 'vla-explode (list item))
                    ) ;_ end vl-catch-all-error-p
                  ) ;_ end not
             (vla-delete item) ;|####  .....  ###|;
             ) ;_ end and
        ) ;_ end vlax-for
      ) ;_ end if
    ) ;_ end vlax-for
  (vl-catch-all-apply 'vla-delete (list temp_block))
  ) ;_ end defun
Евгений А. вне форума  
 
Непрочитано 21.10.2007, 00:04
#17
Кулик Алексей aka kpblc
Moderator

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


вариант, на котором код не срабатывает ожидаемым образом - во вложении (форматы файлов 2007 и 2004). Ошибка при выполнении последней строки; перемещение примитивов блока выполняется неверно; вхождения блока теряют собственные настройки. Код слеганца переделал:
Код:
[Выделить все]
(defun ad-move-basa-block (xyz      name     /        adoc     blocks
                           temp_name         temp_block        item
                           xyz000   block    bl       vlo
                           )

                          ;|
*    Пример вызова:
(ad-move-basa-block (getpoint "\nНовая базовая точка ") (cdr (assoc 2 (entget (car (entsel))))))
|;

  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vl-load-com)
  (if (= (type xyz) 'list)
    (setq xyz (vlax-3d-point xyz))
    ) ;_ end if
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (setq blocks     (vla-get-blocks adoc)
        xyz000     (vlax-3d-point 0.0 0.0 0.0)
        temp_name  (strcat "ad-temp_" (itoa (fix (getvar "date"))))
        block      (vla-item blocks name)
        temp_block (vla-add blocks xyz000 temp_name)
        insert     (vla-insertblock temp_block xyz name 1.0 1.0 1.0 0.0)
        ) ;_ end setq
  (vlax-for vlo block (vla-move vlo xyz xyz000))
  (vla-put-explodable temp_block :vlax-true)
  (vlax-for bl blocks
    (if (not (equal temp_block bl))
      (vlax-for item bl
        (and (= (vla-get-objectname item) "AcDbBlockReference")
             (= (vla-get-name item) name)
             (null (vla-put-name item temp_name))
             (not (vl-catch-all-error-p
                    (vl-catch-all-apply 'vla-explode (list item))
                    ) ;_ end vl-catch-all-error-p
                  ) ;_ end not
             (vla-delete item) ;|####  .....  ###|;
             ) ;_ end and
        ) ;_ end vlax-for
      ) ;_ end if
    ) ;_ end vlax-for
  (vl-catch-all-apply 'vla-delete (list temp_block))
  (vla-regen adoc acallviewports)
  (vla-endundomark adoc)
  (princ)
  ) ;_ end defun
И это на простых блоках, без динамики.
Вложения
Тип файла: dwg
DWG 2007
block_move.dwg (44.2 Кб, 5895 просмотров)
Тип файла: dwg
DWG 2004
block_move2k4.dwg (31.5 Кб, 5869 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.10.2007, 01:47
#18
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


"вхождения блока теряют собственные настройки" - с этим согласен (у себя исправил + добавил проверку слоёв), а в остальном - ты не прав по условию (читай пост №10 - там я говорил про масштабы и про vla-explode, и там же читай вторую строку листинга про xyz - это далеко не (getpoint "\nНовая базовая точка ")
Я делал это под себя для работы с твёрдотельной моделью, когда все масштабы по осям равны 1 (!!!), зато есть повороты,координаты вставок и главное - глубокая вложенность блоков.
Остальные варианты мне не очень интересны, хотя и их сделать не трудно...

Последний раз редактировалось Евгений А., 21.10.2007 в 02:09.
Евгений А. вне форума  
 
Непрочитано 21.10.2007, 02:17
#19
Кулик Алексей aka kpblc
Moderator

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


Я проводил тестирование, указав левый верхний блок в качестве основного. А там и масштабы, и угол поворота - все "по правилам".
Читаю то, что сказано в
Код:
[Выделить все]
  (if (= (type xyz) 'list)
    (setq xyz (vlax-3d-point xyz))
    ) ;_ end if
Исходя из этого, я могу указать точку как мне угодно, лишь бы не вызвало падения кода. А если так, то кто мешает точку указывать как (getpoint)? Все равно ж возвращается список из 3 вещественных чисел, которые потом благополучно преобразовываются в variant.
В остальном я подошел с точки зрения юзера, которому надо "ткнуть и указать". Потому что выполнить "передвижку" примитивов внутри блока можно и без подобных операций "разбить-собрать": vla-move и вперед. Примерно так (сейчас acad на переустановке, пишу "по памяти" и для версий от 2006 и выше:
Код:
[Выделить все]
(defun _move-in-block(name pt / def)
;|
*    name - имя блока. Для дин.блоков указывать EffectiveName
*    pt     - то же, что и xyz
|;
(vlax-for subent (setq def (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) name))
(vla-move subent (vla-get-origin def) (cond ((=(type pt) 'list) (vlax-3d-point pt)) (t pt)))
)
)
Основная трудность именно в удовлетворении достаточно предсказуемого (и обоснованного) желания "ткнуть" и получить результат. И вдобавок сделать такой код, чтобы он работал всегда.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.10.2007, 02:50
#20
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Вообще-то я показал только функцию , а не готовую программу, только чтобы подкинуть идею. Адрес на программу я указывал...
Цитирую из №10:
xyz - координата новой базы в системе координат блока... , а не в модели - это важно!
Про ошибку: База смещается в описании блока, в этот момент ВСЕ вхождения на этот блок смещаются тоже, в зависимости от нормали, угла поворота и масштабов (будь они не ладны), и чтобы всё поставить на место, надо что-то делать (сместить куда надо очку вставки) со ВСЕМИ вхождениями на этот блок (а не только то, которое выбрано через (entsel)), поэтому программа всё равно пытается расчленить вхождения с разными масштабами - вот тут и ошибка, а потом ест-но ошибка при удалении временного блока.
Евгений А. вне форума  
 
Непрочитано 21.10.2007, 03:20
#21
Кулик Алексей aka kpblc
Moderator

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


Так и vla-move делает то же самое - перемещает примитивы. И все. А работая внутри описания блока, ты ж меняешь все вхождения этого блока.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.10.2007, 10:46
#22
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Ух блин. О чём вообще сыр-бор? Первый пост уже наверное забыл... Запусти мою программу (№14) на на модели с равными по модулю масштабами - увидишь, что всё работает как задумывалось! А будет желание - сделаю и независимость от масштабов.
Евгений А. вне форума  
 
Непрочитано 21.10.2007, 21:18
#23
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Обновил свою прогу ! (см. пост №14) Сделал, как и грозился (после пива - пробило на подвиги ), независимость от масштабов (чтоб их ...), надеюсь все будут довольны.
Евгений А. вне форума  
 
Непрочитано 01.02.2012, 09:44
#24
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,994


Алексей, что-то код из п.17 не хочет работать, как положено( Точка вставки не перемещается в указанное место.
Может по прошествии лет все уже придумано давно в лучшем виде?
crosandr вне форума  
 
Непрочитано 01.02.2012, 18:18
#25
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


См. п.14 (ps: п.17 - кусок моей программы, Алексей его только поковырял и "испортил")
Евгений А. вне форума  
 
Непрочитано 01.02.2012, 22:50
#26
Кулик Алексей aka kpblc
Moderator

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


Раз испортил, значит, удалить? С меня станется, ты ж знаешь
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.02.2012, 00:22
#27
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


:-) Да пусть будет для истории. Я же в кавычках написал, просто смысл от "ковыряния" исказился от заложенного и результат стал не тот...
а в п.14 есть ссылка на мою готовую прогу и там как раз это - "Может по прошествии лет все уже придумано давно в лучшем виде?".
Евгений А. вне форума  
 
Непрочитано 02.02.2012, 12:30
#28
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,994


Цитата:
Сообщение от Евгений А. Посмотреть сообщение
а в п.14 есть ссылка на мою готовую прогу
Есть, но она компилированая. Исходники принципиально закрыты или лежат в другом месте?
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Раз испортил, значит, удалить?
может подправить лучше?
crosandr вне форума  
 
Непрочитано 02.02.2012, 13:08
#29
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от crosandr Посмотреть сообщение
может подправить лучше
И рад бы, да времени нет совсем
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.02.2012, 23:24
#30
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Ну зачем исходники, если сам подправить не можешь? Выкладывать исходники не хочется, так как это только часть большой программы (проект из 70-80 файлов уже), плюс там у меня уже и диалог в этой функции, и возможность поворота вокруг оси z, наверняка куча связанных функций и выкавыривать их мне совсем нету желания.
Евгений А. вне форума  
 
Непрочитано 11.04.2014, 13:33
#31
kalatravalimitedpro


 
Регистрация: 08.07.2013
Сообщений: 7


а как сделать так чтобы точка вставки не отображалась при выделении блока как например в блоке "дверь метрическая" ?
kalatravalimitedpro вне форума  
 
Непрочитано 11.04.2014, 13:48
#32
Кулик Алексей aka kpblc
Moderator

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


Точка вставки отображается, просто она совпадает с отображением линейного параметра.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.04.2015, 09:13
#33
WJ.13

из болота тащить бегемота
 
Регистрация: 30.07.2014
Новосибирск
Сообщений: 24
<phrase 1=


Подниму тему. Есть у кого-нибудь действующие решения по сабжу?

з.ы. Ранее опубликованные лиспы выдают ошибки (не работают); программу, выложенную Евгением А. в #14 посте, скачать не могу
WJ.13 вне форума  
 
Непрочитано 22.04.2015, 10:47
1 | #34
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,994


тынц
Вложения
Тип файла: lsp ChangeInsPoint.LSP (14.4 Кб, 61 просмотров)
crosandr вне форума  
 
Непрочитано 22.04.2015, 11:53
1 | #35
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Change Block Base Point

----- добавлено через ~5 мин. -----
Дополнительные функции для работы с блоками
Изменение точки вставки блока
Базовая точка существующего блока
LISP. Изменение базовой точки блока
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 22.04.2015 в 11:58.
VVA вне форума  
 
Непрочитано 21.03.2016, 00:21
#36
tujn08


 
Регистрация: 26.12.2013
Сообщений: 283


Подскажите пожалуйста- такая проблема.
В блоке есть атрибуты
Переписываю список вставки блока (10 X Y Z) т.е. смещаю точку вставки - обновляю блок. Блок смещается как надо, а атрибуты остаются на месте- помогает только редактор блока и сохранить. Чем лечить?
Vla - функции не использую.
tujn08 вне форума  
 
Непрочитано 21.03.2016, 01:05
#37
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от tujn08 Посмотреть сообщение
Чем лечить?
_.attsync ?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.03.2016, 08:31
#38
tujn08


 
Регистрация: 26.12.2013
Сообщений: 283


помогает, но блок ломается- щас с этим бороться надо (ломается от программы). Имя блока становиться *Uxx. Пропадают параметры расятжения.

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

Код:
[Выделить все]
 (progn ; если убавляем
	(setq b1 (subst (list '10 (+ (nth 0 pt) zna_E) (nth 1 pt) (nth 2 pt)) (assoc '10 (entget a)) (entget a) )) ; сдвиинули X блока влево
	(entmod b1)	(entupd a) ; обновляем блок
	(LM:setdynpropvalue blk "ширина" (+ zna_x (abs zna_E))) ; прибавили ширину
)
tujn08 вне форума  
 
Непрочитано 21.03.2016, 08:53
#39
Кулик Алексей aka kpblc
Moderator

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


Похоже, ты работаешь "не с тем" описанием блока. Что такое а и как получено? Что такое blk и как получено?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.03.2016, 09:00
#40
tujn08


 
Регистрация: 26.12.2013
Сообщений: 283


Код:
[Выделить все]
 (setq zna_E (getreal "Сместить на : ")) (terpri)
(setq nab_E (ssget "_C" point_1 point_2 (list (cons 0 "INSERT"))))
(setq
			i_E 0
			b_E (sslength nab_E)
		)
(setq a (ssname nab_E i_E))
(setq pt (cdr (assoc '10 (entget a)))) ; точка вставки блока
			(setq blk (vlax-ename->vla-object a))
			(setq zna_y (LM:getdynpropvalue blk "Длина,мм"))
			(setq zna_x (LM:getdynpropvalue blk "ширина"))

(setq b1 (subst (list '10 (+ (nth 0 pt) zna_E) (nth 1 pt) (nth 2 pt)) (assoc '10 (entget a)) (entget a) )) ; сдвиинули X блока влево
						  	(entmod b1)	(entupd a) ; обновляем блок
							(LM:setdynpropvalue blk "ширина" (+ zna_x (abs zna_E))) ; прибавили ширину

vla-move надо попробовать думаю будет нормально
tujn08 вне форума  
 
Непрочитано 21.03.2016, 09:06
#41
Кулик Алексей aka kpblc
Moderator

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


У тебя что а, что blk - указатели на вхождение блока. А менять надо описание.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.03.2016, 09:17
#42
tujn08


 
Регистрация: 26.12.2013
Сообщений: 283


Алексей, подскажи как...

Код:
[Выделить все]
 (vla-move blk (vlax-3d-point pt) (vlax-3d-point (list (+ (nth 0 pt) zna_E) (nth 1 pt) (nth 2 pt))))
Это вроде спасает, но свою ошибку хочу разобрать.
tujn08 вне форума  
 
Непрочитано 04.12.2020, 14:45
#43
monorog


 
Регистрация: 14.11.2019
Сообщений: 4


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

Последний раз редактировалось monorog, 21.12.2020 в 08:38.
monorog вне форума  
 
Непрочитано 04.02.2022, 18:34
#44
3Dwardas


 
Регистрация: 18.05.2015
Сообщений: 18


Цитата:
Сообщение от VVA Посмотреть сообщение
hange Block Base Point
Этот Ли Мак крутой чел! спасибо за подсказку !!
3Dwardas вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Изменить точку вставки блока