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

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

Размер на размере

Ответ
Поиск в этой теме
Непрочитано 08.05.2008, 04:02 #1
Размер на размере
Vova
 
Engineer
 
New-York
Регистрация: 05.09.2003
Сообщений: 10,288

Может быть программисты заинтересуются такой проблемой-см вложение. Ошибка может появится от невнимательности. В том числе если строятся размеры Continue а базовый размер был построен не в ту сторону. На нижнем рисунке показана желательная реакция лиспа, если он обнаружит такую ошибку. Нечто аналогичное известным лиспам, которые чуят и помечают переписанные размеры

Вложения
Тип файла: dwg
DWG 2004
Razmer-overhang.dwg (44.3 Кб, 1191 просмотров)

Просмотров: 5877
 
Непрочитано 08.05.2008, 10:40
#2
Zouss


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


в принципе можно - в размерах Continue второй элемент dxf группы 11 (координата Y размерного текста) должен совпадать, а 14 группа предыдущего размера должна совпадать с 13 группой последующего... если конечно при построении таких размеров мы не пользовались опцией select команды _dimcontinue
видимо сначала придется поправить все выбранные для проверки размеры с тем, чтобы они были выполнены в едином стиле "слева-направо" например
добавлено
хотя наверное правильнее будет проверять не 11 группу а 10

Последний раз редактировалось Zouss, 08.05.2008 в 10:53. Причина: добавлено
Zouss вне форума  
 
Непрочитано 08.05.2008, 12:18
#3
Дима_

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


Добавлю уже обсуждаемое - как бы привязку размеров к самим себе отключить, ну или лисп на проверку забацать - алгоритм вроде простой, а до конкретики мысль не доходит - а то периодически чего-нибудь типа этого вылезает.
Миниатюры
Нажмите на изображение для увеличения
Название: еще ошибочка.jpg
Просмотров: 198
Размер:	8.9 Кб
ID:	6219  
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 08.05.2008, 14:27
#4
Zouss


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


для этого случая проще DIMEXO в ноль установить
или в настройках размерного стиля в первой вкладке параметр offset from origin (отступ выносной линии от точки указания)
Zouss вне форума  
 
Непрочитано 08.05.2008, 15:48
#5
Кулик Алексей aka kpblc
Moderator

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


Не советую при работе в пространстве листа и простановке размеров там же.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.05.2008, 10:03
#6
Zouss


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


почему именно в пространстве листа такой несовет?
Zouss вне форума  
 
Непрочитано 12.05.2008, 18:40
#7
Кулик Алексей aka kpblc
Moderator

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


Потому что при простановке размеров в пространстве листа можно "привязаться" не к объекту в модели, а к объекту размера. И в таком случае попытки установить dimlfac в -1 ничего не дадут - автоматического расчета коэффициента умножения не будет. По крайней мере так было до 2006 включительно (в 2008 и 2009 пока практически не работаю).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.05.2008, 19:39
#8
VVA

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


**** Редакция от 28.05.2008
В третьем приближении получилось так:
Команда Dimoverlay. Короткая команда DOL
Примеры см. #8 и #11
Код:
[Выделить все]
(defun C:DOL ()(C:Dimoverlay))
(defun dim-get-10111314 ( dim / ed t10 t11 t13 t14 ang)
(setq ed (entget dim))
(setq t10 (cdr(assoc 10 ed)))  ;_Конечная точка
(setq t13 (cdr(assoc 13 ed)))
(setq t14 (cdr(assoc 14 ed)))
(if (member '(100 . "AcDbRotatedDimension") ed)
(setq ang (cdr(assoc 50 ed)))
(setq ang (angle t13 t14))
)  
    (setq t11 (inters t10 (polar t10 ang 1e3)        ;_Начальная точка
                  t13 (polar t13 (+ ang (* 0.5 pi)) 1e3)
                  nil
                  )
      )
  (list dim t10 t11 t14 t13)
  )
(defun between ( p1 p2 p3)(equal (distance p1 p2)
	 (+ (distance p1 p3)(distance p2 p3)) 1e-3))
(defun C:Dimoverlay ( / *error*  ss i lst e1 buf bad Isrus cpt10 cpt11)
 (defun *error* (msg)(princ msg)
 (vla-endundomark(vla-get-activedocument (vlax-get-acad-object)))) ;_ end of defun
  (vl-load-com)(vla-startundomark(vla-get-activedocument (vlax-get-acad-object)))
  (if (setq Isrus (= (getvar "DWGCODEPAGE") "ANSI_1251"))
    (princ "\nВыберите размеры для проверки наложения:")
    (princ "\nSelect dimensions to check overlay:")) ;_ end of if
  (setq ss (ssget "_:L" '((0 . "*DIMENSION"))))
  (setq i '-1 lst nil bad nil)
  (repeat (sslength ss)
    (setq e1 (ssname ss (setq i (1+ i))))
    (if (member '(100 . "AcDbAlignedDimension") (entget e1))
      (setq lst (cons e1 lst)))) ;_ end of repeat
  (setq ss nil lst (mapcar 'dim-get-10111314 lst))
(foreach cdim lst (setq cpt10 (nth 1 cdim) cpt11 (nth 2 cdim))
  (setq buf (vl-remove-if-not '(lambda(x)
			     (or (and (between cpt10 cpt11 (nth 1 x))
				      (not (equal cpt10 (nth 1 x) 1e-3))
				      (not (equal cpt11 (nth 1 x) 1e-3))
				      )
				 (and (between cpt10 cpt11 (nth 2 x))
				      (not (equal cpt10 (nth 2 x) 1e-3))
				      (not (equal cpt11 (nth 2 x) 1e-3))
				      )
				 )
			     )
	      lst
	      )
	)
 (if buf
   (if(not (vl-position(car cdim) bad))(setq bad (cons (car cdim) bad)))
   )
  )
  (mapcar '(lambda(x)
	 (vlax-for item (vla-item (vla-get-blocks
                         (vla-get-activedocument (vlax-get-acad-object))
                       ) ;_ end of vla-get-Blocks
                       (cdr (assoc 2 (entget x)))
             ) ;_ end of vla-item
     (if (vlax-property-available-p item 'Textstring)
       (progn
	 (setq cpt11 (vlax-safearray->list(vlax-variant-value(vla-get-InsertionPoint item))))
	 (setq cpt10 (vla-get-Height item))
	 (setq cpt10 (* cpt10 2))
	 (entmakex (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(67 . 0)
	    (assoc 410 (entget x))(assoc 8 (entget x))
	    (cons 62 1) '(100 . "AcDbPolyline")
	    '(90 . 2) '(70 . 1)(cons 43 cpt10) '(38 . 0.0) '(39 . 0.0)
	    (cons 10 (mapcar '+ cpt11 (list (* cpt10 -0.25) 0.0)))
	    (cons 40 cpt10)(cons 41 cpt10) '(42 . 1.0)
	    (cons 10 (mapcar '+ cpt11 (list (* cpt10 0.25) 0.0)))
	    (cons 40 cpt10)(cons 41 cpt10) '(42 . 1.0)
	    (assoc 210 (entget x)))))))
;_ (vla-put-color(vlax-ename->vla-object x) 1)
	     ) bad)
  (if Isrus (princ (strcat "\nНайдено " (itoa (length bad)) " наложений размеров"))
    (princ (strcat "\n " (itoa (length bad))  " imposings dimensions are found")))
    (princ)
  )
(princ "\nType Dimovelay in command line")(princ)
Команда должна находить "неправильные" размеры и помечает их кольцом (Donut) красного цвета.
Размер считается направильным, если существует хотя бы один размер, начало или конец которого находится между началом или концом обрабатываемого размера. В командной строке пишется количество "неправильных" размеров.
Вложения
Тип файла: dwg
DWG 2004
Razmer-overhang.dwg (62.4 Кб, 958 просмотров)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 29.05.2008 в 09:48. Причина: Третья редакция
VVA вне форума  
 
Автор темы   Непрочитано 20.05.2008, 00:07
#9
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


Где-то ошибка в коде:
no function definition: nil
Vova вне форума  
 
Непрочитано 20.05.2008, 09:50
#10
VVA

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


Ну да, как всегда пару функций забыл. Изменил #8. Я для простоты пока крашу в красный цвет, потом можно будет и крестик на тексте сообразить
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 26.05.2008, 17:46
#11
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


1. Лучше назвать Dimoverlay, потому что overhang это нависать, выступать за.
2. При загрузке с проводника в ком строке появляется слово Between:
Цитата:
Command: (LOAD "C:/Documents and Settings/user1/Desktop/dimoverhang.lsp")
BETWEEN
3. Запрос на выделение можно сформулировать так: Select dimensions to check overlay. Укажи размеры для проверки наложения
4. Работает нечетко. То показывает, то нет. Или показывает не везде. На прилагаемом черт. верхняя картинка правильная, на нижней все размеры 11 неверны. Лисп выделяет только один, второй слева и то не всегда.
5. Если получится работоспособный лисп, надо сделать выделение пожирней, цвет лучше белый, он лучше виден (на черном фоне) Если использовать цвет, надо бы и размерный текст перекрасить и Draworder подключить, чтобы наверх вышло. Но кружочек вокруг лучше, или в +.
Вложения
Тип файла: dwg
DWG 2004
DIMOVERLAY.dwg (59.7 Кб, 948 просмотров)
Vova вне форума  
 
Непрочитано 27.05.2008, 18:44
#12
VVA

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


Изменил алгоритм определения "кривых" размеров. Должно работать как с примером с #8, так и с #11.
Команда переименована в DIMOVERLAY, добавлена короткая команда DO. Код в #8.
Команда делает неправильные размеры красными, рисует перечеркнутый круг на месте текста. Тестируем.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 28.05.2008, 06:29
#13
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


Первое впечатление-хорошо
Замечания:
1. Если размерному тексту задан Fill color-Background, то кружочек может утонуть за wipeout (см Properties раздел Text или размерный стиль). Кружочек не виден. Надо его увеличить в 2-4 раза, а может пусть он будет Donat. Цвет лучше взять комбинированный, например, 2,2,2
2. Хорошо бы прога сказала: обнаружено столько-то наложений.
3. Вместо DO лучше DOL, так как DO в автокаде занято для DONUT
То All> а что, таких ошибок никто не делает? Все у нас высокой квалификации?
VVA, Спасибо
Vova вне форума  
 
Непрочитано 28.05.2008, 16:03
#14
VVA

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


Изменил #8 по рекомендациям #13
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 28.05.2008, 18:02
#15
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


VVA, мы не заметили разницы между старым и новым, за исключением вызова. (вместо Do теперь DOL)
Vova вне форума  
 
Непрочитано 28.05.2008, 23:37
#16
VVA

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


Там пишется количество найденных размеров (п.2) и рисуется кольцо (п.1) красного цвета вместо круга и отрезков
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 29.05.2008, 05:39
#17
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


Мой ответ пока неполноценный. На работе (2008) получилось то, что описано в # 15. Решил перепроверить дома (2006) Получил
Цитата:
Command: dol
; error: no function definition: C:DIMOVERLAY
Прикрепляю dwg, где добавлен третий (нижний) рисунок. Там все размеры теперь имеют Background согласно моего пункта 1 из поста 13. Попробуй лисп на нем и станет ясно, почему я просил увеличить диаметр кружочка. Прикладываю также 2 лиспа, которые (по разному) показывают перебитые размеры. Один из них делает кружочек вокруг перебитого размера, такой бы и на нашем лиспе. И чтобы также удалялся, чтобы не делать этого вручную. Там-же показано сколько перебитых размеров найдено. Второй лисп работает по другому, но я пока в раздумьях, что из него взять. Может, выделение слоев, где обнаружено наложение размеров, с возвратом в прежнее состояние
Вложения
Тип файла: dwg
DWG 2004
DIMOVERLAY.dwg (54.8 Кб, 948 просмотров)
Тип файла: lsp CHKDIM.LSP (6.4 Кб, 98 просмотров)
Тип файла: lsp CHKDIMS.LSP (6.3 Кб, 86 просмотров)
Vova вне форума  
 
Непрочитано 29.05.2008, 10:52
#18
VVA

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


Что-то у меня копируется криво. Исправил код в #8, Новую версию выкладываю ввиде атачмента
А вот и пример на твоем чертеже
http://www.imageup.ru/img2/dol25477.gif
По поводу перебитых размеров надо просто определиться как делать: рисовать круги (или кольца), красить в другой цвет, показывать слои и т.п.
Вложения
Тип файла: lsp dimoverlay.LSP (5.9 Кб, 90 просмотров)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 29.05.2008 в 11:10.
VVA вне форума  
 
Автор темы   Непрочитано 30.05.2008, 06:48
#19
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


Последнее, по-видимому, пожелание. Для выделения дать кольцо, размеры которого окружают размерный текст и явно вылезают за пределы wipeout. Команду Dimrmp лучше обозвать DOR. Не опасно-ли ее применять, а вдруг совершенно случайно такой-же Donut окажется в чертеже? Ведь именно по этой причине отказываются применять переменную UserXXX.
В остальном все хорошо работает
Vova вне форума  
 
Непрочитано 30.05.2008, 10:14
#20
VVA

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


Vova, Попробую, хотя для более правильного определения габарита MTEXT'а, возможно, потребуются функции Express Tools
Цитата:
Не опасно-ли ее применять, а вдруг совершенно случайно такой-же Donut окажется в чертеже?
Не опасно, свои DONUT маркируются расширенными данными с именем DWGRU_DIMOVERLAY
Код:
[Выделить все]
(setq ss (ssget "_X" (list
		       '(0 . "LWPOLYLINE")
		       '(-3 ("DWGRU_DIMOVERLAY"))
		       (cons 410 (getvar "CTAB"))
		       )))
Маловероятно, что пользователь вручную будет их создавать. Хотя если он скопирует это кольцо для последующего использования, то DIMRMP его удалит. Возможность отсечь "родные" от скопированных я предусмотрел, но не реализовывал.
Что по поводу перебитых размеров?

*** Добавлено
Вариант с "обрамляющим" Donut
Размеры задаются в этих строках
1. Max диаметр
cpt10 - высота текста, 5 - повышающий коэффициент
Код:
[Выделить все]
(setq cpt10 (* cpt10 5)) ;_Donut max diameter
2. Толщина кольца (% от диаметра)
Код:
[Выделить все]
            (cons 43
		  (* cpt10 0.07) ;_Donut Thickness (% Donut max diameter)
		  )
Вложения
Тип файла: lsp dimoverlay.LSP (6.0 Кб, 92 просмотров)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 30.05.2008 в 10:43. Причина: Добавление
VVA вне форума  
 
Непрочитано 08.12.2010, 13:05
#21
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от Vova Посмотреть сообщение
То All> а что, таких ошибок никто не делает?
Не, вроде ни разу таких не было, бывает по-другому:
Все мы знаем, что если текст размера не влазит между выносных линий, то он располагаться снаружи возле 2 выносной линии, но не всегда это учитываем.
Вот и написал очень простенькую программку
Код:
[Выделить все]
(defun c:dim_reverse (/ i ss dim t13 t14)
  (while (setq
	   i  -1
	   ss (ssget "_:S" '((0 . "DIMENSION")))
	 )
    (repeat (sslength ss)
      (setq dim	(entget (ssname ss (setq i (1+ i))))
	    t13	(assoc 13 dim)
	    t14	(assoc 14 dim)
	    dim	(subst (cons 13 (cdr t14)) t13 dim)
	    dim	(subst (cons 14 (cdr t13)) t14 dim)
      )
      (entmod dim)
    )
  )
)
[IMG]http://s006.***********/i214/1012/3e/09cd44782ea2.gif[/IMG]
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 08.12.2010, 13:28
#22
Лиспер


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


По-моему, не возле второй, а возле левой или верхней линий.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Размер на размере



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменить размер текста во всех блоках с одинаковым имене red AutoCAD 78 28.03.2022 08:07
Как сделать текст в размере повернутым горизонтально? Red Nova AutoCAD 7 25.02.2016 06:57
Программно задать размер листа в Layout Ax3 Программирование 6 02.03.2008 11:28
Пользовательский размер листа bimari AutoCAD 2 26.10.2006 18:14
Размер файлов .dwg СВС AutoCAD 5 14.04.2005 11:15