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

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

Помогите продумать поворот части выноски!

Ответ
Поиск в этой теме
Непрочитано 26.06.2007, 19:58 #1
Помогите продумать поворот части выноски!
Tonic
 
Воронеж
Регистрация: 26.06.2007
Сообщений: 151

Добрый вечер!
Такое задание: создать программу для отрисовки выносной линии с цветом 132 и соем 6. Это я сделал. Теперь нужно с помощью кнопок на панели реализовать смещение (поворот) на +90, -90 и +180 градусов (как на рисунке), ещё создать кнопку, ответственную за изменение масштаба выноски (по умолчанию должно предлагаться <0.75>). Прикрепляю свои достижения на сегодняшний день и файл, где показано, что надо сделать. Буду благодарен за помощь и подсказки - я только недавно влился в ваши ряды =)
P.S. Язык нужен именно AutoLISP, не VisualLISP, т.к. программирование не для Автокада.

Цитата:
(defun c:vnsk (/ p1 p2 p3 p4 p5 p9 x1 x2 h th K tplus dtex TexP TexM ce bm osm ort col lay)

;; Сохранение значений и установка системных переменных и исходных данных
(setq ce (getvar "CMDECHO")
bm (getvar "BLIPMODE")
osm (getvar "OSMODE")
ort (getvar "ORTHOMODE")
col (getvar "CECOLOR")
lay (getvar "CLAYER")
)
(setvar "ORTHOMODE" 0)
(setvar "blipmode" 0)
(setvar "cmdecho" 0)
(setvar "OSMODE" 16383)
(setvar "CECOLOR" "132");Текущий цвет - 132
(setvar "CLAYER" "6");Текущий слой - 6
;; -----------------------------------------------------------------------

(setq p1 (getpoint "\nУкажите начальную точку выносной линии: "))
(setq p2 (getpoint p1 "\nУкажите точку полочки: "))
(command "_LINE" p1 p2 "");Построение линии выноски
(setvar "OSMODE" 0)


(setq x1 (nth 0 p1));Присвоение переменной x1 координаты точки p1
(setq x2 (nth 0 p2));Присвоение переменной x2 координаты точки p2


(setq h (getreal "\nВведите высоту шрифта <3.5>: "))

(if (<= h 0)
(setq h 3.5)
) ;end if

(setq th (* h 1.6))
(setq tplus (* h 0.285))


(setq p4 (list (nth 0 p2) (nth 1 p2) (nth 2 p2)))

(princ "Введите текст первой строки:")
(setq TexP (getstring 4 5));Ввод текста верхней строки с клавиатуры
(if (> x2 x1);Сравнение координат начала и конца линии выноски для определения её направления
(progn;Для случая, когда полочка идёт вправо от линии выноски
(setq p9 (list (+ (nth 0 p4) tplus) (+ (nth 1 p4) tplus) (nth 2 p4)))
(command "_TEXT" p9 h 0 TexP "");Размещение верхнего текста
(setq dtex (distance (nth 0 (textbox (entget (entlast)))) (nth 1 (textbox (entget (entlast))))))
(setq p5 (list (+ (nth 0 p4) dtex tplus) (nth 1 p4) (nth 2 p4)))
(command "_LINE" p4 p5 "");Отрисовка полочки

);end progn
(progn;Для случая, когда полочка идёт влево от линии выноски
(setq p9 (list (- (nth 0 p4) tplus) (+ (nth 1 p4) tplus) (nth 2 p4)))
(command "_TEXT" "в" "Р" p9 h 0 TexP "");Размещение верхнего текста
(setq dtex (distance (nth 0 (textbox (entget (entlast)))) (nth 1 (textbox (entget (entlast))))))
(setq p5 (list (- (nth 0 p4) dtex tplus) (nth 1 p4) (nth 2 p4)))
(command "_LINE" p4 p5 "");Отрисовка полочки
);end progn
);end if
(setq p4 (list (nth 0 p4) (- (nth 1 p4) th) (nth 2 p4)));Точка начала нижнего текста


(princ "Введите текст второй строки:")
(setq TexP (getstring 4 5));Ввод текста нижней строки с клавиатуры
(if (> x2 x1);Сравнение координат начала и конца линии выноски для определения её направления
(progn;Для случая, когда полочка идёт вправо от линии выноски
(setq p9 (list (+ (nth 0 p4) tplus) (+ (nth 1 p4) tplus) (nth 2 p4)))
(command "_TEXT" p9 h 0 TexP "");Размещение нижнего текста

);end progn
(progn;Для случая, когда полочка идёт влево от линии выноски
(setq p9 (list (- (nth 0 p4) tplus) (+ (nth 1 p4) tplus) (nth 2 p4)))
(command "_TEXT" "в" "Р" p9 h 0 TexP "");Размещение нижнего текста
);end progn
);end if

;; восстановление значений системных переменных
(setvar "BLIPMODE" bm)
(setvar "CMDECHO" ce)
(setvar "OSMODE" osm)
(setvar "ORTHOMODE" ort)
(setvar "CECOLOR" col)
(setvar "CLAYER" lay)
(princ)

(command "_REDRAW")

(princ);Выход
);end defun c
[ATTACH]1182873491.jpg[/ATTACH]
Просмотров: 10980
 
Непрочитано 27.06.2007, 05:31
#2
Vova

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


Не по теме, а так. Впервые увидел экранное меню в современном автокаде... Кто учил автокаду? А где разместить тулпалеты, дизайн центр, свойства? А в 2006 еще кучу немодальных окон? Или переучиваться придется?
Vova вне форума  
 
Непрочитано 27.06.2007, 07:26
#3
Krieger

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


У меня есть подобная выноска, сделана при помощи leader и динамического блока. Используя leader мы решаем проблемы со стрелкой. У динамического блока есть возможность комфортно крутить полку куда угодно. Лидер и блок объеденены в безымяную группу. Точка вставки блока совпадает с последней точкой лидера. Здесь приследуется цель последующего редактирования, уже после отрисовки, а рисуя это все отрезками будут проблемы.
Но это для AutoCAD... Вы-то в чем работаете если не в AutoCAD? На рисунке ADT, а там VisualLISP вроде есть.
Krieger вне форума  
 
Непрочитано 27.06.2007, 08:12
#4
Кулик Алексей aka kpblc
Moderator

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


Сильно подозреваю, что задача стоит для BricsCAD'a или чего-то наподобие.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.06.2007, 13:13
#5
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Цитата:
Кто учил автокаду? А где разместить тулпалеты, дизайн центр, свойства?
Это не мой файл, это - задание ("что требуется сделать").

Задача действительно для BricsCAD.
P.S. Спасибо отвечающим!
Tonic вне форума  
 
Непрочитано 27.06.2007, 13:18
#6
Кулик Алексей aka kpblc
Moderator

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


ЯТД, надо создавать анонимный блок, в который засовывать тексты и отрезки. Этот блок использовать в качестве аннотации к лидеру. Потом поменять поворот блока. Не проверял и не тестировал.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.06.2007, 16:29
#7
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Но ведь если делать с блоком, тогда и текст, входящий в блок, повернётся "вверх ногами", а должен как бы сместиться (при повороте на +180)! Что же делать, что же делать... =)
Tonic вне форума  
 
Непрочитано 27.06.2007, 18:14
#8
Кулик Алексей aka kpblc
Moderator

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


Значит делать атрибуты и работать с ними отдельно
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.06.2007, 18:34
#9
Krieger

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


Попробуй так:
Код:
[Выделить все]
(defun c:vinoska (/ pt1 pt2 pt3 pt4 pt5 osm ss TexP1 TexP2)
       (setq pt1 (getpoint "\nУкажите начальную точку выносной линии: "));end setq
  (if (setq pt2 (getpoint pt1 "\nУкажите точку полочки: "))
    (progn
      (if (not (tblobjname "block" "$polka$"))
	(progn
	      (setq osm (getvar "OSMODE")
		    pt3 (getvar "viewctr")
		    pt4 (polar pt3 (/ (* 138 pi) 180) 0.7))
	      (setvar "OSMODE" 0)
	      (command "_-attdef" "" "secondline" "\nВведите первую строку аннотации: " "%%u" "_J" "bl" pt3 3.5 0)
	      (setq ss (ssget "_L"))
	      (command "_-attdef" "" "firstline" "\nВведите вторую строку аннотации: " "" "_J" "tl" pt3 3.5 0)
	      (ssadd (entlast) ss)
	      (command "_-block" "$polka$" pt4 ss "")
	      (setvar "OSMODE" osm)
	  );end progn
	);end if

      	(princ "\nВведите текст первой строки:")
	(setq TexP1 (strcat "%%u" (getstring 4 5)))
       	(princ "\nВведите текст второй строки:")
	(setq TexP2 (getstring 4 5))
      
      (initget 0 "Hor Vert")
	  (setq Hor-Vert (getkword "\nПолка горизонтальная или вертикальная? [Hor(горизонтальная)/Vert(вертикальная)] <Hor>: "));end setq
	   (if (not Hor-Vert) (setq Hor-Vert "Hor"));end if
      (if (eq Hor-Vert "Vert")
		(progn
		(command "_leader" pt1 pt2 "" "" "_block" "$polka$" pt2 1 1 90 TexP1 TexP2)
		(setq pt5 (getpoint "\nУкажите направление выносной линии (верт): "))
		(if (< (cadr pt5) (cadr pt2))
		  (command "_mirror" "_Last" "" pt2 (polar pt2 0 (distance pt1 pt2)) "_yes")
		  )
		);end progn

		(progn
		(command "_leader" pt1 pt2 "" "" "_block" "$polka$" pt2 1 1 0 TexP1 TexP2)
		(setq pt5 (getpoint "\nУкажите направление выносной линии (гор): "))
		(if (< (car pt5) (car pt2))
		  (command "_mirror" "_Last" "" pt2 (polar pt2 (* pi 0.5) (distance pt1 pt2)) "_yes")
		  )
		);end progn
	);end if
      );end progn
    );end if
  )
Код сильно не тестил, как говорит крыс : "на коленке"... В AutoCAD вроде работает про Brics не скажу, неустановлен.
Со слоями и цветом пока сам разбирайся (кстати, в вышеуказанном коде (первый пост) нет проверки на наличие слоя "6").
Krieger вне форума  
 
Автор темы   Непрочитано 27.06.2007, 23:01
#10
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Вот это да! Спасибо большое за ответы, код и готовность помочь! Я ещё многого не знаю (те же атрибуты, проверку на наличие слоя и т.д.), только начинаю разбираться, поэтому благодарен вам за помощь, советы, подсказки.
Код сейчас буду пробовать, разбираться.
Tonic вне форума  
 
Автор темы   Непрочитано 27.06.2007, 23:30
#11
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Программа у меня выдала ошибку в Автокаде. Но, судя по тексту, это не совсем то. Надо вот что: пользователь нажимает кнопку на панели, после чего указывает на выноску, нажимает Enter, и она поворачивается на угол, указанный на этой кнопке (один из трёх). Плюс к тому кнопка с масштабированием (0.75) - как указано на рисунке.
Проблема такая: если объединять это всё в блок, а потом поворачивать, текст тоже перевернётся, а в случае со 180 градусами это плохо. Ситуация осложняется ещё тем, что я пока ограничен в фантазиях и способах их реализации из-за недостатка опыта =)
Tonic вне форума  
 
Непрочитано 28.06.2007, 06:27
#12
Krieger

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


Говори какую ошибку выдал AutoCAD. Кстати, у меня твоя прога не работает.
Насчет твоих кнопок... На самом деле код для этого очень даже пододит, т.к. в нем используется блок с которым программно обращаться легче (ЯТД). По сути для этого даже дополнительных кнопок не надо, зажимаем грипс блока, два раза жмем пробел и крутим его как угодно. Что касается углов 180 и -90, то тоже решается простым изменением выравнивания атрибутов с левого на правый, у меня в проге для этого работает обычное зеркало (mirror), тогда атрибуты зеркалятся достаточно корректно, но, к сажалению, с переносом базовой точки. Масштабирование? Для блока - это ни есть проблема.
А экранным меню я никогда не пользовался. Как оно работает?
Krieger вне форума  
 
Автор темы   Непрочитано 28.06.2007, 14:48
#13
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Ошибка в том, что сначала построилась выноска, потом исчезла, потом предложила выбрать кучу всего (<>), и в итоге я даже не понял, что там надо выбрать из списка в 10 значений. Но у пользователя не надо спрашивать, что и куда вращать.
Странно, что и моя прога не заработала - у меня в AutoCAD 2005 работает. Чертит только выноски.
Экранное меню и я не пробовал - этот рисунок делал не я.
Напишите, пожалуйста, подробней, об атрибутах (для чего, как с ними работать) и о комманде масштабирования! [/quote]
Tonic вне форума  
 
Непрочитано 28.06.2007, 16:52
#14
Krieger

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


Какая версия (русская/английская)?
Покажи лог, я не телепат. Должно быть так:
Код:
[Выделить все]
Command: VINOSKA

Укажите начальную точку выносной линии:
Укажите точку полочки:
Введите текст первой строки:bla-bla

Введите текст второй строки:tu_bla

Полка горизонтальная или вертикальная? [Hor(горизонтальная)/Vert(вертикальная)] 
<Hor>: h
_leader
Specify leader start point:
Specify next point:
Specify next point or [Annotation/Format/Undo] <Annotation>:
Enter first line of annotation text or <options>: Enter an annotation option 
[Tolerance/Copy/Block/None/Mtext] <Mtext>: _block Enter block name or [?] 
<$polka$>: $polka$
Units: Millimeters   Conversion:    1.0000
Specify insertion point or [Basepoint/Scale/X/Y/Z/Rotate]:
Enter X scale factor, specify opposite corner, or [Corner/XYZ] <1>: 1 Enter Y 
scale factor <use X scale factor>: 1
Specify rotation angle <0>: 0
Enter attribute values

Введите первую строку аннотации:  <>: %%ubla-bla
Введите вторую строку аннотации: : tu_bla
Command:
Укажите направление выносной линии (гор): nil
И потом есть средства отладки кода в редакторе VisualLISP, если занимаешся программированием должен найти проблему.
Цитата:
Напишите, пожалуйста, подробней, об атрибутах (для чего, как с ними работать)
Создается командой "_attdef", редактируется командами "_eattedit", "_attedit", "_-attedit", "_ddedit". Больше - смотри справку и книжки, уж больно не хочется книжку переписывать. Давай более конкретные вопросы.
Цитата:
о комманде масштабирования
Ну это "_scale"
Только у блока масштабом является его свойство, которое и редатируется по необходимости.
Krieger вне форума  
 
Автор темы   Непрочитано 29.06.2007, 00:02
#15
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Так-с... спасибо, буду думать.

Пока мучаюсь с ещё одной проблемой: рисование гребенчатой выноски средствами автолиспа. Это когда нужно указать начало выноски, начало полочки, а затем, пока не надоест, тыкать точки, указывая начало следующих выносок. Потом это должно соединиться в гребёнку, причём линии-выноски из всех указанных точек должны быть под таким же углом к горизонтальной полочке, под каким к ней находится первая выноска. Вот как! Основная проблема - как определить координаты точки полочки, в которой под нужным углом должна заканчиваться каждая последующая линия-выноска. Сижу 3-й час... Может, есть простое решение?
[ATTACH]1183060939.jpg[/ATTACH]

Есть функция, которая могла бы помочь - vla-intersectWith, но, к сожалению, я ограничен рамками autolisp'а.
Tonic вне форума  
 
Непрочитано 29.06.2007, 09:18
#16
Krieger

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


Чего думать? Ты на вопросы ответь.
Если кад русский поставь подчеркивание в коде перед bl и tl, может с этим проблемы:
Код:
[Выделить все]
         (command "_-attdef" "" "secondline" "\nВведите первую строку аннотации: " "%%u" "_J" "_bl" pt3 3.5 0) 
         (command "_-attdef" "" "firstline" "\nВведите вторую строку аннотации: " "" "_J" "_tl" pt3 3.5 0)
Цитата:
Может, есть простое решение?
Нету. Во всяком случае глянь "KitoX Tools", может там уже все решено http://www.kitox.com/cad_ru.php

Цитата:
Так-с... спасибо, буду думать.
Ну думай.
Я так смотрю диалога у нас с тобой не получется.
Krieger вне форума  
 
Непрочитано 29.06.2007, 10:08
#17
Кулик Алексей aka kpblc
Moderator

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


> Krieger : Тут дело такое... В BricsCAD'e (под который и пишется прога) как такового отладчика AutoLISP нет. Можно, конечно, попробовать сторонние приложения использовать, но это не всегда катит
fas и vlx это чудо не поддерживает (по крайней мере 7-ка).
> Tonic : еще раз проверь команды и их опции! Возможно, собака порылась именно тут.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.06.2007, 10:19
#18
Krieger

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


В BricsCAD'e есть функция entmake?
Krieger вне форума  
 
Непрочитано 29.06.2007, 10:23
#19
Кулик Алексей aka kpblc
Moderator

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


и entmake, и entmakex.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.06.2007, 14:41
#20
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Krieger, у меня стоит русский Автокад (там я, в основном, тестирую свои lsp), изменил то, что Вы сказали - проблема была в этом. Работает, но это не совсем то, что требуется. Программа, строящая выноски, у меня есть (я приводил примерный текст), а надо, чтобы пользователь, нажавший на кнопку на панели "+180" и указавший на уже построенную ранее выноску, получил её переворот на этот угол, причём текст не должен перевернуться.
Цитата:
В BricsCAD'e есть функция entmake?
Так BricsCAD работает с автолиспом, почему же нет? Другое дело, что возможности visual lisp нельзя реализовать...
Цитата:
Нету.
А вот СПДС прекрасно строит эти гребенчатые выноски. Нельзя ли как-то извлечь код этой программы из СПДС?

Я думаю, может, сделать бесконечные линии, потом определить их точки пересечения, построить обычные линии до точек пересечения, а потом удалить бесконечные линии. Начал так делать, и возникла проблема:
1. Черчю первую линию выноски;
2. Определяю угол между ней и осью Х (angle p1 p2)
3. Строю бесконечную _xline линию по горизонтали (будущая полочка)
4. Пользователь указывает следующую точку начала след. выноски
5. ДОЛЖНА строиться бесконечная линия от новой точки (в цикле) под тем же (определённым ранее) углом, а строится чуть ли не горизонтальная. В чём тут может быть проблема?
6. В дальнейшем собираюсь вычислить точки пересечения, построить _line до них, а все _xline удалить, затем дорисовать горизонтальную линию (от начала полочки).
Может, есть хотя бы алгоритмы попроще?
Tonic вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите продумать поворот части выноски!

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

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