Đến nội dung


Hình ảnh
- - - - -

Lisp chuyển text chữ số la mã sang chữ thường


  • Please log in to reply
4 replies to this topic

#1 minhngockt

minhngockt

    biết vẽ pline

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

Đã gửi 25 June 2014 - 07:07 PM

Nhờ các bác viết hộ em 1 lisp chuyển chữ số la mã sang chữ số thường, em dùng lệnh find nhưng không được hiệu quả cho lắm, chẳng hạn muốn thay đổi chữ số la mã V thành 5 nhưng lệnh find sẽ thay thế tất cả những chữ có chữ số la mã là V như VI lại thành 5I, em xin chân thành cảm ơn các bác


  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 25 June 2014 - 09:31 PM

Đấy là do bạn chưa tìm hiểu kỹ lệnh FIND. Vào Option của lệnh Find nhé.


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#3 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 25 June 2014 - 10:00 PM

  Thấy đề tài cũng hay hay nên làm thử cái lisp. Nếu số lượng ít thì có thể dùng lệnh (ít tức là thí dụ chỉ có từ 1->10 chẳng hạn), nhưng nếu nhiều thì find & replace 2,3 chục chữ khác nhau cũng hơi oải.

  Tôi chỉ mới test từ 1 tới 20 thôi, bạn có file nào ghi số la mã đủ loại thì post lên tôi sửa lisp tiếp, chứ viết sô la mã nhiều quá cũng lười.  ^_^  ^_^  ^_^

 

(defun c:slm()
  (defun demsolama(dt)
    (setq tong 0 n -1
 txt (vl-string->list (cdr (assoc 1 (entget dt))))
 as '((73 . 1) (86 . 5) (88 . 10)))
    (foreach v txt
      (setq n (1+ n)) 
      (cond ((and (> n 0) (/= (nth (1- n) txt) 73) (= v 86)) (setq tong (+ tong 5)))
   ((and (> n 0) (= (nth (1- n) txt) 73) (= v 86)) (setq tong (+ tong 3)))
   ((and (> n 0) (/= (nth (1- n) txt) 73) (= v 88)) (setq tong (+ tong 10)))
   ((and (> n 0) (= (nth (1- n) txt) 73) (= v 88)) (setq tong (+ tong 8)))
   (t (setq tong (+ tong (cdr (assoc v as))))) )      
      )
    (entmod (subst (cons 1 (itoa tong)) (assoc 1 (entget dt)) (entget dt))) 
  )
  
  (setq ssl (vl-remove-if-not  '(lambda(x)
       (vl-remove nil (mapcar '(lambda(y) (vl-string-search y (cdr (assoc 1 (entget x))))) '("I" "V" "X"))))
     (acet-ss-to-list (ssget '((0 . "TEXT"))))))
  (mapcar 'demsolama ssl)
  (princ)
)

  • 1

#4 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 26 June 2014 - 10:23 AM

  Thấy đề tài cũng hay hay nên làm thử cái lisp. Nếu số lượng ít thì có thể dùng lệnh (ít tức là thí dụ chỉ có từ 1->10 chẳng hạn), nhưng nếu nhiều thì find & replace 2,3 chục chữ khác nhau cũng hơi oải.

  Tôi chỉ mới test từ 1 tới 20 thôi, bạn có file nào ghi số la mã đủ loại thì post lên tôi sửa lisp tiếp, chứ viết sô la mã nhiều quá cũng lười.  ^_^  ^_^  ^_^

 

 

Lisp trên nếu gặp text không phải là số la mã VD "IA" sẽ dừng.

Tham khảo thuật toán chuyển chữ số la mã sang chữ số thường ở đây:

http://rosettacode.o...numerals/Decode

Vì không có thời gian nên tôi chỉ sửa tạm để test:

 

(defun ro2ar (RN)
;;;  "translate a roman number RN into arabic number.
;;;   Its argument RN is wether a symbol, wether a list.
;;;   Returns the arabic number. (ro2ar 'C) gives 100,
;;;   (ro2ar '(X X I V)) gives 24"
  (cond
   ((= RN "M") 1000)
   ((= RN "D") 500)
   ((= RN "C") 100)
   ((= RN "L") 50)
   ((= RN "X") 10)
   ((= RN "V") 5)
   ((= RN "I") 1)
   ((null (cdr RN)) (ro2ar (car RN))) ;; stop recursion
   ((< (ro2ar (car RN)) (ro2ar (car (cdr RN)))) (- (ro2ar (cdr RN)) (ro2ar (car RN)))) ;; "IV" -> 5-1=4
   (t (+ (ro2ar (car RN)) (ro2ar (cdr RN))))))

; Test
(ro2ar (mapcar 'chr (vl-string->list "MDCLXVI")))
 

  • 1

#5 minhngockt

minhngockt

    biết vẽ pline

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

Đã gửi 27 June 2014 - 08:23 AM

Em cảm ơn các bác nhiều


  • 0