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ị

@Doan Van Ha: Nhắc như thế mà bác không nhớ, có lẽ ngày xưa bác không được học môn QUY HOẠCH TUYẾN TÍNH (Hình như Xây dựng, Giao thông được học môn này, trường khác thì không biết sao...)

Đây bác (về mặt thuật toán): https://vi.wikipedia.org/wiki/B%C3%A0i_to%C3%A1n_v%E1%BA%ADn_t%E1%BA%A3i

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

@Doan Van Ha: Nhắc như thế mà bác không nhớ, có lẽ ngày xưa bác không được học môn QUY HOẠCH TUYẾN TÍNH (Hình như Xây dựng, Giao thông được học môn này, trường khác thì không biết sao...)

Đây bác (về mặt thuật toán): https://vi.wikipedia.org/wiki/B%C3%A0i_to%C3%A1n_v%E1%BA%ADn_t%E1%BA%A3i

Bạn xem lại lý thuyết bài toán vận tải giùm tí xem có giống đề toán này không nhé. Bài toán của tôi là tìm vị trí điểm M sao cho chi phí bé nhất.

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

@quocmanh04tt: về cách viết và thuật toán thì sai bạn à, bài toán của Doan Van Ha ko thuộc về bài toán vận chuyển do đó ko nằm trong bài toán tuyến tính. :D

@Doan Van Ha: bạn tự giải với 2 điểm, 3 điểm thì chắc sẽ giải được, để tận dụng máy tính thì áp dụng thử dần, Bài toán của bạn tương đối giống với bào toán tìm đường ngắn nhất nhưng độ phức tạp chắc gấp nhiều lầ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

Trong "Ai là triệu phú" MC Lại Văn Sâm luôn nói câu "Ai biết chắc chắn thì xin trợ giúp" nhưng đa số vẫn trả lời cho có trả lời. Chán như con giá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

Uh, nhầm!

@Detailing: ở trên ý là diễn giải cái này nằm trong cái kia, không phải là cách viết và thuật toán, không phải là bài toán vận chuyển thì chưa chắc là không phải tuyến tính... :D

@Doan Van Ha: Cụ thể bài toán của bác giống bài toán này:

.Tùy theo trường hợp cụ thể mà ta có các cách giải quyết khác nhau, chủ yếu chọn
vị trí đặt kho theo yêu cầu chi phí vận chuyển nhỏ nhất.
Hàm mục tiêu có dạng:

G = Tong (ci.qi.li) =>min
Với G_tổng giá thành vận chuyển từ kho đến các điểm tiêu thụ.
ci_giá thành vận chuyển cho 1 tấn vữa/km.
qi_ khối lượng vữa cung ứng cho từng điểm tiêu thụ.
li_khoảng cách từ điểm cung ứng đến từng điểm tiêu thụ.
Có thể giải bài toán theo phương pháp giải tích, phương pháp Gradien_bài toán
quy hoạch phi tuyến.

P/s: Trích từ giáo trình tổ chức thi cô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

Trong "Ai là triệu phú" MC Lại Văn Sâm luôn nói câu "Ai biết chắc chắn thì xin trợ giúp" nhưng đa số vẫn trả lời cho có trả lời. Chán như con gián.

Bạn add câu này vô signature để nhắc nhở mọi người luôn, bây giờ mình nhớ rồi :D.

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

[Hỏi]

Các bác làm ơn cho hỏi , trong khi viết LISP đến phần hộp thoại Dialog thì trong cấu trúc cú pháp LISP làm thế nào để căn chỉnh độ rộng các dòng cho đồng đều

Chẳng hạn em có CODE như sau:

  


quan_thong_so : dialog {label = "THIET LAP THONG SO CHO TINH TOAN THONG KE THEP";

  :row{

     :boxed_column{label = "Thong so chinh";

        :popup_list {key = "lt_L"; label = "Lam tron cho L (chieu dai 1 thanh)          .";width = 3;}

        :popup_list {key = "lt_TongL"; label = "Lam tron cho TongL (chieu dai Toan bo CK)   .";width = 3;}

        :edit_box {key = "L1t"; label = "Chieu dai 1 thanh thep (11700 mm)           .";width = 3;}

        :edit_box {key = "Noi"; label = "He so noi thep (30D)                        .";width = 3;}

        :popup_list {key = "lt_Noi"; label = "Boi lam tron moi noi (25,50,100)            .";width = 3;}

        }

      :boxed_column{label = "TT";

         }

       }

   ok_cancel;

   }

 

 

 

Khi đó nếu dùng Vlisp vào Tools/ Interface Tools/ Preview DCL Editor thì bảng hiện lên không có độ rộng đều nhau, dù em đã cố gắng để string của các mục có tổng chữ cái như nhau mà không được

Các bác có phương án nào khác không ạ?

xin cảm ơ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

Dùng chiêu này:

 

quan_thong_so : dialog {label = "THIET LAP THONG SO CHO TINH TOAN THONG KE THEP";
  :column{
     :boxed_row {label = "Thong so chinh";
       :column {
         :text {label = "Lam tron cho L (chieu dai 1 thanh)";}
         :text {label = "Lam tron cho TongL (chieu dai Toan bo CK)";}
         :text {label = "Chieu dai 1 thanh thep (11700 mm)";}
         :text {label = "He so noi thep (30D)";}
         :text {label = "Boi lam tron moi noi (25,50,100)";}
        }
       :column {
         :popup_list {key = "lt_L";}
         :popup_list {key = "lt_TongL";}
         :edit_box {key = "L1t";}
         :edit_box {key = "Noi";}
         :popup_list {key = "lt_Noi";}
        }
       }
        :boxed_column{label = "TT";
         }
       }
       ok_cancel;
   }
  • 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

Dùng chiêu này:

Em cảm ơn bác rất nhiều, điều này rất có ích với em, xin cảm ơn bá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

Bạn viết dư cặp này :{column ... } . Nó nằm ở dòng thứ 2 và dòng trên ok_cancel nhé!

Thanks bác, những cái đó em có thể sửa được, và đã ứng dụng rồi, :D

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ào mọi người, có thể cho em hỏi chút ý tưởng về thuật toán bảo vệ file LISP không, chẳng hạn muốn khoá file LISP để cho file đó chỉ có thể dùng cho 1 máy, trong thời gian 30ngày kề từ ngày đăng ký Lisp lần đầu, hết 30 ngày căn cứ vào mốc thời gian lúc đó tự sinh PASS đăng ký phù hợp (nếu người dùng nhập đúng sẽ cho sử dụng tiếp), khi đó người viết lissp sẽ có Lisp khác tự tạo Key phù hơpj với thời điểm đó và gửi cho Người dùng

Về cơ bản là như vậy, em muốn hỏi mọi người có ý tưởng nào có thể giúp em không. Hiện em đã làm được 1 số việc sau:

 

Hàm con:

1. Hàm lấy tên máy (tên USER máy tính), định dùng làm nhận diện máy, nhưng chưa ổn lắm không biết có cách khác không

(defun layTenUser(/ str)
  (setq str (substr (vla-get-supportpath(vla-get-files(vla-get-preferences(vlax-get-acad-object)))) 1 40)
	str (substr str (+ 7 (vl-string-search "Users\\" str)) 25)
	str (substr str 1 (vl-string-search "\\appdata" str)))
  str)
2. Hàm lấy ngày tháng hiện tại

(defun NowDate (/ DD MO RR YY) ; lay ngay hom nay
  (setq rr (rtos (getvar 'cdate) 2 8))
  (setq YY (substr rr 1 4)
	MO (substr rr 5 2)
	DD (substr rr 7 2))
  (list DD MO YY))
3. Hàm lấy ngày kết thúc dựa theo hai thống số: ngày bắt đầu (dạng list) và số ngày cho phép (dạng interger)


;; Ví dụ dùng (ngKT_tuNg (nowdate) 30)
(defun ngKT_tuNg (DStart delta)
  (setq coTh 0 coYY 0)
  (setq ngKT (+ delta (read(car DStart))))
  (if (> ngKT 30) (setq coTh 1 ngKT (rem ngKT 30)))
  (setq thKT (+ coTh (read (cadr DStart))))
  (if (> thKT 12) (setq coYY 1 thKT (rem thKT 12)))
  (setq YYKT (+ coYY (read(last DStart))))
  (mapcar '(lambda(x) (rtos x 2 0)) (list ngKT thKT YYKT))
  (list
    (apply '+ (mapcar '(lambda(x y ) (* x y)) '( 1 12 365) (list ngKT thKT YYKT)))
    (strcat (car (setq r1
			(mapcar '(lambda(x) (if (< x 10)
					      (strcat "0" (rtos x 2 0))
					      (rtos x 2 0)))
				(list ngKT thKT YYKT))))
	    "." (cadr r1) "." (last r1)))
  )
mong các bác giúp thêm

 

1. Hàm nhận diện máy.

2. Thuật toán đăng ký lần đầu (1 lần duy nhất)

3. Thuật toán tự sinh Key đăng ký phù hợp với : tên máy, thời điểm đăng ký, thêm một số thônt tín khác thì càng tốt (ví dụ Gmail đăng ký, key có giá trị đăng ký trong 3 ngày,... chẳng hạn

Chỉnh sửa theo quantvxd

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

Khóa lisp là 1 vấn đề không đơn giản. Ngay cả những chương trình đồ sộ như window, autocad... cũng chả là gì với hacker, thì lisp chỉ là đinh rỉ.

1). Hàm nhận diện máy: tôi test trên máy của tôi trả về 2 dấu nháy "", chắc bị lỗi gì đó của bạn.

User có thể đổi tên từ Ngọc Trinh sang Hồ Ngọc Hà, rồi Tập Cận Bình... Và dùng mê thâu.

2) và 3). Ngày tháng thì vặn đồng hồ là xong!

4). Số lần dùng thì "nó" cài lại lisp.

Dùng serial của máy khả dĩ hơn. Biết đến đâu nói đến đó. Nghe và Ngóng thêm.

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

Khóa lisp là 1 vấn đề không đơn giản. Ngay cả những chương trình đồ sộ như window, autocad... cũng chả là gì với hacker, thì lisp chỉ là đinh rỉ.

1). Hàm nhận diện máy: tôi test trên máy của tôi trả về 2 dấu nháy "", chắc bị lỗi gì đó của bạn.

User có thể đổi tên từ Ngọc Trinh sang Hồ Ngọc Hà, rồi Tập Cận Bình... Và dùng mê thâu.

2) và 3). Ngày tháng thì vặn đồng hồ là xong!

4). Số lần dùng thì "nó" cài lại lisp.

Dùng serial của máy khả dĩ hơn. Biết đến đâu nói đến đó. Nghe và Ngóng thêm.

Cảm ơn bác , trước mắt chỉ cần tiếp xúc cấp độ này thôi, về cơ bản, đối tượng sử dụng: 1 không biết LISP, 2 không rõ hướng viết ban đầu, mò sẽ khó khăn hơn, 3 không rảnh để nhờ vả, viết lại, hay phá LISP.

Mà làm thì được là tốt, không được cho không

Quan trong là học hỏi tiếp cận thôi bác ahj

Chứ viết Free suốt mờ. hhahaha

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ào mọi người, có thể cho em hỏi chút ý tưởng về thuật toán bảo vệ file LISP không, chẳng hạn muốn khoá file LISP để cho file đó chỉ có thể dùng cho 1 máy, trong thời gian 30ngày kề từ ngày đăng ký Lisp lần đầu, hết 30 ngày căn cứ vào mốc thời gian lúc đó tự sinh PASS đăng ký phù hợp (nếu người dùng nhập đúng sẽ cho sử dụng tiếp), khi đó người viết lissp sẽ có Lisp khác tự tạo Key phù hơpj với thời điểm đó và gửi cho Người dùng

Về cơ bản là như vậy, em muốn hỏi mọi người có ý tưởng nào có thể giúp em không. Hiện em đã làm được 1 số việc sau:

 

Hàm con:

1. Hàm lấy tên máy (tên USER máy tính), định dùng làm nhận diện máy, nhưng chưa ổn lắm không biết có cách khác không

(defun layTenUser(/ str)
  (setq str (substr (vla-get-supportpath(vla-get-files(vla-get-preferences(vlax-get-acad-object)))) 1 40)
	str (substr str (+ 7 (vl-string-search "Users\\" str)) 25)
	str (substr str 1 (vl-string-search "\\appdata" str)))
  str)
2. Hàm lấy ngày tháng hiện tại

(defun NowDate (/ DD MO RR YY) ; lay ngay hom nay
  (setq rr (rtos (getvar 'cdate) 2 8))
  (setq YY (substr rr 1 4)
	MO (substr rr 5 2)
	DD (substr rr 7 2))
  (list DD MO YY))
3. Hàm lấy ngày kết thúc dựa theo hai thống số: ngày bắt đầu (dạng list) và số ngày cho phép (dạng interger)


;; Ví dụ dùng (ngKT_tuNg (nowdate) 30)
(defun ngKT_tuNg (DStart delta)
  (setq coTh 0 coYY 0)
  (setq ngKT (+ delta (read(car DStart))))
  (if (> ngKT 30) (setq coTh 1 ngKT (rem ngKT 30)))
  (setq thKT (+ coTh (read (cadr DStart))))
  (if (> thKT 12) (setq coYY 1 thKT (rem thKT 12)))
  (setq YYKT (+ coYY (read(last DStart))))
  (mapcar '(lambda(x) (rtos x 2 0)) (list ngKT thKT YYKT))
  (list
    (apply '+ (mapcar '(lambda(x y ) (* x y)) '( 1 12 365) (list ngKT thKT YYKT)))
    (strcat (car (setq r1
			(mapcar '(lambda(x) (if (< x 10)
					      (strcat "0" (rtos x 2 0))
					      (rtos x 2 0)))
				(list ngKT thKT YYKT))))
	    "." (cadr r1) "." (last r1)))
  )
mong các bác giúp thêm

 

1. Hàm nhận diện máy.

2. Thuật toán đăng ký lần đầu (1 lần duy nhất)

3. Thuật toán tự sinh Key đăng ký phù hợp với : tên máy, thời điểm đăng ký, thêm một số thônt tín khác thì càng tốt (ví dụ Gmail đăng ký, key có giá trị đăng ký trong 3 ngày,... chẳng hạn

 

 

Mình có chút ý kiến chia sẻ với bạn về vấn đề này.

 

1. Hiện nay việc cấp quyền sử dụng phần mềm hay ứng dụng dần chuyển sang xu hướng quản lý theo tài khoản đăng ký. Cái này đảm bảo quyền lợi cho người dùng khi nâng cấp máy, thay máy hoặc sở hữu nhiều máy cho công việc (máy nhà, máy cơ quan...). Từ Cad 2014 trở lên Autodesk đã hỗ trợ cung cấp ID người dùng thông qua tài khoản A360. Bạn tham khảo các biến hệ thống ONLINEUSERID, ONLINENAME. ID người dùng được cung cấp bởi ONLINEUSERID được đảm bảo là duy nhất cho mỗi User. Tất nhiên nếu bạn bán hàng cho đối tượng người dùng sử dụng cad từ 2013 trở xuống thì cách này không được hỗ trợ.

 

2 Về cách xác định thời gian dùng thử mình nghĩ chỉ cần dùng biến hệ thống Date là đủ. Khi khởi chạy ứng dụng lần đầu, lấy giá trị của biến Date, mã hóa lại, lưu registry. Các lần chạy ứng dụng sau, lại lấy giá trị biến Date trừ đi giá trị đã lưu registry là ra số ngày sử dụng. Việc mã hóa như thế nào và lưu registry ra sao để khó mò ra thì mình không bàn nhé. Nó phụ thuộc vào khả năng của bạn.

Gợi ý thêm cho bạn về việc mã hóa để tránh decode. Toàn bộ thuật toán mã hóa nên nhúng trong 1 hàm không tên. các công cụ decode file fas hoặc vlx hiện nay như mình biết thì đang bó tay trong việc truy cập nội dung hàm không tên.

 

3. Thuật toán tự sinh keys đăng ký mình nghĩ cũng không nên bàn, mỗi người có 1 cách làm và chẳng ai giống ai. Nó phụ thuộc vào kiến thức về lĩnh vực mã hóa của mỗi người.

 

Mình có một số ứng dụng bán trên Autodesk AppStore cũng sử dụng phương pháp trên. Hiệu quả.

  • 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ào các anh:

Do nhu cầu công việc em muốn nhờ các anh điều chỉnh giúp em lisp xuất tọa độ COORN cho đường Pline kín như sau:

 

1. Thêm lựa chọn điểm đầu của danh sách xuất ra;

 

2. Lựa chọn chiều xuất tọa độ các đỉnh đường Pline kín (theo chiều kim đồng hồ hoặc ngược kim đồng hồ hoặc lisp để cố định chiều xuất là theo chiều kim đồng hồ luôn cũng được) bắt đầu từ điểm lựa chọn trên.

 

Trân trọng cảm ơn!

 

http://www.cadviet.com/upfiles/6/136008_coorn.lsp

  • Vote giảm 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

[Hỏi]

Các bác cho hỏi, trong Dialog của AutoLisp, thì có thể thay đổi cỡ chữ (Size) và Font chữ của các Label, danh sách, danh sách thả xuống, edit_box,... được không? nếu được thì cách làm như thế nào,

Hiện trong việc xử lý đối tượng: List_box, hoặc Popup_list chữ và Font hiện tại hơi nhỏ, mắt lại kém,. Mở rộng hơn, liệu có thể đổi màu chữ trong các đối tượng trên không?

xin cảm ơ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- Lấy list các đỉnh thì chắc là bạn biết rồi.

2- Sort list theo Y trên 4R cũng nhiều.

3- Kết quả "Anh ở đầu sông, Em cuối sô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

Chào các bác!

Em có viết một lisp để tạo nhiều Viewport hiển thị nội dung bên Model. Với số lượng Viewport ít thì OK không sao nhưng khi  số lượng Viewport lớn (50 chẳng hạn) thì các Viewport đầu bị mất và chỉ còn mấy Viewport cuối. Em không biết nguyên nhân tại sao nữa. Mong các bác giải thích và cho phương thức với ạ!

Cảm ơn các bác rất nhiều!

(defun C:99 (/	       CHCAO	 CHNGANG   I	     N
	     PNTDONGNAM		 PNTTAYBAC PNT_CHEN  PNT_I
	     PNT_I+1
	    )
  (vl-load-com)
  (setq Olmode (getvar "OSMODE"))
  (setvar "OSMODE" 0)
  (setvar 'TILEMODE 0)
  (setq	Pnt_Chen
	 (getpoint
	   "\nCh\U+1ECDn \U+0111i\U+1EC3m ch\U+00E8n khung: "
	 )
  )
  (setq n (getint "\nNhap so Viewport: "))
  (setq ChCao 400.0)
  (setq ChNgang 350.0)
  (setq i 0)
  (vl-cmdf "Zoom" "E")
  (while (< i n)
    (setq Pnt_i (polar Pnt_Chen 0 (* i 800.0)))
    (setq Pnt_i+1 (polar Pnt_Chen 0 (* (+ i 1) 400.0)))
    (setq PntTayBac (polar Pnt_i (/ pi 2) 400.0))
    (setq PntDongNam (polar Pnt_i 0 350.0))
    (vl-cmdf "Zoom" "W" PntTayBac PntDongNam)
    (vl-cmdf "Mview" PntTayBac PntDongNam)
    (vl-cmdf "MSpace")
    (vl-cmdf "Zoom" "E")
    (vl-cmdf "PSpace")
    (vl-cmdf "PAN" Pnt_i Pnt_i+1)
    (setq i (1+ i))
  )
  (vl-cmdf "Zoom" "E")
  (setvar "OSMODE" Olmode)
  (Princ)
)

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

×