Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
10 replies to this topic

#1 dien124

dien124

    biết zoom

  • Members
  • Pip
  • 17 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 15 August 2008 - 05:54 PM

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
  • 0

#2 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 16 August 2008 - 11:40 AM

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

  • 1

#3 Đặng Vũ Hiệp

Đặng Vũ Hiệp

    biết lệnh linetype

  • Members
  • PipPipPipPip
  • 241 Bài viết
Điểm đánh giá: 103 (tàm tạm)

Đã gửi 16 August 2008 - 11:45 AM

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é.
  • 0
Nước biển mênh mông không đong đầy tình mẹ
Mây trời lồng lộng không phủ kín công cha...

#4 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 16 August 2008 - 12:22 PM

Các đối tượng đó được tạo bằng ObjectArx, và không thể dùng AUTOLISP can thiệp nó được.
  • 1

#5 dien124

dien124

    biết zoom

  • Members
  • Pip
  • 17 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 16 August 2008 - 04:31 PM

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
  • 0

#6 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 18 August 2008 - 07:36 AM

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.
  • 0

#7 Snowman

Snowman

    biết lệnh mirror

  • Members
  • PipPipPip
  • 155 Bài viết
Điểm đánh giá: 90 (tàm tạm)

Đã gửi 18 August 2008 - 06:41 PM

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 !
  • 0

. - ' * ' - .. - ... "Sống trong đời sống cần có một tấm lòng..." . - ' * ' - .. -
-----------------------------------------------------------------------------------

Hình đã gửi Hình đã gửi


#8 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 19 August 2008 - 07:09 AM

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ố.
  • 0

#9 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1359 (rất tốt)

Đã gửi 19 August 2008 - 09:00 AM

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 đã.
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#10 Snowman

Snowman

    biết lệnh mirror

  • Members
  • PipPipPip
  • 155 Bài viết
Điểm đánh giá: 90 (tàm tạm)

Đã gửi 19 August 2008 - 06:46 PM

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)
Hình đã gửi
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)

Hình đã gửi
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))
)
)


  • 1

. - ' * ' - .. - ... "Sống trong đời sống cần có một tấm lòng..." . - ' * ' - .. -
-----------------------------------------------------------------------------------

Hình đã gửi Hình đã gửi


#11 dien124

dien124

    biết zoom

  • Members
  • Pip
  • 17 Bài viết
Điểm đánh giá: 3 (bình thường)

Đã gửi 26 August 2008 - 12:10 AM

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)
  • 0