Princ打印提示
早上好我先说我搜索,我找不到答案。
如何在屏幕上动态打印?
我以为purhaps“grtext”可以做到,但不能精确到合适的值,似乎只有-2和-1可以做任何事情
我试图实现的是,在“Grread”模式下,每个按钮都被按到屏幕上。。
这很简单,如果我不想删除它,但是我不能以这种方式接受退格。
因此,我正在从命令行选项或动态选项中查找错误。
嗯,它有点有效,它不会删除东西,但会覆盖东西
Ive正在测试
(while
(setq hi (grread t 15 0))
(if (= (car hi) 2)
(princ (chr (cadr hi)))))
任何建议都很好。
干杯花 看来我找到了一条路。
Back space在其a“”中起作用,或表明它起作用
因此,对于每个退格,执行一个“”,然后再次退格
(while
(setq hi (grread t 15 0))
(if (= (car hi) 2)
(if (= (cadr hi)
(progn
(prompt (chr (cadr hi)))
(prompt " ")
(prompt (chr (cadr hi))))
(prompt (chr (cadr hi)))
)
))
如果有人知道更好的方法,请告诉我,
谢谢你抽出时间 你好
我是这样做的:
(if (= (cadr gr);_ backspace
(or
(and str
(/= str "")
(setq str (substr str 1 (1- (strlen str))))
(princ (chr )
(princ (chr 32))
)
(setq str nil)
)
(or
(and str (setq str (strcat str (chr (cadr gr)))))
(setq str (chr (cadr gr)))
)
)
(and str (princ (chr (cadr gr))))
整个例程只不过是grread使用的一个示例
;;; DSTAR (gile) 2009/03/09
;;; Draws a star polygon
;;; The user specify the number of brunches, the star center and a point vertex location.
(defun c:dstar (/ *error* makestar br imax ind cen loop gr star str pt)
;;;======================== LOCAL SUB ========================;;;
;; Local *error*
(defun *error* (msg)
(or (= msg "Function cancelled")
(princ (strcat "Error: " msg))
)
(and star (entdel star) (setq star nil))
(grtext)
(princ)
)
;; Creates the pline
(defun makestar (cen ang dist br ind / n zdir lst1 lst2)
(setq n (* 2 br)
zdir (trans '(0 0 1) 1 0 T)
)
(and (= (getvar "ORTHOMODE") 1) (setq ang (OrthoRound ang)))
(repeat br
(setq
lst1
(cons
(polar cen (+ ang (/ (* (setq n (- n 2)) pi) br)) dist)
lst1
)
)
)
(repeat br
(setq lst2
(cons (inters (nth n lst1)
(nth (rem (+ n br (- ind)) br) lst1)
(nth (rem (+ n (1- ind)) br) lst1)
(nth (setq n (rem (+ n (1- br)) br)) lst1)
)
lst2
)
)
)
(entmakex
(append
(list '(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
(cons 90 (* 2 br))
'(70 . 1)
(cons 38 (caddr (trans cen 1 zdir)))
(cons 210 zdir)
)
(mapcar
(function
(lambda (pt)
(cons 10 (trans pt 1 zdir))
)
)
(apply 'append
(apply 'mapcar (cons 'list (list lst1 lst2)))
)
)
)
)
)
;;;======================== MAIN ========================;;;
(or *StarPointNumber* (setq *StarPointNumber* 5))
(if (setq br (getint (strcat "\nSpecify the number of points: <"
(itoa *StarPointNumber*)
">: "
)
)
)
(setq *StarPointNumber* br)
(setq br *StarPointNumber*)
)
(if (< 4 br)
(progn
(setq imax (fix (/ (- br 0.5) 2))
ind imax
)
(initget 1)
(setq cen (getpoint "\nSpecify the star center: ")
loop T
)
(princ "\nSpecify a point vertex (or enter circle radius): ")
;; grread loop
(while (and (setq gr (grread T 12 0)) loop)
(and star (entdel star) (setq star nil))
(cond
;; Dragging
((= 5 (car gr))
(setq ang(angle cen (cadr gr))
dist (distance cen (cadr gr))
)
(if (/= 0 dist)
(setq star (makestar cen ang dist br ind))
)
(grtext -1 (strcat "Radius: " (rtos dist)))
)
;; Picked point = ends loop
((= 3 (car gr))
(makestar cen ang dist br ind)
(setq loop nil)
(grtext)
)
;; Right click = loops through available densities
((member (car gr) '(11 25))
(setq ind (+ 2 (rem (- (1+ ind) 2) (1- imax))))
)
;; Enter = reads the command line input
((equal gr '(2 13))
(cond
;; valid distance = ends loop
((and str (setq dist (distof str)) (< 0 dist))
(makestar cen ang dist br ind)
(setq loop nil)
(grtext)
)
;; valid point = ends loop
((and str (setq pt (str->pt str)))
(makestar cen (angle cen pt) (distance cen pt) br ind)
(setq loop nil)
(grtext)
)
;; invalid input
(T
(setq str nil)
(princ "\nInvalid point or distance. Specify a point vertex (or enter circle radius): ")
)
)
)
;; F8 = toggles orthomode
((equal gr '(2 15))
(setvar "ORTHOMODE" (boole 6 1 (getvar "ORTHOMODE")))
(princ (chr )
(princ (chr 32))
)
;; getting and printing command line input
(T
(if (= (cadr gr);_ backspace
(or
(and str
(/= str "")
(setq str (substr str 1 (1- (strlen str))))
(princ (chr )
(princ (chr 32))
)
(setq str nil)
)
(or
(and str (setq str (strcat str (chr (cadr gr)))))
(setq str (chr (cadr gr)))
)
)
(and str (princ (chr (cadr gr))))
)
)
)
)
(prompt "\nThe number of points have to be greater than 4.")
)
(princ)
)
;;;======================== SUB ROUTINES ========================;;;
;; OrthoRound
;; Returns the angle rounded to pi/2
;;
;; Argument: an angle (radians)
(defun OrthoRound (ang)
(* (/ pi 2) (fix (/ (+ (/ pi 4) ang) (/ pi 2))))
)
;; STR2PT
;; Convert a string into a 3d point (input with grread)
;;
;; Argument: a string (ex: "25,63")
;; Return: a 3d point (ex (25.0 63.0 0.0) or nil if invalid string
(defun str2pt (str)
(setq str (mapcar 'read (str2lst str ",")))
(if (and (vl-every 'numberp str)
(< 1 (length str) 4)
)
(trans str 0 0)
)
)
;; STR2LST
;; Transforms a string with separator into a list of strings
;;
;; Arguments
;; str = the string
;; sep = the separator pattern
(defun str2lst (str sep / pos)
(if (setq pos (vl-string-search sep str))
(cons (substr str 1 pos)
(str2lst (substr str (+ (strlen sep) pos 1)) sep)
)
(list str)
)
从驾驶室检查:
(defun c:test(/ user ent)
(setq user (getpoint_or_text 2 "\nSelect or enter name. "))
(cond
((null user) (prompt "\nUser Quit."))
((= (type user) 'STR) (prompt (strcase "\nUser entered " user)))
((listp user)
(if (setq ent (nentselp user))
(prompt "\nObject selected.")
(prompt "\nNothing selected.")
)
)
(t (prompt "\nInvalid selection."))
)
(princ)
)
;;http://www.theswamp.org/index.php?topic=11342.msg143630#msg143630
;;;=======================[ getpoint_or_text.lsp ]=======================
;;; Author: Copyright© 2005 Charles Alan Butler
;;; Version:1.0 Dec. 12, 2005
;;; Purpose: To get user entered text or picked point
;;; Sub_Routines: -None
;;; Requirements: -ctype is the cursor type
;;; 0Display the normal crosshairs.
;;; 1Do not display a cursor (no crosshairs).
;;; 2Display the object-selection "target" cursor
;;; -prmpt is the user prompt, start it with \n
;;; Returns: - picked point or
;;; the user entered text or
;;; ""for Enter Key
;;; nil for Escape Key
;;;==============================================================
(defun getpoint_or_text (ctype prmpt / char code data result flag p str)
(vl-load-com)
(vl-catch-all-apply
'(lambda ()
(setq flag t
str ""
)
(princ prmpt)
(while flag
(setq p (grread t 15 ctype)
code (car p)
data (cadr p)
)
(cond
((= code 3) ; clicked point
(setq result data
flag nil
)
)
((= code 2) ; keyboard
(setq char data)
(cond
((<= 32 char 126)
(princ (chr char))
(setq str (strcat str (chr char)))
)
((= char
;; backspace was hit .. go chop off a character
(and (> (strlen str) 0)
(princ (strcat (chr" " (chr ))
(setq str (substr str 1 (1- (strlen str))))
)
)
((= char 13)
(setq result str
flag nil
)
)
)
)
)
) ;_ while
)
)
result
)
谢谢你们,我最终用另一种方式完成了这件事,但对这些人来说非常简单。我会仔细看看你发布的这些代码,
谢谢你堆
作为参考,我就是这样做的
(cond ....
((= (car reader) 2)
(cond
((= (cadr reader)
(if (> TxtCount 0)
(progn
(setq TxtCount (1- TxtCount)
TextList (cdr TextList))
(prompt (chr )
(prompt (chr 32))
(prompt (chr )
)))
((or (= (cadr reader) 32)(= (cadr reader) 13))
(setq ShortSnap (strcase (vl-list->string (reverse TextList))) 这是因为我试图在AutoCAD命令行上放置LISP shell。。。失败了,然后变成了我玩着俗气的电子游戏。。。
(defun gr_main(op input / );
(cond
((= op 0)
(vl-load-com)
(setvar "cmdecho" 0)
(setq #p_mai "Prompt: " #m_run T #d_ist "" #d_sta T #m_csr 0)
(setq #d_lst nil #d_mps nil #p_ntf nil #p_dum nil #p_ret nil #d_pre nil #o_lnm "GR_ARCADE")
)
((= op 1)
(if #d_sta
(cond
((= (cadr input)
(if (> (strlen #d_ist) 0) (princ (strcat "\010" " " "\010")))
(setq #d_ist (substr #d_ist 1 (1- (strlen #d_ist)))))
((or (= (cadr input) 13) (= (cadr input) 32))
(repeat (+ (strlen #d_ist) (strlen #p_cur)) (princ (strcat "\010" " " "\010")))
(princ #p_cur)
(setq #d_pre input)
(setq #d_lst (append #d_lst (list #d_ist)) #d_ist ""))
((= (car input) 2)
(setq #d_ist (strcat #d_ist (chr (cadr input))) #d_pre input)
(princ (chr (cadr input))))
((and (= (car input) 3) (= #d_ist ""))
(setq #d_pre (cadr input))
(setq #d_lst (append #d_lst (list (cadr input)))))
((= (car input) 5)
(setq #d_mps (cadr input)))
)
(cond
((= (car input) 2)
(setq #d_lst (append #d_lst (list (chr (cadr input)))))
(setq #d_pre input))
((= (car input) 3)
(setq #d_lst (append #d_lst (list (cadr input))))
)
((= (car input) 5)
(setq #d_mps (cadr input)))
)
)
)
((= op 4)
(setq #d_pre nil)
)
)
(princ)
)
它有很多不必要的东西,主要是因为这是一个“黑客分离”版本的Pong,剥离到即时控制。不过,这是可行的。
只有我的两分钱。^
*克制说“我早就告诉过你了……”的冲动* 必须承认,这一点很难理解,只要你加一个,我的小脑袋就爆炸了。还没有解决,怎么做/做什么。
但毫无疑问,你了解我使用它的应用程序,如果你能推荐一种更好/更简单的方法,请告诉我。
谢谢
花 #符号没有任何意义。这只是一个变量。您看到的变量实际上是在“main”函数之外使用和修改的,这意味着它们是整个程序的全局变量。因此,由于整个程序将相当庞大(至少对我的水平而言),我希望跟踪我的所有变量。#d_表示它是一个数据变量,#p_表示提示等等。
这就像使用,比如说,“str1”和“str2”作为变量。你指出这是一个字符串,它不同于其他字符串。就是这样。
我所做的唯一不同的事情是将所有内容包装在一个整洁的界面中,并将其设置为当你点击“回车”或“空格键”时,它会获取成品,将其设置为一个变量,然后发送出去。嗯,有点像。你可以在我的代码中看到一个#d#lst。这是我的数据列表;它按输入顺序跟踪所有输入。相信我,这是有原因的。。
还有,我很抱歉昨天太累了。我似乎还没有发布我所有的代码。这里的循环实际上使用了我发布的条件。
(defun c:test( / #p_mai #d_err #d_lst #d_mps #d_pre #d_grd #m_csr #m_run);
(load "Y:\\Mercier Mark\\LISP\\#recstats.lsp" "nil")(#recstats "NOMNOM")
(gr_main 0 nil) ; Setup program space
(princ (strcat "\n" (setq #p_cur #p_mai))) ; Display prompt
(while (and #m_run ; Begin main loop
(setq #d_err (vl-catch-all-apply '(lambda ( ) (setq #d_grd (grread nil 13 #m_csr)))))
(not (vl-catch-all-error-p #d_err)))
(gr_main 1 #d_grd) ; Capture data
); End main While loop
(princ "\nGoodbye.")(princ)
)
(defun gr_main(op input / );
(cond
((= op 0)
(vl-load-com)
(setvar "cmdecho" 0)
(setq #p_mai "Command :3 " #m_run T #d_ist "" #d_sta T #m_csr 0 #d_lst nil #d_mps nil #d_pre nil)
((= op 1)
(if #d_sta
(cond
((= (cadr input)
(if (> (strlen #d_ist) 0) (princ (strcat "\010" " " "\010")))
(setq #d_ist (substr #d_ist 1 (1- (strlen #d_ist)))))
((or (= (cadr input) 13) (= (cadr input) 32))
(repeat (+ (strlen #d_ist) (strlen #p_cur)) (princ (strcat "\010" " " "\010")))
(princ #p_cur)
(setq #d_pre #d_ist)
(setq #d_lst (append #d_lst (list #d_ist)) #d_ist ""))
((= (car input) 2)
(setq #d_ist (strcat #d_ist (chr (cadr input))))
(princ (chr (cadr input))))
((and (= (car input) 3) (= #d_ist ""))
(setq #d_pre (cadr input))
(setq #d_lst (append #d_lst (list (cadr input)))))
((= (car input) 5)
(setq #d_mps (cadr input)))
)
(cond
((= (car input) 2)
(setq #d_lst (append #d_lst (list (chr (cadr input)))))
(setq #d_pre (chr (cadr input))))
((= (car input) 3)
(setq #d_lst (append #d_lst (list (cadr input))))
;(setq #d_pre (cadr input))
)
((= (car input) 5)
(setq #d_mps (cadr input)))
)
)
)
)
(princ)
)
这里面也有回路。 我想我不是唯一一个喜欢在变量前面加#的人
页:
[1]
2