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

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

DCL: как сделать многострочный редактируемый текст?

Ответ
Поиск в этой теме
Непрочитано 20.01.2011, 11:57 #1
DCL: как сделать многострочный редактируемый текст?
Ax3
 
Programming, automation, CADs, GISs. СибМИР
 
Россия, Санкт-Петербург
Регистрация: 02.02.2007
Сообщений: 315

Привет, братья по каду.
Делаю форму для редактирования атрибутов блока.
Вопрос сразу возник в связи с многострочными атрибутами.
edit_box позволяет юзеру редактировать только однострочные тексты.
Как быть?
Комбинировать edit_box-ы? (очень сложный вариант в плане того, как сделать по-человечески ВВОД многострочного текста в комбинацию однострочных).
Или есть какие-нибудь более нормальные решения? (наподобие объекта Memo в Delphi или вообще какой-нибудь нормальный многострочный DCL-объект).
Подскажите, плз.
__________________
На LISPе можно мыслить!
Просмотров: 4264
 
Непрочитано 20.01.2011, 12:09
#2
Do$

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


Исползовать edit_box с высотой 2 и более? Задать атрибут height=2,3...
Do$ вне форума  
 
Автор темы   Непрочитано 20.01.2011, 12:19
#3
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315


Пробовал. Но текст всё равно в одну строчку, увеличение высоты текст бокса ничего не даёт. Или там какой-нибудь alignment надо поставить? Но в любом случае, text_box вообще не обрабатывает такие служебные символы, как "\n" или (chr 10). Он их просто квадратиками отображает
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Непрочитано 20.01.2011, 13:12
#4
Do$

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


И действительно... Кривоват инструмент .
Цитата:
Сообщение от Ax3 Посмотреть сообщение
Комбинировать edit_box-ы? (очень сложный вариант в плане того, как сделать по-человечески ВВОД многострочного текста в комбинацию однострочных).
Может тогда попробовать комбинацию edit_box + list_box?
Миниатюры
Нажмите на изображение для увеличения
Название: edit_box1.JPG
Просмотров: 146
Размер:	17.5 Кб
ID:	52020  Нажмите на изображение для увеличения
Название: edit_box2.JPG
Просмотров: 136
Размер:	16.9 Кб
ID:	52021  
Do$ вне форума  
 
Непрочитано 20.01.2011, 14:37
#5
VVA

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


Код:
[Выделить все]
(acet-ui-txted "Строка1\r\nСтрока2\r\nСтрока3" "Заголовок" "Примечание")
Описание
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 20.01.2011, 15:16
#6
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315


>>VVA
Я так понимаю, форму, которую мы видим при вызове (acet-ui-txted), в DCL-окно "встроить" никак не получится?

Получается комбинированный вариант.
Для отображения используем предложенную Do$ комбинацию list_box-ов (ну или как-то так, можно использовать paragraph как альтернативу), а для редактирования жмём кнопку и вызываем (acet-ui-txted).
Блин, это теперь у всех проверять, установлены ли ET...

Вот свойства Edit-ов, используемых в DCL (edit_box) и в (acet-ui-txted) (сняты с помощью AutoIT v3 Window Info):

Многострочный:
>>>> Control <<<<
Class: Edit
Instance: 1
ClassnameNN: Edit1
Name:
Advanced (Class): [CLASS:Edit; INSTANCE:1]
ID: 1008
Text:
Position: 11, 42
Size: 419, 210
ControlClick Coords: 239, 70
Style: 0x500110C4
ExStyle: 0x00000214
Handle: 0x00041B1C

Однострочный:
>>>> Control <<<<
Class: Edit
Instance: 2
ClassnameNN: Edit2
Name:
Advanced (Class): [CLASS:Edit; INSTANCE:2]
ID: 121
Text:
Position: 322, 129
Size: 160, 75
ControlClick Coords: 46, 37
Style: 0x50030080
ExStyle: 0x00000000
Handle: 0x001303B2

Выглядят почти одинаково, различаются только Style, то есть edit_box явно может быть многострочным. Но как?..

{Добавлено 2011.01.20_16.45.51}
И вообще подумалось мне, что, может, проще и логичнее результаты действий пользователя в форме "предпросматривать" и "редактировать" сразу на блоке? С предпросмотром понятно, а для редактирования вызывать прямо из формы команду _.eattedit.
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 20.01.2011 в 16:45.
Ax3 вне форума  
 
Непрочитано 20.01.2011, 22:13
#7
Олег (jr.)

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


Цитата:
Сообщение от Ax3 Посмотреть сообщение
Привет, братья по каду.
Делаю форму для редактирования атрибутов блока.
Вопрос сразу возник в связи с многострочными атрибутами.
edit_box позволяет юзеру редактировать только однострочные тексты.
Как быть?
Комбинировать edit_box-ы? (очень сложный вариант в плане того, как сделать по-человечески ВВОД многострочного текста в комбинацию однострочных).
Или есть какие-нибудь более нормальные решения? (наподобие объекта Memo в Delphi или вообще какой-нибудь нормальный многострочный DCL-объект).
Подскажите, плз.
Cделай сам на основе:
Код:
[Выделить все]
;; written for Brian Ackerman () 2007
(vl-load-com)


;;===================================  local defuns  =================================;;


(defun _copy_dimstyle_from (adoc style_name / dimst_obj fn fname newdoc)
  (setq fname (vla-get-fullname adoc))

  (if (not (tblsearch "dimstyle" style_name))
    (progn
  (setvar "sdi" 0)
  (setq	fn
	 (getfiled "Select drawing to copy dimstyle from: >>>"
		   (getvar "dwgprefix")
		   "dwg"
		   16))

  (setq newdoc (vla-open (vla-get-documents (vlax-get-acad-object)) fn))

  (setq dimst_obj (vla-item (vla-get-dimstyles newdoc) style_name)
	)

	      (vl-catch-all-apply
		   (function
		     (lambda ()
		       (vla-copyobjects
			 newdoc
			 (vlax-safearray-fill
			   (vlax-make-safearray vlax-vbobject '(0 . 0))
			   (list dimst_obj)
			 )
			 (vla-get-dimstyles adoc)
		       )
			 )
		     )
		   )

    (vlax-for doc (vla-get-documents (vlax-get-acad-object))
      (if (not (eq (vla-get-fullname doc) fname))
	(vla-close doc)))

    )
    )
  
  (princ)
  )


;; make layer if this does not exist
;; by fixo
(defun _make_layer  (lname
		     col
		     ltype
		     lweight
		     plotmode
		     plotstyle
		     desc
		     /		     
		     layer_obj
		     pstyle)

  (if (not (tblsearch "LAYER" lname))
    (progn
      (entmake
	  (list '(0 . "LAYER")
	  '(100 . "AcDbSymbolTableRecord")
	  '(100 . "AcDbLayerTableRecord")
	  (cons 2 lname)
	  '(70 . 0)
	  (cons 62 col)
	  (cons 6 ltype)
	  (cons 290 plotmode)
	  (cons 370 lweight)));-3
          
      ;; Create layer description and set plot style
      (setq	layer_obj (vla-item
			    (vla-get-layers
			      (vla-get-activedocument (vlax-get-acad-object)))
			    lname)
		)
      (if (not (eq "" desc))
      (if (>= (atof (getvar "acadver")) 16.1)
	(progn
	  
	  (vla-put-description layer_obj desc)
	  )
	)
	)
      (vl-catch-all-apply
	(function (lambda ()
		    (if	(= (getvar "pstylemode") 0)
		      (vla-put-plotstylename layer_obj pstyle)
		      )))
	)
      (vlax-release-object layer_obj)    
      )
    
)
  )

(defun _make_mtext_dialog ()

(setq fname (strcat (getvar "dwgprefix") "lf.dcl")) 
(setq fn (open fname "w"))
(write-line "leadtext: dialog {width = 60;" fn)
(write-line "key = \"Title\";" fn)
(write-line "label = \"Input Leader With Multiline Text\";" fn)
(write-line "spacer;" fn)
(write-line ": row {" fn)  
(write-line ": column {width = 18; label = \"Select note type:\";" fn)
(write-line "label = \"Select note type:\";" fn)  
(write-line ": radio_button {label = \"Callout notes:\" ;key = \"rb1\" ; value = \"0\" ;}" fn)
(write-line ": radio_button {label = \"Ceiling notes:\" ;key = \"rb2\" ; value = \"0\" ;}" fn)
(write-line ": radio_button {label = \"Removals notes:\" ;key = \"rb3\" ; value = \"0\" ;}" fn)
(write-line ": radio_button {label = \"Other notes:\" ;key = \"rb4\" ; value = \"0\" ;}" fn)  
(write-line "spacer;}" fn)
(write-line "spacer;" fn)   
(write-line ": column {width = 40; fixed_width_font = true; label = \"Type text then press Enter:\";" fn)  
(write-line ": edit_box {vertical_margin=none; key = \"mtxt1\" ; height = 1.27; fixed_height = true;}" fn)
(write-line ": edit_box {vertical_margin=none; key = \"mtxt2\" ; height = 1.27; fixed_height = true;}" fn)
(write-line ": edit_box {vertical_margin=none; key = \"mtxt3\" ; height = 1.27; fixed_height = true;}" fn)
(write-line ": edit_box {vertical_margin=none; key = \"mtxt4\" ; height = 1.27; fixed_height = true;}" fn)  
(write-line "spacer;}" fn)
(write-line "spacer;}" fn)  
(write-line "ok_cancel; }" fn)
(close fn)
  )


(defun _get_button (list_buttons / button checked)
  (foreach button list_buttons
    (if (eq "1" (get_tile button))
        (setq checked button)))
  checked
  )


(defun typed_text ( / dcl_id) 
(setq dcl_id (load_dialog fname))
    
    (if (not (new_dialog "leadtext" dcl_id)) (exit))
    (setq txt nil)
  (set_tile "rb3" "1")
   (mode_tile "mtxt1" 2)
   
  (action_tile "mtxt1" "(setq txt1 $value)
    (if (/= $reason 2)
      (mode_tile \"mtxt2\" 2)
    )"
  )
  
  (action_tile "mtxt2" "(setq txt2 $value)
    (if (/= $reason 2)
      (mode_tile \"mtxt3\" 2)
    )"
  )
  
(action_tile "mtxt3" "(setq txt3 $value)
    (if (/= $reason 2)
      (mode_tile \"mtxt4\" 2)
    )"
  )

  (action_tile "mtxt4" "(setq txt4 $value)
    (if (/= $reason 2)
      (mode_tile \"accept\" 2)
    )"
  )
  (action_tile "rb1" "(setq b1 $value)")
  (action_tile "rb2" "(setq b2 $value)")
  (action_tile "rb3" "(setq b3 $value)")
  (action_tile "rb4" "(setq b4 $value)")
    (action_tile
      "accept"
      (strcat
	"(setq txt "
	"(strcat "
	"(get_tile \"mtxt1\")"
	"\"\\n\""
	"(get_tile \"mtxt2\")"
	"\"\\n\""
	"(get_tile \"mtxt3\")"
	"\"\\n\""
	"(get_tile \"mtxt4\")"
	"))"
	"(setq buttons (list (get_tile \"rb1\") (get_tile \"rb2\") (get_tile \"rb3\") (get_tile \"rb4\")))"
	"(done_dialog)")
      )

  (action_tile "cancel"
      "(done_dialog)"
      )
    (start_dialog)
  (unload_dialog dcl_id)
  
  (list txt buttons)
  )

(defun rtd (a)
(* 180.0 (/ a pi))
)

;;===================   main part   ===================;;

(defun C:LF (/ acsp adoc bt col ldobj lr mtx p1 p2 plotstyle result st)

  (or adoc
      (setq adoc
	     (vla-get-activedocument
	       (vlax-get-acad-object)
	     )
      )
  )
  (if (and
	(= (getvar "tilemode") 0)
	(= (getvar "cvport") 1)
      )
    (setq acsp (vla-get-paperspace adoc))
    (setq acsp (vla-get-modelspace adoc))
  )

(if 
	(not 
	(tblsearch "dimstyle" "L three inches"))
(progn
(setvar "textsize" 6.0)
(alert "Be patience, we'll copy dimstyle\nfrom known drawing...")
(_copy_dimstyle_from adoc "L three inches")
)
    )
  (while
  (setq	p1 (getpoint "\n\t\t>>>Leader starting point (or hit Enter to Exit) >> \n"))
  (setq	p2 (getpoint p1 "\n\t\t>>>Leader ending point >> \n"))
  
   (setvar "cmdecho" 0)
  
  (_make_mtext_dialog)
    
  (setq result (typed_text)
	st (car result)
	bt (cadr result)
	)
  (setvar "cmdecho" 1)
  (cond ((eq "1" (car bt))(progn
	 (setq lr "G-TEXT - CALLOUT")
	 (setq col 53)
	 (setq plotstyle "Light Black")))
	((eq "1" (cadr bt))(progn
	 (setq lr "A-CEILING NOTES")
	 	 (setq col 40)
	 (setq plotstyle "Medium Black")))
	((eq "1" (caddr bt))(progn
	 (setq lr "A-REMOVALS")
	 (setq col 220)
	 (setq plotstyle "Medium Black")))
	((eq "1" (cadddr bt))(progn
	 (setq lr "0")
	 (setq col 7)
	 (setq plotstyle "Medium Black")))
	(T nil)
	)
(if (not (eq "0" lr))
    (_make_layer  lr ;layer name
		     col ;color index
		     "Continuous" ;linetype
		     -3 ;lineweight "Default" = -3
		     1  ; plottable
		     plotstyle ;plot style (ignore if does not exist)
                     "" ;layer description
  )
  )
;;e.g.
;;;(_make_textstyle
;;;  "three inches" ;text style name
;;;  6.0; text height
;;;  6.0; last text height
;;;  1.0; text width
;;;  0.0; oblique angle
;;;  "archstyl.shx"; font file name
;;;  )
  
(setq ang (rtd (angle p1 p2))
)

(cond
((< 0 ang 90)(setq atch 4))
((< 90 ang 180)(setq atch 6))
((< 180 ang 270)(setq atch 6))
((< 270 ang 360)(setq atch 4)))

  

  (setq	mtx (vlax-invoke
	      acsp 'AddMText p2	0.0 st)
  )
  (vlax-put mtx 'StyleName "three inches")
  (vlax-put mtx 'Height 6.0)
  (vlax-put mtx 'Layer lr) 
  (vlax-put mtx 'Color 256)
  
  (vlax-put mtx 'AttachmentPoint atch)
  (vlax-put mtx 'InsertionPoint  p2)


  (setq ldobj (vlax-invoke
    acsp
    'Addleader
    (apply 'append (list p1 p2))
    mtx
    acLineWithArrow
  )
	)
  (vlax-put ldobj 'StyleName "L three inches")
  (vlax-put ldobj 'Layer lr)
  (vlax-put ldobj 'Color 256)
  (vlax-put ldobj 'ArrowHeadType acArrowDefault)
  (vlax-put ldobj 'ArrowHeadSize 6.0)
  (vlax-put ldobj 'Textgap 4.0)
  (vla-update ldobj)
  ;;_/*optional:
  (vl-catch-all-apply
    (function (lambda ()
		(progn
		  (vlax-release-object mtx)
		  (vlax-release-object ldobj)
		)
	      )
    )
  );/*_optional, might be removed
  )
(vl-file-delete fname)
  (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acallviewports)

  (setvar "cmdecho" 1)
  (princ)
)

;;=========================   end of code   ============================;;
Олег (jr.) вне форума  
 
Непрочитано 20.01.2011, 22:44
#8
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


OpenDCL?
gomer вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > DCL: как сделать многострочный редактируемый текст?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать зачеркнутый текст Mzw AutoCAD 14 07.02.2022 11:28
Как сделать текст с подчеркиванием? ilka_t AutoCAD 34 19.06.2018 12:26
Взорвать текст, сделать тип линии konstruktor AutoCAD 13 31.05.2009 13:38
Многострочный текст в атрибутах медвежонок AutoCAD 1 09.06.2006 12:05
Как сделать обьемный текст в AutoCAD? Russsian AutoCAD 10 12.10.2005 12:37