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

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

Как выполнить dimangular

Ответ
Поиск в этой теме
Непрочитано 16.02.2011, 18:32 #1
Как выполнить dimangular
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Друзья, есть 2 линии, нарисованные под разными углами, как программно поставить между ними размер - angular?

делаю примерно так и не получается:

(command "_line" pt1 pt2 "")
(setq l_2 (ssget "L"))
так же с другим

(command "_dimangular" s_l_1 s_l_2 ptdop1)

ptdop1 - любая точка-смещение
Просмотров: 4742
 
Непрочитано 16.02.2011, 19:58
1 | #2
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Код:
[Выделить все]
(setq ent1 (entsel "\nSelect a first entity >> ")
      ent2 (entsel "\nSelect a second entity >> ")
      p1   (cadr ent1)
      p2   (cadr ent2)
      p3   (getpoint p2 "\nPick text point >>"))
(vl-cmdf "_dimangular" ent1 ent2 p3)
Или
Код:
[Выделить все]
(setvar 'osmode 512)
(setq p1 (getpoint  "\nPick a 1st point >>")
      p2 (getpoint p1 "\nPick a 2nd point >>")
      p3   (getpoint p2 "\nPick a text point >>"))
(vl-cmdf "_dimangular"
	 (list (ssname (ssget  p1) 0) p1)
	 (list (ssname (ssget  p2) 0) p2) p3)
Олег (jr.) вне форума  
 
Непрочитано 16.02.2011, 20:04
1 | #3
Li6-D


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


Олег, как я понял s_l_1, s_l_2 - должны быть не именами выбранных примитивов или наборами, а списками, составляемыми в формате функции entsel: (имя_примитива точка_привязки).

Заметил особенность - если в момент выбора последней точки на экране не видна хотя бы одна предыдущая, произойдет ошибка:
Pick a text point >>; ошибка: неверный тип аргумента: lselsetp nil.
Из-за чего возникает ошибка и как с ней бороться?

Последний раз редактировалось Li6-D, 06.01.2012 в 00:15. Причина: особенность
Li6-D вне форума  
 
Непрочитано 16.02.2011, 22:20
1 | #4
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Li6-D Посмотреть сообщение
Олег, как я понял s_l_1, s_l_2 - должны быть не именами выбранных примитивов или наборами, а списками, составляемыми в формате функции entsel: (имя_примитива точка_привязки).

Заметил особенность - если в момент выбора последней точки на экране не видна хотя бы одна предыдущая, произойдет ошибка:
Pick a text point >>; ошибка: неверный тип аргумента: lselsetp nil.
Из-за чего возникает ошибка и как с ней бороться?
да так себя обычно ведет selection при использовании функции
ssget
возможно нужно добавить типа
Код:
[Выделить все]
(command "_zoom" pause 
"_pan" pause)
или использовать методы ActiveX
у меня точно был пример но не найду никак...
Олег (jr.) вне форума  
 
Непрочитано 16.02.2011, 23:17
1 | #5
Li6-D


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


Обнаружил, что если определить первые 2 аргумента команды "_dimangular" до ее исполнения, можно обойтись без предварительного зумирования точек привязки на экран. Иначе говоря, программный выбор объектов с помощью ssget, entsel желательно выполнить сразу же после указания точек выбора объектов. По крайней мере до того момента, когда пользователь сможет применить зумирование при указании следующих объектов, точек и т.п.
Код:
[Выделить все]
(progn
  (setvar 'osmode 512)
  (setq p (getpoint "\nPick a 1st point >>")
        pN (list (ssname (ssget p) 0) p)
        p (getpoint p "\nPick a 2nd point >>")
        pN (cons (list (ssname (ssget p) 0) p) pN)
        p  (getpoint p "\nPick a text point >>")
  )
  (vl-cmdf  "_dimangular" (car pN) (cdr pN) p)
)

Последний раз редактировалось Li6-D, 16.02.2011 в 23:27.
Li6-D вне форума  
 
Непрочитано 16.02.2011, 23:26
1 | #6
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Li6-D Посмотреть сообщение
Обнаружил, что если определить первые 2 аргумента команды "_dimangular" до ее исполнения, можно обойтись без предварительного зумирования точек привязки на экран.
Иначе говоря, программный выбор объектов с помощью ssget, entsel желательно выполнить сразу же после указания точек выбора объектов. По крайней мере до того момента, когда пользователь сможет применить зумирование.
Код:
[Выделить все]
(progn
  (setvar 'osmode 512)
  (setq p (getpoint "\nPick a 1st point >>")
        pN (list (ssname (ssget p) 0) p)
        p (getpoint p "\nPick a 2nd point >>")
        pN (cons (list (ssname (ssget p) 0) p) pN)
        p  (getpoint p "\nPick a text point >>")
  )
  (vl-cmdf  "_dimangular" (car pN) (cdr pN) p)
)
Отлично
Возьму на вооружение
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 17.02.2011, 10:55
#7
Zaghim


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


Спасибо всем, сейчас попробую!!!
В общем запутался... можно что бы без лишних действий все это выбирать... сразу после (command "_line" pt1 pt2 "") запомнить или имя или точку... короче говоря без гетпоинт и без ентсела

Пардон, разобрался... просто я вначале определял точку, а потом рисовал линию, так не работало, поменял местами и все ок!!!

Вообще с точкой работает через раз((( просто код будет в цикле, я буду рисовать много линий, может объясните как все таки выбирать объект или имя наподобие ентласта?

Последний раз редактировалось Zaghim, 17.02.2011 в 12:35.
Zaghim вне форума  
 
Непрочитано 17.02.2011, 18:56
#8
VVA

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


Цитата:
Сообщение от Zaghim Посмотреть сообщение
просто код будет в цикле, я буду рисовать много линий,
так пойдет?
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 17.02.2011, 19:22
1 | #9
Li6-D


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


Цитата:
Сообщение от Zaghim Посмотреть сообщение
Спасибо всем, сейчас попробую!!!
В общем запутался... можно что бы без лишних действий все это выбирать... сразу после (command "_line" pt1 pt2 "") запомнить или имя или точку... короче говоря без гетпоинт и без ентсела

Пардон, разобрался... просто я вначале определял точку, а потом рисовал линию, так не работало, поменял местами и все ок!!!

Вообще с точкой работает через раз((( просто код будет в цикле, я буду рисовать много линий, может объясните как все таки выбирать объект или имя наподобие ентласта?
Вот еще два варианта для простановки угла между двумя линиями:
Код:
[Выделить все]
;;Линии рисуются в процессе исполнения, затем ставится угол между ними.
(progn
  (vl-cmdf "_.line" "\\" "\\" "") (setq l1 (entget (entlast)))
  (vl-cmdf "_.line" "\\" "\\" "") (setq l2 (entget (entlast)))
  (vl-cmdf  "_.dimangular"
    (list (cdar l1) (cdr (assoc 10 l1)))
    (list (cdar l2) (cdr (assoc 10 l2)))
    (getpoint "\nPick a text point >>")
) )
;;или:
(command "_.line" "\\" "\\" "" ;при замене command на vl-cmdf работать не будет!
  (progn (setq l1 (entget (entlast))) "_.line") "\\" "\\" ""
  (progn (setq l2 (entget (entlast))) "_.dimangular")
  (list (cdar l1) (cdr (assoc 11 l1)))
  (list (cdar l2) (cdr (assoc 11 l2)))
  (getpoint "\nPick a text point >>")
)
Код:
[Выделить все]
;;Линии нарисованы заранее, их надо выбирать.
(vl-cmdf "_.dimangular"
  (entsel "\nPick a 1st line >>")
  (entsel "\nPick a 2st line >>")
  (getpoint "\nPick a text point >>")
)

Последний раз редактировалось Li6-D, 17.02.2011 в 23:57.
Li6-D вне форума  
 
Непрочитано 17.02.2011, 23:38
1 | #10
Кулик Алексей aka kpblc
Moderator

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


Сейчас пишу с машины без AutoCAD'a, но тем не менее: советую попробовать vla-add-dimangular.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.02.2011, 00:03
#11
Zaghim


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


Хм, хм...а что за зверь и как им пользоваться?
Zaghim вне форума  
 
Непрочитано 18.02.2011, 01:15
1 | #12
Кулик Алексей aka kpblc
Moderator

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


Как пример. Тестировалось только в мировой системе координат; для объектов, лежащих в одном пространстве.
Код:
[Выделить все]
 (vl-load-com)

(defun test (/ adoc ent1 ent2 int pt1 pt2)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-StartUndoMark
  (if
    (and (= (type
              (setq
                ent1 (vl-catch-all-apply
                       (function
                         (lambda ()
                           (ssname (ssget "_+.:S:E" '((0 . "LINE"))) 0)
                           ) ;_ end of lambda
                         ) ;_ end of function
                       ) ;_ end of vl-catch-all-apply
                ) ;_ end of setq
              ) ;_ end of type
            'ename
            ) ;_ end of =
         (= (type
              (setq
                ent2 (vl-catch-all-apply
                       (function
                         (lambda ()
                           (ssname (ssget "_+.:S:E" '((0 . "LINE"))) 0)
                           ) ;_ end of lambda
                         ) ;_ end of function
                       ) ;_ end of vl-catch-all-apply
                ) ;_ end of setq
              ) ;_ end of type
            'ename
            ) ;_ end of =
         (not (equal ent1 ent2))
         (setq int (vla-intersectwith
                     (vlax-ename->vla-object ent1)
                     (vlax-ename->vla-object ent2)
                     acextendboth
                     ) ;_ end of vla-IntersectWith
               ) ;_ end of setq
         ) ;_ end of and
     (progn
       (vla-adddimangular
         (vla-objectidtoobject
           adoc
           (vla-get-ownerid (vlax-ename->vla-object ent1))
           ) ;_ end of vla-ObjectIDToObject
         int
         (vlax-3d-point (setq pt1 (cdr (assoc 10 (entget ent1)))))
         (vlax-3d-point (setq pt2 (cdr (assoc 10 (entget ent2)))))
         (vlax-3d-point
           (mapcar '(lambda (a b) (* 0.5 (+ a b))) pt1 pt2)
           ) ;_ end of vlax-3d-point
         ) ;_ end of vla-AddDimAngular
       ) ;_ end of progn
     ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.02.2011, 10:01
1 | #13
VVA

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


Я в #8 давал ссылку на другую твою тему. Ее сейчас не существует. Повторю здесь.
Цитата:
Сообщение от Zaghim Посмотреть сообщение
просто код будет в цикле, я буду рисовать много линий,
Раз будет цикл, то нет необходимости указывать для dimangular отрезки, можно указывать вершины.
Код:
[Выделить все]
 
(setq pt1 (getpoint "\n1-я точка\: "))
(setq pt2 (getpoint pt1 "\n2-я точка\: "))
(command "_.Line" "_none" pt1 "_none" pt2 "")
(while (setq pt3 (getpoint pt2 "\nСледующая точка <выход>: "))
  (command "_.Line" "_none" pt2 "_none" pt3 "")
  (setq tmp (polar pt1 (angle pt1 pt3)(* 0.5 (distance pt1 pt3))))
  (command "_.dimangular"
           "" ;_ Вершина
           "_none" pt2
           "_none" pt1
           "_none" pt3
           "_none" (polar pt2 (angle pt2 tmp)(* 0.5 (distance pt2 tmp)))
           )
   (setq pt1 pt2 pt2 pt3)
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 18.02.2011, 11:11
#14
Zaghim


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


Да, да... успел ухватить код, спасибо что продублировал. Все работает, углы ставятся, да вот только они уж очень огромные...что-то с расстояниями, ну это щас разберусь! СПАСИБО!!!!! Дело не в расстояниях оказалось. Все из-за того под каким углом следующая линия прилегает к предыдущей... из-за этого угол ставится с другой стороны и получается огромным)

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

Последний раз редактировалось Zaghim, 18.02.2011 в 11:37.
Zaghim вне форума  
 
Непрочитано 18.02.2011, 11:50
1 | #15
VVA

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


Цитата:
Сообщение от Zaghim Посмотреть сообщение
если указывать вершины, то размер проставляется поверх линии,
Можно поступить 2 способами
1. В размерном стиле отключить (подавить) выносные линии. Я бы так и сделал
2. Дополнительно вызывать команду _draworder и перемещать размер на задний план.

Цитата:
Сообщение от Zaghim Посмотреть сообщение
из-за этого угол ставится с другой стороны и получается огромным)
Никаких критериев, как определить нужный угол не озвучено. Но в любом случае можно за ручку перетянуть размерную линию в нужное место
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 18.02.2011, 12:03
#16
Zaghim


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


VVA, Извиняюсь!!! Все работает и очень круто работает, просто у меня кривые руки немного)))) СПАСИБО!

Последний раз редактировалось Zaghim, 18.02.2011 в 13:05.
Zaghim вне форума  
 
Непрочитано 18.02.2011, 17:23
1 | #17
VVA

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


Я только хотел сказать, что у тебя там разные Z отметки. Но ты уже сам разобрался
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как выполнить dimangular



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вентканал из оцинкованной трубы - как выполнить выход на кровлю Iskorka Инженерные сети 1 14.02.2011 15:56
Подскажите как выполнить проём в кирпичной стене толщиной в 0,5 кирпича? SEREGA80 Каменные и армокаменные конструкции 1 27.10.2010 15:15
Как выполнить сварные швы? Kotor Металлические конструкции 2 19.08.2009 09:10
Автоматически выполнить макрос VBA передав ему строку. Sergei_Nikolaev Программирование 4 30.06.2009 13:38