Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
dien124

Lisp chỉnh sửa kết quả của NOVA

Các bài được khuyến nghị

em đang làm chương trình nova khi xuất ra cao độ thì các chử số ở phần thập phân và phần nguyên không liền nhau ví dụ số 123.45 sẽ được đọc là 123 45(có ký tự trống giửa 3&4). việc này có thể thực hiện bằng lisp, mong các bác ở diễn đàn ra tay giúp em đang rất cần. chúc các bác khỏe va Diễn đàn chúng ta ngày càng phát triễn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
em đang làm chương trình nova khi xuất ra cao độ thì các chử số ở phần thập phân và phần nguyên không liền nhau ví dụ số 123.45 sẽ được đọc là 123 45(có ký tự trống giửa 3&4). việc này có thể thực hiện bằng lisp, mong các bác ở diễn đàn ra tay giúp em đang rất cần. chúc các bác khỏe va Diễn đàn chúng ta ngày càng phát triễn

 

Bạn tham khảo đoạn code sau và sửa đổi theo nhu cầu.

(setq str "123.45"
     vt (vl-string-position (ascii ".") str)
     left (substr str 1 vt)
     right (substr str (+ vt 2)))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
em đang làm chương trình nova khi xuất ra cao độ thì các chử số ở phần thập phân và phần nguyên không liền nhau ví dụ số 123.45 sẽ được đọc là 123 45(có ký tự trống giửa 3&4). việc này có thể thực hiện bằng lisp, mong các bác ở diễn đàn ra tay giúp em đang rất cần. chúc các bác khỏe va Diễn đàn chúng ta ngày càng phát triễn

Bạn có thể vào Phần Viết LIST theo yêu cầu của Bác NGUYEN HOANH mở, cũng không lên tạo topic mới nhé.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn tham khảo đoạn code sau và sửa đổi theo nhu cầu.

(setq str "123.45"
     vt (vl-string-position (ascii ".") str)
     left (substr str 1 vt)
     right (substr str (+ vt 2)))

Cám ơn bác gabach đã hồi âm, Bác hoàn thiện Lisp này giúp em với,thanks

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cám ơn bác gabach đã hồi âm, Bác hoàn thiện Lisp này giúp em với,thanks

Tui chưa từng sử dùng Nova nên cũng không biết về nó, tuy nhiên bác vndesperados đã trả lời bạn là AutoLisp không thể can thiệp được thì đành pó tay thôi.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
em đang làm chương trình nova khi xuất ra cao độ thì các chử số ở phần thập phân và phần nguyên không liền nhau ví dụ số 123.45 sẽ được đọc là 123 45(có ký tự trống giửa 3&4). việc này có thể thực hiện bằng lisp, mong các bác ở diễn đàn ra tay giúp em đang rất cần. chúc các bác khỏe va Diễn đàn chúng ta ngày càng phát triễn
Các đối tượng đó được tạo bằng ObjectArx, và không thể dùng AUTOLISP can thiệp nó được.

Các bác chưa hiểu hết ý người hỏi rồi. Tôi xin đuợc diễn giải lại thế này. TRong nova có lệnh xuất từ các điểm cao trình (đối tượng ObjectARX) ra các text cao độ. Vấn đề là ở chỗ các text này bị tách rời nhau (cao độ phần nguyên và phần thập phân bị tách thành 2 text có cùng điểm chèn)

ý của Dien123 là muốn nối các text này lại với nhau thành 1 text cao độ. Việc này thì lisp có thể làm được. Thuật toán khá đơn giản: chọn tất cả các text, so sánh từng đôi một theo justify và điểm chèn, nếu thoả mãn điều kiện (cùng điểm chèn và có justify theo thứ tự là ...) thì tạo ra text mới ghép 2 text cao độ (theo đúng thứ tự - căn cứ vào just). Các bác thử viết code xem sao ! :s_big:

Tôi xin đưa ra cách khác đơn giản hơn nữa :s_big:

- Mở file nova đó bằng cad đời cao (tôi đang dùng CAD 2007) (Chú ý phải để chế độ Show proxy graphics thì mới hiện các điểm cao trình cảu nova được (mục open&save trong options)

- Chọn tất cả các điểm cao trình và ... Explode . ---> Xong.

- Vẫn chưa xong hẳn: để lọc ra các text cao độ (tránh lẫn với các ghi chú và thứ tự) chọn tất cả các text vừa có được --> explode lần nữa (chuyển Mtext về dtext cho dễ lọc) --> dùng lệnh filter với text value = *.* ->> Xong hẳn !

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Các bác chưa hiểu hết ý người hỏi rồi. Tôi xin đuợc diễn giải lại thế này. TRong nova có lệnh xuất từ các điểm cao trình (đối tượng ObjectARX) ra các text cao độ. Vấn đề là ở chỗ các text này bị tách rời nhau (cao độ phần nguyên và phần thập phân bị tách thành 2 text có cùng điểm chèn)

ý của Dien123 là muốn nối các text này lại với nhau thành 1 text cao độ. Việc này thì lisp có thể làm được. Thuật toán khá đơn giản: chọn tất cả các text, so sánh từng đôi một theo justify và điểm chèn, nếu thoả mãn điều kiện (cùng điểm chèn và có justify theo thứ tự là ...) thì tạo ra text mới ghép 2 text cao độ (theo đúng thứ tự - căn cứ vào just). Các bác thử viết code xem sao ! :s_big:

Tôi xin đưa ra cách khác đơn giản hơn nữa :s_big:

- Mở file nova đó bằng cad đời cao (tôi đang dùng CAD 2007) (Chú ý phải để chế độ Show proxy graphics thì mới hiện các điểm cao trình cảu nova được (mục open&save trong options)

- Chọn tất cả các điểm cao trình và ... Explode . ---> Xong.

- Vẫn chưa xong hẳn: để lọc ra các text cao độ (tránh lẫn với các ghi chú và thứ tự) chọn tất cả các text vừa có được --> explode lần nữa (chuyển Mtext về dtext cho dễ lọc) --> dùng lệnh filter với text value = *.* ->> Xong hẳn !

 

Bạn Explode rồi nó ra được cái gì? Nếu tôi không lầm thì ở ACAD 2004 nó một đối tượng chỉ chứa text là ký hiệu đối tượng, không ra các text số.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn Explode rồi nó ra được cái gì? Nếu tôi không lầm thì ở ACAD 2004 nó một đối tượng chỉ chứa text là ký hiệu đối tượng, không ra các text số.

-Tuỳ theo chương trình vẽ địa hình của bạn ấy là chương trình gì. Chương trình đời cao thì có hình như đến 3 lựa chọn xuất ra cao độ :

+Trước 1 text đến một point sau đó là 1 text nghĩa là 2.36 sẻ là 3 đối tượng. Trường hợp của bạn này như vậy.

+Block trong block này có 1 text và 1 point.

+Text hoàn thiện.

-Nếu bạn dùng chương trình đời cao này thì xuất lại theo định dạng thứ 3 là được.

-Còn không thì dùng lisp nối 2 text trước và sau piont lại.

-Hôm trước trên diển đàn có 1 bạn có nhu cầu tương tự nhưng text của bạn ấy là 1 text trước và 1 text sau (dấu phẩy nằm luôn trong text sau này) bác Hoành đã viết giúp bạn ấy và nghe kể là chạy rất ngon.

**Bạn xem nhờ bác Hoành giúp cho nếu kẹt quá thì mình cũng có 1 cái nhưng chạy không được ok cho lắm nên chờ coi có cái ngon hơn đã.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn Explode rồi nó ra được cái gì? Nếu tôi không lầm thì ở ACAD 2004 nó một đối tượng chỉ chứa text là ký hiệu đối tượng, không ra các text số.

Đây là đối tượng trước khi bị phá vỡ (objectARX)

Truoc.jpg

Còn đây là các đối tượng có được sau khi explode (bao gồm 2 line ký hiệu point, 3 mtext: thứ tự điểm, ghi chú và cao độ- trong trường hợp này ko có ghi chú nên chỉ có 2 mtext)

 

sau.jpg

Có thể dùng đoạn code sau để nối các text có được từ lệnh xuất cao độ (chú ý: phải xuất theo kiểu phần nguyên và phần thập phân cùng hàng) Tuy nhiên đoạn code này chưa được hoàn thiện lắm, do text cao độ xuất từ NOVA ra có phần nguyên và phần thập phân ko cùng điểm chèn như tôi nghĩ ban đầu mà cách nhau một khoảng (ko biết có cố định hay theo một quy luật nào đó (Trong đoạn code này tôi đã thử với một khoảng cách cố định và test vài lần thấy cho kết quả khả quan) Bác nào có nhu cầu thì phát triển thêm cho hoàn thiện. Dù sao đi nữa dùng cad thuần tuý vẫn ...đỡ nhức đầu nhất :s_big:

(defun myerror (s)
 (cond
   ((= s "quit / exit abort") (princ))
   ((/= s "Function cancelled") (princ (strcat "\nError: " s)))
 )
 (setvar "cmdecho" CMD)		; Restore saved modes
 (setvar "osmode" OSM)
 (setq *error* OLDERR)			; Restore old *error* handler
 (princ)
)

;;;=========================================================================
(defun bocchu (ss1 c)
 (setq ob (entget (ssname ss1 c)))
 (setq ts (assoc 1 ob))
 (setq a (cdr ts))
)
;;;==================================
(defun Txtnum (num)
 (if (> num 0)
   (strcat "+" (rtos num 2 0))
   (rtos num 2 0)
 )
)
;;;=================================
(defun Txtint (num)
 (rtos num 2 0)

)

(defun Txtreal (num) (rtos num 2 2))
(defun Txtreal1 (num) (rtos num 2 0))

(defun thaychu (Ob newstr)
 (setq txtstr (assoc 1 Ob))
 (setq newstr (cons 1 newstr))
 (entmod (subst newstr txtstr Ob))
)



(defun chonchu (dongnhac)
 (prompt dongnhac)
 (ssget
   '((-4 . "<OR") (0 . "text") (0 . "mtext") (-4 . "OR>"))
 )
)
(defun chon (str) (ssget '((cons (0 str)))))
(defun bamchon (st) (entget (car (entsel st))))
(defun bocdt (ss1 c) (entget (ssname ss1 c)))

;;;==============================================
;;; Noi 2 text thanh 1 text
(defun addtext (Ob1 Ob2)
 (setq txtstr1 (cdr (assoc 1 Ob1)))
 (setq txtstr2 (cdr (assoc 1 Ob2)))
 (setq newstr (cons 1 (strcat txtstr1 "." txtstr2))
ob1  (subst newstr (assoc 1 Ob1) Ob1) ;(entmake (subst newstr (assoc 1 Ob1) Ob1))
)
 ;(entupd ob1)
 (setq oldLay (assoc 8 Ob1))
 (setq newlay (cons 8 "TxtCaodo"))
 (entmake (subst newlay oldlay Ob1))
)

;;;======================================  
(defun Laych (Ob)
 (setq oldLay (assoc 8 Ob))
 (setq newlay (cons 8 "TxtCaodo"))
 (entmod (subst newlay oldlay Ob))
)

;;;========================================
(defun themchuZ	(Ob newstr)
 (setq txtstr (assoc 1 Ob))
 (setq newstr (cons 1 newstr))
 (setq oldLay (assoc 8 Ob))
 (setq newlay (cons 8 "TxtCaodo"))
 (setq ob (subst newlay oldlay Ob))
 (entmake (subst newstr txtstr Ob))
)


;;;=============================================================================

=================
(Defun PlMake (Plist)			;  Create polyline entities
 (entmake '((0 . "POLYLINE")))
 (setq	n  (length Plist)
ic 0
 )
 (while (< ic n)
   (entmake (list (cons 0 "VERTEX") (cons 10 (nth ic Plist))))
   (setq ic (1+ ic)
   )
 )
 (entmake '((0 . "SEQEND")))

)
;;;===========================================================
;;;                 Tao cac layer
(Defun Laymake ()
				; (command "regenauto" "off")
 (if (= (tblsearch "LAYER" "TxtCaodo") nil)
   (progn
     (command "layer" "n" "TxtCaodo" "")
     (princ)
     (command "layer" "c" 1 "TxtCaodo" "")
     (princ)
   )
 )
				; (command "regenauto" "on")
 (princ)
)
;;;==========================================================
;;;====================================
(defun IDZtxt (ob)
 (setq Ztxt (Rtos (cadr (cdr (cdr (assoc 10 ob)))) 2 2))


)

;;;====================================
(defun IDtxt (ob)
 (if (= (justxt ob) 0)
   (setq Ptxt (cdr (assoc 10 ob)))
   (setq Ptxt (cdr (assoc 11 ob))
   )

 )


)
;;;====================================
(defun DCtxt (ob)
 (setq Ptxt (cdr (assoc 11 ob)))

)
;;;======================================
(defun Justxt (ob)
 (setq Jtxt (cdr (assoc 72 ob)))
)
;;;=====================================
(defun Testxt2 (ob1 ob2)
 (if (and (= (cadr (IDtxt ob1)) (cadr (IDtxt ob2)))
   (<= (abs (- (abs (- (car (IDtxt ob1)) (car (IDtxt ob2)))) 0.8)) 0.001)
   (= (Justxt ob1) 2)
   (= (Justxt ob2) 0)
     )
   (setq Test T)
   (setq Test nil)
 )

)
;;;======================================
(defun C:Ntxt ()
 (laymake)
 (setq	sstxt  (chonchu "Chon cac doi tuong text cao do")
Count  (sslength sstxt)
Count1 count
i1     0
 )
 (repeat Count
   (setq ob1 (bocdt sstxt i1)
  i2  0
   )
   (repeat Count1
     (setq ob2	(bocdt sstxt i2)
     )
     (if (testxt2 ob1 ob2)
(progn
  (setq ob1 (addtext ob1 ob2))
)
     )
     (setq i2 (1+ i2))
   )
   (setq i1 (1+ i1))
 )
)

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Các đối tượng đó được tạo bằng ObjectArx, và không thể dùng AUTOLISP can thiệp nó được.

Bác vndesperados có thể nêu hướng giải quyết_(nếu không dùng AUTOLISP)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay
Đăng nhập để thực hiện theo  

×