Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

LSP+DCL đây! Button "L" và "M" không thể hẹp hơn?

http://www.cadviet.com/upfiles/3/67029_ha.zip

67029_untitled_5.png

 

Bác xem thử có đẹp hơn không?

4652_dcl_1.jpg

 

 
//-----
HA : dialog { label = "T\U+00EDnh c\U+00E1c b\U+1EA3ng t\U+00EDnh";
  : boxed_column { label = "Ch\U+1ECDn b\U+1EA3ng t\U+00EDnh";
  children_fixed_width=true;
    : row {
      : boxed_row { label = "L\U+1EF1c [b3] ";
        : toggle { key = "bang3"; label = "B3"; }
        : row {
          : text { label = "Th\U+00F4ng s\U+1ED1 l\U+1EF1c "; }
          : button { label = "L"; key = "luccd"; }
          : button { label = "M"; key = "luccdx"; }
        }
      }
}  
    : row {
      : boxed_row { label = "C\U+00E1c b\U+1EA3ng c\U+00F2n l\U+1EA1i [b6->B12]";
   : column {
          : toggle { key = "bang6"; label = "B6"; }
          : toggle { key = "bang10"; label = "B10";}
}
   : column {
          : toggle { key = "bang7"; label = "B7"; }
          : toggle { key = "bang11"; label = "B11"; }
}
   : column {
          : toggle { key = "bang8"; label = "B8"; }
          : toggle { key = "bang12"; label = "B12"; }
}
   : column {
          : toggle { key = "bang9"; label = "B9"; }
}
      }
    }
  }
  Ghi_Exit_Help;
  errtile;
}
//----- T\U+1EA1o n\U+00FAt b\U+1EA5m "Exit_Help".
HA_button : button { width = 8; alignment = centered; }
Ghi_button : HA_button { label = "Ghi file"; key = "ghi"; is_cancel = true; }
Exit_button : HA_button { label = "Tho\U+00E1t"; key = "cancel"; is_cancel = true; }
Help_button : HA_button { label = "Gi\U+00FAp ð\U+1EE1"; key = "xemhd"; is_help = true; }
Ghi_Exit_Help : column { : row { alignment = centered; Ghi_button; Exit_button; Help_button; } }
//--------------------------------------------------------------------------------------------------------------------------------------

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ái này Win7 ?

Không nhúc nhích. "Vũ Như Cẫn". Phải chăng là do Win8 ? Hình như cái của Thaistreez là Win8, nhưng vẫn gọn?

Bạn nào dùng Win8 test giùm với!

67029_untitled1.png

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

Topic này đông quá, KK góp vui tí bằng một yêu cầu đã cũ của ThuyLinh, đó là yêu cầu chuyển số nguyên trong chuỗi sang số thực. 

Hôm trước KK viết Lisp chuyển Text từ CAD sang Excel có được bác Hà tư vấn cho hàm distof dùng thấy hay nên đã viết lại Lisp theo yêu cầu của ThuyLinh theo 1 hướng khác đơn giản và ngắn gọn hơn nhiều. Lisp cũng đã xử lý được tất cả các trường hợp từ đơn giản đến phức tạp mà không cần phải chia ra trường hợp trong chuỗi có e (E) hay không có e (E). Một số chuỗi như "1...................2" thì Lisp cũng làm tốt.

Mời các bác trên diễn đàn bắt lỗi của Lisp này. Ai tìm ra lỗi sẽ có Like ngay. 

(defun C:Test( / i j a b c)
  (setq a(getstring T "\n Nhap chuoi: " ))
  (setq i 1 a1 "")
  (while (<= i (strlen a))
    (setq j(- (strlen a) i -1))
    (while (> j 0)
      (setq b(substr a i j))
      (if (and (= (vl-string-search "+" b) nil) (= (vl-string-search "-" b) nil) (= (vl-string-search " " b) nil))
	(if (setq c(distof b))
	  (setq a1(strcat a1 (substr a 1 (- i 1)) (rtos c 2 1))
		a(substr a (+ j i))
		i 1 j 0)))
      (setq j(- j 1)))
    (setq i(1+ i)))
  (setq a1(strcat a1 a))
  (princ a1)
  (princ)
  )
  • 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

Biến Dimzin ban ạ. phải xét dimzin = 0

@KK: Cảm ơn bạn. Trường hợp này không ra kết quả như mình mong muốn sqrt(4000000000000000)

Trường hợp trên hơi đặc biệt, bỏ đi 1 số 0 nó vẫn chạy đúng, không hiểu vì sao nữa. mình ăn may test đúng vào trường hợp đặc biệt.

Bạn cũng nên để đối số precision của hàm rtos lên 9 hoặc cao hơn thay vì để 1 như code trên, tránh việc số thực bị làm tròn: 1.23 -> 1.2 làm mất tính đúng đắn của phép tính. Tham khảo trả lời của bạn Tue_NV ở trang trước nhé.

 

@ĐVH: Mình thử code DCL của bạn Tue_VN sửa, thấy các nút thu gọn rất tốt. Cad2010, Win XP

  • 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

Chẳng lẽ không kiếm được like nào của KK thì buồn lắm.

test

2/3 >> 0.7

@TL:

1). Nhìn cái của Thaistreez mường tượng là win8 nhưng nhỏ gọn nên mới hỏi. Nếu win8 nó phình ra thì sẽ vỡ mộng rất nhiều dialog cũ của mọi người.

2). Về hàm canh lề mà TL hỏi có 2 cách (không biết cách của Thaistreetz thế nào):

- Dùng fixed_width_font = true; rồi thay ký tự trống vào cho đủ tùy theo phía.

- Dùng Pixel của từng ký tự rồi cũng thay bằng ký tự trống (space).

  • 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

Mình cũng đoán Thaistreetz viết hàm đó dựa vào việc bổ sung các ký tự space cho đủ. 

Nhưng làm như thế nào? viết ra sao để có 1 hàm tổng quát? đối số cần những gì? để ra được 1 một list_box gọn gàng và chính xác, có đủ canh trái, phải, giữa như thế chắc không phải đơn giản. Bạn cũng đã có ý định làm phương án này cho chương trình trên của bạn nhưng rồi cũng nghĩ là không làm được đành bỏ cuộc đấy thui. Mình thích ý tưởng độc này của Thaistreetz, nhưng mới nghĩ đến 1 hàm như thế đã thấy ngại rồi.

 

PS: Ngoài ra thì mình quan tâm đến 2 hộp thoai trên của Thaistreetz hơn, có khá nhiều điều mình thấy lạ! Nó khác hẳn những gì mình có thể viết. Thanh menu của list_box ở đâu ra? hay hình silde chẳng 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

Chẳng lẽ không kiếm được like nào của KK thì buồn lắm.

test

2/3 >> 0.7

.....

 

Bác KK phải thay cái này mới được

Thay : 

(if (and (= (vl-string-search "+" b ) nil) (= (vl-string-search "-" b ) nil) (= (vl-string-search " " b ) nil))

Bằng dòng :

(if (and (= (vl-string-search "+" b ) nil) (= (vl-string-search "-" b ) nil) (= (vl-string-search "/" b ) nil) (= (vl-string-search " " b ) nil))

 

Kiếm được chổ lỗi rồi bác KK   :)

  • 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

@ Bác Hà: 2/3 = 0.7 nên của KK ra 0.7 là đúng?

cal:

2/3 >> 0.7

test

2/3 >> 0.7

@TL: Trường hợp của TL là do lỗi của thằng rtos thôi

(rtos 4e14) -> "400000000000000.0"

(rtos 4e15) -> "4000000000000000"

(rtos 4e16) -> "4.0E+16"

(rtos 4e17) -> "4.0E+17"

....

Không hiểu sao 4e15 lại bị vậy.

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ác Hà: 2/3 = 0.7 nên của KK ra 0.7 là đúng?

cal:

2/3 >> 0.7

test

2/3 >> 0.7

@TL: Trường hợp của TL là do lỗi của thằng rtos thôi

(rtos 4e14) -> "400000000000000.0"

(rtos 4e15) -> "4000000000000000"

(rtos 4e16) -> "4.0E+16"

(rtos 4e17) -> "4.0E+17"

....

Không hiểu sao 4e15 lại bị vậy.

 

Cái Ni răng bác : 

(Cách khắc phục Tue_NV đã trả lời bác ở bài viết trước). 

 
Command: TEST
 
 Nhap chuoi: 20/300
0.1
 
Command:
Command: cal
>> Expression: 20/300
0.0666666667
  • 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

Mình cũng đoán Thaistreetz viết hàm đó dựa vào việc bổ sung các ký tự space cho đủ. 

Nhưng làm như thế nào? viết ra sao để có 1 hàm tổng quát? đối số cần những gì? để ra được 1 một list_box gọn gàng và chính xác, có đủ canh trái, phải, giữa như thế chắc không phải đơn giản. Bạn cũng đã có ý định làm phương án này cho chương trình trên của bạn nhưng rồi cũng nghĩ là không làm được đành bỏ cuộc đấy thui. Mình thích ý tưởng độc này của Thaistreetz, nhưng mới nghĩ đến 1 hàm như thế đã thấy ngại rồi.

 

PS: Ngoài ra thì mình quan tâm đến 2 hộp thoai trên của Thaistreetz hơn, có khá nhiều điều mình thấy lạ! Nó khác hẳn những gì mình có thể viết. Thanh menu của list_box ở đâu ra? hay hình silde chẳng hạn.

1). Thanh menu của list_box: image?

2). Mình nghĩ bạn dư sức qua cầu với 2 phương án mình đề xuất. Phương án 2 thì rắc rối nhưng PA1 thì đơn giản thôi mà (vì khi đó các ký tự đều rộng như nhau, tuy nó có 1 nhược điểm). Ai ngờ bạn ngại.

Ít bữa rảnh mình viết tặng bạn cả 2 cái.

Lúc đầu mình nghĩ không làm được, nhưng khi nhìn hình mình ngộ ra làm được, và đã tìm ra hướng làm. Chuyện này hết sức bình thường.

  • 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

@ Bác Hà: 2/3 = 0.7 nên của KK ra 0.7 là đúng?

Đúng để lãnh đủ à?

 

Command:

TEST

 Nhap chuoi: 3*2/3

3.0*0.7

 

Command:

Command: cal

>> Expression: 3*2/3

2

Command:
TEST
 Nhap chuoi: 3*2/3
3.0*0.7
 
Command:
Command: cal
>> Expression: 3*2/3
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

OK Thanks bác Tue_NV lần nữa. Code mới sửa đây: 

(defun C:Test( / i j a b c)
  (setq a(getstring T "\n Nhap chuoi: " ))
  (setq i 1 a1 "")
  (while (<= i (strlen a))
    (setq j(- (strlen a) i -1))
    (while (> j 0)
      (setq b(substr a i j))
      (if (and (= (vl-string-search "+" b) nil) (= (vl-string-search "-" b) nil) (= (vl-string-search "/" b) nil) (= (vl-string-search " " b) nil))
	(if (setq c(distof b))
	  (setq a1(strcat a1 (substr a 1 (- i 1)) (rtos c 2 1))
		a(substr a (+ j i))
		i 1 j 0)))
      (setq j(- j 1)))
    (setq i(1+ i)))
  (setq a1(strcat a1 a))
  (princ a1)
  (princ)
  )

PS: Thanks bác Tue nhưng bấm nhầm vào bác Hà rồi. Mai sẽ Like bù bác Tue phát nữa nhé. Hôm nay hết quyền like rồ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

OK bác Hà. Chấp nhận lỗi, đã sửa lai code mới rồi bác. Nếu được thì bác Like bác Tue hộ với. Mới like cho bác ấy 1 cái thôi còn Like bác 3 cái rồ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

 

Cái Ni răng bác : 

(Cách khắc phục Tue_NV đã trả lời bác ở bài viết trước). 

 
Command: TEST
 
 Nhap chuoi: 20/300
0.1
 
Command:
Command: cal
>> Expression: 20/300
0.0666666667

Ví dụ này chính là ví dụ 2/3 thôi. Đã like bác Tue_NV giùm KK rồ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

Sorry các PRO! Chen ngang nội dung của các bác đế hỏi thuật toán này với.

Mình muốn viết 1 vòng lặp mà khi ấn phím ENTER thì thoát vòng lặp đó, nhờ bác nào viết hộ cá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

1). Thanh menu của list_box: image?

2). Mình nghĩ bạn dư sức qua cầu với 2 phương án mình đề xuất. Phương án 2 thì rắc rối nhưng PA1 thì đơn giản thôi mà (vì khi đó các ký tự đều rộng như nhau, tuy nó có 1 nhược điểm). Ai ngờ bạn ngại.

Ít bữa rảnh mình viết tặng bạn cả 2 cái.

Lúc đầu mình nghĩ không làm được, nhưng khi nhìn hình mình ngộ ra làm được, và đã tìm ra hướng làm. Chuyện này hết sức bình thường.

1) Bạn có thể viết image kèm với text? Mình nghĩ là không thể

2) Mình chờ hàng của bạ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

1). Image là 1 hình thì kèm gì trong đó không được, cứ gì text?

2). Bạn test lisp viết theo PA1 xem sao. Như tôi đã nói, nó có 1 nhược điểm. Còn PA2 thì đợi tí. Mà nếu bạn OK PA1 thì khỏi viết PA2.

67029_untitled3.png

LSP+DCL:

 http://www.cadviet.com/upfiles/3/67029_ha_1.zip

  • Vote tăng 2

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

@Linh: Hộp thoại chương trình chính, thanh header (gọi nó là header chư không ai gọi là menu nhé) đúng là không phải image. Còn hộp thoại tra thép, đó không fải là slide mà chính xác là 1 image. Hoàn toàn có thể dùng text trong image, nhưng đó là text đồ họa 8bit hoặc text vector. Cái này thì em rành quá rồi. Image không sử dụng chung font chữ với text của các tile bình thường khác,là font đồ họa 16 và 32bit

Tối về check email nhé.

@Tue_nv: Chương trình thống kê thép này em viết chưa hoàn thiện, gần xong thì nghỉ việc nên vứt xó nó hơn 1 năm qua, giờ cũng không có ý định fát triển tiếp nữa. Lúc nào rảnh em sẽ làm cái tut giới thiệu toàn bộ để bác coi.

@ĐVH: hình tôi post đúng là win8 đấy. Chiều rộng các tile không chỉ fụ thuộc vào tham số width mà còn fụ thuộc vào các yếu tố khác: chiều rộng tổng thể của hộp thoại, tỷ lệ chiều rộng giữa các tile trong cùng hàng....

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

@Thaistreetz: Thanks man!  :D

@ĐVH: Code thế mà bạn bảo đơn giản ư! Rất hay và chả dễ tí nào! tuy sử dụng fixed_width_font = true không đẹp bằng của Thaistreetz nhưng hoàn toàn chấp nhận được.

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


×