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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как связать сист. коорд. текущего чертежа и внешней ссылки

Как связать сист. коорд. текущего чертежа и внешней ссылки

Ответ
Поиск в этой теме
Непрочитано 13.04.2010, 08:02 #1
Как связать сист. коорд. текущего чертежа и внешней ссылки
swkx
 
Регистрация: 22.01.2010
Сообщений: 311

Примитив в чертеже-ссылке имеет одни координаты, после вставки в текущий чертеж они, естественно, другие. Как мне их связать между собой? Именованных ПСК ни в ссылке, ни в текущем чертеже нет. Команда trans не помогает - выдает те же координаты, что и в ссылке.
Просмотров: 2457
 
Непрочитано 13.04.2010, 08:56
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,697
Отправить сообщение для Do$ с помощью Skype™


Пример чертежа и кода?
Do$ вне форума  
 
Непрочитано 13.04.2010, 10:46
#3
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Днепройт
Сообщений: 4,221


Экземпляр внеш. ссылки задает собой ПСК. В нее можно переключиться опцией "по объекту" (object) команды UCS.
И для нее можно пересчитать координаты функцией trans
__________________
Одно меня лишь радует - я это вижу сам! (С)
kp+ вне форума  
 
Автор темы   Непрочитано 13.04.2010, 16:01
#4
swkx


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


Координаты мелких окружностей в исходных файлах (-5, 18) и (-22, 8), а координаты этих же окружностей после вставки (-16, 85) и (5, 0). Как мне эти вторые координаты получить программно?

Вот кусок кода:

(setq ssallblk (ssget "X" '((0 . "INSERT"))))
(if (NOT (= ssallblk NIL))
(progn
(princ "\nÁëîêîâ: ") (princ (sslength ssallblk))

(setq num -1)
(repeat (sslength ssallblk)
(setq num (+ num 1))
(setq ename (ssname ssallblk num))
(setq edata (entget ename))

(setq blokname (cdr (assoc 2 edata)))
(setq blok (TBLOBJNAME "BLOCK" blokname))
(while
(setq blok (entnext blok))
(setq data (entget blok))
(setq primtype (cdr (assoc 0 data)))
(if (= primtype "CIRCLE")
(progn
(setq centr (cdr (assoc 10 data))) ; - центр окружности
....
Вложения
Тип файла: dwg
DWG 2007
Тест.dwg (69.5 Кб, 542 просмотров)
Тип файла: dwg
DWG 2007
Блок1.dwg (99.8 Кб, 548 просмотров)
Тип файла: dwg
DWG 2007
Блок2.dwg (100.6 Кб, 540 просмотров)

Последний раз редактировалось swkx, 13.04.2010 в 19:53.
swkx вне форума  
 
Непрочитано 13.04.2010, 20:24
#5
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Днепройт
Сообщений: 4,221


попробуй как-то так (без привязки к твоему коду)
Код:
[Выделить все]
      (vl-cmdf "_UCS" "_n" "_ob" MY_BLOCK_ENTITY)
      (setq MY_NEW_POINT (trans MY_OLD_POINT 0 1))
      (vl-cmdf "_UCS" "_p")
__________________
Одно меня лишь радует - я это вижу сам! (С)
kp+ вне форума  
 
Автор темы   Непрочитано 13.04.2010, 20:33
#6
swkx


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


Спасибо.
Я примерно что-то такое и пробовал.
Буду опять тренироваться...
swkx вне форума  
 
Непрочитано 14.04.2010, 08:31
#7
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,697
Отправить сообщение для Do$ с помощью Skype™


Скорее всего, нужно прибавить к полученным координатам (в переменной centr) координаты точки вставки внешней ссылки:
Код:
[Выделить все]
(mapcar '+ centr (cdr (assoc 10 edata)))
Это без учета масштаба и поворота внешней ссылки.
Файлы посмотреть не смог - сохранены они в версии как минимум AutoCAD 2007, а у меня 2006.
И еще (не удержался ), вот это вот "индийское" выражение:
Код:
[Выделить все]
(NOT (= ssallblk NIL))
можно заменить на просто:
Код:

Последний раз редактировалось Do$, 14.04.2010 в 08:41.
Do$ вне форума  
 
Автор темы   Непрочитано 14.04.2010, 10:50
#8
swkx


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


Для некоторых чертежей достаточно методики, предложенной кр+,
а для некоторых приходится задействовать коорд. точки вставки вн. ссылки. Разбираюсь дальше.

По поводу "индийского" выражения: пользуюсь Лиспом редко, но давно, примерно с 1993 г., код "с нуля" почти не пишу, пользуюсь готовыми кусками старых программ и такие куски кочуют из года в год.
swkx вне форума  
 
Непрочитано 14.04.2010, 13:27
#9
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,697
Отправить сообщение для Do$ с помощью Skype™


Держите функцию:

Код:
[Выделить все]
(defun trans-pt-from-blk (pt blk index)
    ;|
Функция перевода координат точки "внутри" блока во "внешнюю" систему координат.
Аргументы:
 pt - координаты точки "внутри" блока или внешней ссылки (список из трех чисел)
 blk - ename блока или внешней ссылки
 index - индекс СК, в которой требуется получить координаты точки (см.стандартную функцию trans).
Возвращаемое значение - координаты точки (список из трех вещественных чисел).
Пример вызова:
(trans-pt-from-blk
  (cdr
    (assoc 10
    (entget (car (nentsel "\nУкажите окружность внутри блока:"))
    ) ;_ end of entget
    ) ;_ end of assoc
  ) ;_ end of cdr
  (car (entsel "\nУкажите блок, в который входит эта окружность:"))
  1
) ;_ end of trans-pt-from-blk
--->(60.3515 53.9079 0.0)
|;
;;;Scale x,y,z:
  (setq pt (mapcar '*
     pt
     (mapcar '(lambda (code) (cdr (assoc code (entget blk))))
      (list 41 42 43)
     ) ;_ end of mapcar
    ) ;_ end of mapcar
  ) ;_ end of setq
;;;Rotation:
  (setq pt
  (polar '(0.0 0.0 0.0)
  (+ (angle '(0.0 0.0 0.0) pt)
     (cdr (assoc 50 (entget blk)))
  ) ;_ end of +
  (distance '(0.0 0.0 0.0) pt)
  ) ;_ end of polar
  ) ;_ end of setq
;;;Ins_pt:
  (setq pt (mapcar '+ pt (cdr (assoc 10 (entget blk)))))
;;;Normal:
  (setq pt (trans pt (cdr (assoc 210 (entget blk))) 0))
;;;Index:
  (setq pt (trans pt 0 index))
) ;_ end of defun

Пояснения - в комментариях кода. Код не оптимизировал для более легкого понимания.
Do$ вне форума  
 
Автор темы   Непрочитано 14.04.2010, 13:58
#10
swkx


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


Буду разбираться, хотя один момент сразу настораживает:
как я могу указать окружность внутри блока, не взорвав его?
swkx вне форума  
 
Непрочитано 14.04.2010, 14:04
#11
Кулик Алексей aka kpblc
Moderator

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


(car (nentsel)), например.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.04.2010, 14:17
#12
swkx


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


Я здорово отстал..((
swkx вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как связать сист. коорд. текущего чертежа и внешней ссылки

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как именно настроить параметры нового чертежа? Макс_Северянин AutoCAD 31 01.09.2010 10:16
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46
Как программно определить путь файла внешней ссылки kp+ Программирование 3 11.08.2005 10:39
Как отвязаться от внешней ссылки? Psip! AutoCAD 2 07.06.2004 21:23