flowerrobot 发表于 2022-7-6 12:50:55

Princ打印提示

早上好
我先说我搜索,我找不到答案。
 
如何在屏幕上动态打印?
 
我以为purhaps“grtext”可以做到,但不能精确到合适的值,似乎只有-2和-1可以做任何事情
 
我试图实现的是,在“Grread”模式下,每个按钮都被按到屏幕上。。
这很简单,如果我不想删除它,但是我不能以这种方式接受退格。
因此,我正在从命令行选项或动态选项中查找错误。
 
嗯,它有点有效,它不会删除东西,但会覆盖东西
 
Ive正在测试
(while
(setq hi (grread t 15 0))
(if (= (car hi) 2)
   (princ (chr (cadr hi)))))
 
 
任何建议都很好。
 
干杯花

flowerrobot 发表于 2022-7-6 13:00:34

看来我找到了一条路。
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)))
   )
      
   ))
 
如果有人知道更好的方法,请告诉我,
 
谢谢你抽出时间

gile 发表于 2022-7-6 13:08:26

你好
 
我是这样做的:
(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)
)

Lee Mac 发表于 2022-7-6 13:12:07

从驾驶室检查:
 

(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
)

flowerrobot 发表于 2022-7-6 13:15:20

谢谢你们,我最终用另一种方式完成了这件事,但对这些人来说非常简单。我会仔细看看你发布的这些代码,
 
谢谢你堆
 
作为参考,我就是这样做的
 
 
 

(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)))

Freerefill 发表于 2022-7-6 13:24:16

这是因为我试图在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,剥离到即时控制。不过,这是可行的。
 
只有我的两分钱。^

Lee Mac 发表于 2022-7-6 13:29:42

 
*克制说“我早就告诉过你了……”的冲动*

flowerrobot 发表于 2022-7-6 13:35:49

必须承认,这一点很难理解,只要你加一个,我的小脑袋就爆炸了。还没有解决,怎么做/做什么。
 
但毫无疑问,你了解我使用它的应用程序,如果你能推荐一种更好/更简单的方法,请告诉我。
 
谢谢
 

Freerefill 发表于 2022-7-6 13:44:28

#符号没有任何意义。这只是一个变量。您看到的变量实际上是在“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)
)

 
这里面也有回路。

alanjt 发表于 2022-7-6 13:49:39

我想我不是唯一一个喜欢在变量前面加#的人
页: [1] 2
查看完整版本: Princ打印提示