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

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

DXF регион

Ответ
Поиск в этой теме
Непрочитано 13.01.2006, 09:13 #1
DXF регион
Krieger
 
инженер (КМ)
 
Красноярск
Регистрация: 30.10.2004
Сообщений: 3,837

Какую минимальную информацию нужно ввести для функции entmake, чтобы создать Rotated Dimension? Где хранится Dim scale overall? Что означает запись под кодом (ключом) 70 (по entget)?
Цитата:
((-1 . <Entity name: 7ef8bb80>) (0 . "DIMENSION") (330 . <Entity
name: 7ef6ecf8>) (5 . "250") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .
"Размерные") (100 . "AcDbDimension") (2 . "*D16") (10 35115.6 6151.7 0.0) (11
35096.4 6153.63 0.0) (12 0.0 0.0 0.0) (70 . 32) (1 . "") (71 . 5) (72 . 1) (41
. 1.0) (42 . 38.4631) (52 . 0.0) (53 . 0.0) (54 . 0.0) (51 . 0.0) (210 0.0 0.0
1.0) (3 . "SPDS") (100 . "AcDbAlignedDimension") (13 35077.1 6159.78 0.0) (14
35115.6 6159.78 0.0) (15 0.0 0.0 0.0) (16 0.0 0.0 0.0) (40 . 0.0) (50 . 0.0)
(100 . "AcDbRotatedDimension"))
Просмотров: 6212
 
Непрочитано 13.01.2006, 09:34
#2
Кулик Алексей aka kpblc
Moderator

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


Из справки:
70 :
Dimension type:
Values 0–6 are integer values that represent the dimension type. Values 32, 64, and 128 are bit values, which are added to the integer values (value 32 is always set in R13 and later releases)
0 = Rotated, horizontal, or vertical; 1 = Aligned
2 = Angular; 3 = Diameter; 4 = Radius
5 = Angular 3 point; 6 = Ordinate
32 = Indicates that the block reference (group code 2) is referenced by this dimension only
64 = Ordinate type. This is a bit value (bit 7) used only with integer value 6. If set, ordinate is X-type; if not set, ordinate is Y-type
128 = This is a bit value (bit 8) added to the other group 70 values if the dimension text has been positioned at a user-defined location rather than at the default location
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.01.2006, 11:08
#3
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Да справку я и сам посмотрел. Я просил разжевать. Почему в приведенной выше цитате стоит 32, а не 0?
Krieger вне форума  
 
Непрочитано 13.01.2006, 12:05
#4
Кулик Алексей aka kpblc
Moderator

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


Так там же написано, что числа с 0 по 6 - это целые числа, которые указывают на тип размера:
0 - повернутый (горизонтальный либо вертикальный)
1 - выравненный
2 - угловой
3 - диаметр
4 - радиус
5 - угловой по 3 точкам
6 - ординатный
После R13 к ним добавляется бит:
32 - все время добавляется, указывает, что блок *D16 имеет отношение только к этому размеру (я так понял)
64 - тип поворота. Используется только если тип = 6. Если установлен, то ордината - X-тип, т.е., я так понимаю, расширенный.
128 - бит добавляется, если положение текста размера отредактировано пользователем, и оно отлично от позиции текста по умолчанию.
Вроде как таким макаром...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.01.2006, 12:16
#5
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от kpblc
Так там же написано, что числа с 0 по 6 - это целые числа, которые указывают на тип размера:
0 - повернутый (горизонтальный либо вертикальный)
1 - выравненный
2 - угловой
3 - диаметр
4 - радиус
5 - угловой по 3 точкам
6 - ординатный
После R13 к ним добавляется бит:
32 - все время добавляется, указывает, что блок *D16 имеет отношение только к этому размеру (я так понял)
64 - тип поворота. Используется только если тип = 6. Если установлен, то ордината - X-тип, т.е., я так понимаю, расширенный.
128 - бит добавляется, если положение текста размера отредактировано пользователем, и оно отлично от позиции текста по умолчанию.
Вроде как таким макаром...
Все правильно

Минимум для Rotated Dimension такой

Код:
[Выделить все]
(setq spt (getpoint "\nНачало измерения >> \n")
      ept (getpoint spt "\nКонец измерения >> \n")
      txpt (getpoint ept "\nТочка размерного текста >> \n"))
(entmake (list
'(0 . "DIMENSION")
'(100 . "AcDbEntity")
'(8 . "Размерные");слой
'(100 . "AcDbDimension")
(cons 10 txpt) ;позиция размерной линии
(cons 11 txpt) ; позиция текста относительно его вставки
'(70 . 0); тип измерения: 0 - rotated
'(53 . 0.0) ;позиция текста относительно размерной
'(3 . "SPDS");стиль
'(100 . "AcDbAlignedDimension")
(cons 13 spt) ;точка начала
(cons 14 ept) ;точка конца
'(50 . 1.5708) ;угол наклона размера 0.0 - гориз., 1.5708 - вертик.
'(100 . "AcDbRotatedDimension")
'(210 0.0 0.0 1.0)))
~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 13.01.2006, 12:56
#6
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Спасибо. И все таки последний вопрос, где хранятся Dim scale overall и Dim scale linear для конкретного размера?
Krieger вне форума  
 
Непрочитано 13.01.2006, 13:06
#7
Кулик Алексей aka kpblc
Moderator

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


Честно говоря, никогда бы не стал этого делать через DXF. Попробуй преобразовать в vla-объект свой размер и устанавливай ему свойства.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.01.2006, 13:14
#8
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от kpblc
Честно говоря, никогда бы не стал этого делать через DXF. Попробуй преобразовать в vla-объект свой размер и устанавливай ему свойства.
Дельный совет, а то надо копаться в расширенных данных

~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 16.01.2006, 07:46
#9
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


С ActiveX я пока не разобрался. Что-то пока кажется черезчур замудренно. Вот и выкручиваюсь как умею. Если не сложно, не могли бы подбросить функцию по отрисовке размерностей, тока чтобы в параметрах еще и указанные выше переменные встречались.
Krieger вне форума  
 
Непрочитано 16.01.2006, 09:16
#10
Кулик Алексей aka kpblc
Moderator

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


Ну как пример создания rotateddim (обработчик ошибок так вставил, для гарантии и по привычке):
Код:
[Выделить все]
;;; Все как пример, не более того
(defun create-dimrot (/ adoc ent *error*)
  (defun *error* (msg)
    (princ msg)
    (vla-endundomark adoc)
    ) ;_ end of defun
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark adoc)
  (command "_.dimlinear")
  (while (/= (getvar "cmdactive") 0)
    (command pause)
    ) ;_ end of while
  (setq ent (vlax-ename->vla-object (entlast)))
  ;; И теперь назначение свойств
  ;; К примеру, изменить блок стрелки на ArchTick
  (vla-put-arrowheadblock ent "_ArchTick")
  ;; Изменить размер на 3.5
  (vla-put-arrowheadsize ent 3.5)
  ;; Изменить слой (без проверки на существование). Если слоя нет, выполнение
  ;; прервется с сообщением об ошибке
  (vla-put-layer ent "Размеры")
  ;; Изменить масштаб линии на 100.0
  (vla-put-linearscalefactor ent 100.0)
  ;; Изменить dimscale для этого размера на 10.0
  (vla-put-scalefactor ent 10.0)
  ;; Ну и так далее. Полный список свойств размера можно посмотреть,
  ;; используя
  ;; конструкцию
  ;; (vlax-dump-object ent)
  (vla-endundomark adoc)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.01.2006, 10:32
#11
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Отлично. Переделал под себя, все получилось.
Krieger вне форума  
 
Автор темы   Непрочитано 09.03.2006, 05:48
#12
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Поворачиваем ucs относительно оси X на 90град чертим 2D полилинию с координатами 0,0 и 0,100. По функции entget получаем следуещее:
Код:
[Выделить все]
((-1 . <Entity name: 7ef870d8>) (0 . "LWPOLYLINE") (330 . 
<Entity name: 7ef68cf8>) (5 . "10B") (100 . "AcDbEntity") (67 . 0) (410 . 
"Model") (8 . "0") (48 . 0.25) (100 . "AcDbPolyline") (90 . 2) (70 . 0) (43 . 
0.0) (38 . 0.0) (39 . 0.0) (10 0.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 
-8.15287e-012 100.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 -1.0 
2.22045e-016))
Координаты второй точки заданы таким образом:
Код:
[Выделить все]
(10 -8.15287e-012 100.0)
Как это расшифровать? -8.15287e-012 - чето не похоже на те цифры которые я задавал.
Вообще как однозначно определить положение 2D полилинии в пространстве если она не лижит в плоскости параллельной XOY мировой системы координат?
Krieger вне форума  
 
Непрочитано 09.03.2006, 08:37
#13
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


-8.15287e-012 это ноль. появилась небольшая ушибка из-за поворота СК
zamtmn вне форума  
 
Автор темы   Непрочитано 09.03.2006, 09:07
#14
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Ладно, оказывается все просто. Фишка в 210 коде. Она как-бы поварачивает ПСК и координаты указываются относительно её.
Krieger вне форума  
 
Непрочитано 09.03.2006, 09:14
#15
Кулик Алексей aka kpblc
Moderator

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


По-моему, в списке по (entet) хранятся точки в системе координат объекта, а не в мировой. Мировая система - только в vla-представлении объекта.
Могу и ошибаться, с "повернутыми" системами координат очень мало работал.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.03.2006, 09:41
#16
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Не подскажешь как в мировой координаты получить.
Помнится ты давал такую функцию:
Код:
[Выделить все]
(vlax-dump-Object (vlax-ename->vla-object (car(entsel))) t)
Однако она выдает тоже самое.
Krieger вне форума  
 
Непрочитано 09.03.2006, 10:07
#17
Кулик Алексей aka kpblc
Moderator

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


Ну тогда кроме как на ошибку вычислений AutoCAD'a ничего в голову не лезет... У меня для такого же варианта координаты нарисовались четкими, а вот нормаль полезла черт-те как (210-я группа) - третья координата тоже что-то около 2e-016, т.е. 2*10^-16.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.03.2006, 11:10
#18
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


А в чем проблема то? это не ошибка, это специфика чисел с плавающей точкой
zamtmn вне форума  
 
Автор темы   Непрочитано 09.03.2006, 11:24
#19
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Да проблем-то собсно с этим теперь нет, остался вопрос поста №16
Krieger вне форума  
 
Непрочитано 09.03.2006, 11:33
#20
Кулик Алексей aka kpblc
Moderator

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


(trans point 1 0)
По-моему, так.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > DXF регион