在查看了提供的绘制三维多段线的功能以及每个顶点的高程查询后,我无法继续编写:
- (defun c:3pl(/ pt tPt oldEcho msCount oldOsn undoLst *error*)
- (defun *error*(msg)
- (command)
- (setvar "CMDECHO" oldEcho)
- (princ)
- ); end of *error*
- (if(not 3pl:elev)(setq 3pl:elev 0.0))
- (setq pt T
- oldEcho(getvar "CMDECHO")
- msCount 0
- undoLst '()
- ); end setq
- (setvar "CMDECHO" 0)
- (while(/= 'LIST(type pt))
- (initget 128)
- (setq pt(getpoint
- (strcat "\n>>> Pick point, specify X,Y or new elevation Z = <"
- (rtos 3pl:elev)
- ">: ")
- )
- ); end setq
- (cond
- ((= 'LIST(type pt))
- (setq pt(list(car pt)(cadr pt)3pl:elev)
- tPt pt); end setq
- ); end condition #1
- ((and(not(null pt))(distof pt))
- (setq 3pl:elev(atof pt))
- ); end condition #2
- ((= 'STR(type pt))
- (princ "\nInvalid option keyword! ")
- ); end condition #3
- ); end cond
- ); end while
- (if pt
- (progn
- (setq oldOsn(getvar "OSMODE"))
- (setvar "OSMODE" 0)
- (command "_.3dpoly" pt)
- (setvar "OSMODE" oldOsn)
- (while(= 1(getvar "CMDACTIVE"))
- (if(= 'LIST(type pt))
- (setq undoLst
- (append(list pt)undoLst))
- ); end if
- (initget 128)
- (if
- (setq pt(getpoint tPt
- (strcat "\n>>> Pick point, specify X,Y or new elevation Z = <"
- (rtos 3pl:elev)
- (if(= 0 msCount)"> [undo]: "
- "> [Close/Undo]: "); end if
- )
- )
- ); end setq
- (cond
- ((= 'LIST(type pt))
- (setq oldOsn(getvar "OSMODE"))
- (setvar "OSMODE" 0)
- (command
- (list(car pt)(cadr pt)3pl:elev)); end command
- (setvar "OSMODE" oldOsn)
- (setq tPt pt
- msCount(1+ msCount); end setq
- ); end setq
- ); end condition #1
- ((distof pt)
- (setq 3pl:elev(atof pt))
- ); end condition #2
- ((and(= "C"(strcase pt))(/= 0 msCount))
- (command "_c")
- ); end condition #3
- ((= "U"(strcase pt))
- (if undoLst
- (progn
- (setq undoLst(cdr undoLst)
- tPt(car undoLst)); end setq
- (command "_u")
- ); end progn
- ); end if
- ); end condition #4
- (t
- (princ "\nInvalid keyword option! ")
- ); end condition #5
- ); end cond
- (command)
- ); end if
- ); end while
- ); end progn
- ); end if
- (setvar "CMDECHO" oldEcho)
- (princ)
- ); end of c:3pl
|