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ị

Em dùng một số hàm sau đây để vẽ lại 3D Polyline từ 2D Polyline có các đỉnh đi qua các TEXT.

Tại mỗi đỉnh 2D Polyline em cứ phải duyệt qua tất cả các Text có trong bản vẽ. 

Cho em hỏi các bác xem còn cách nào làm tối ưu hơn không ạ?

Đây là CODE của em.

(vl-load-com)
(defun C:CV3D23D(/ Olmode en n ob Pnt_i Lts1 i P1 Pnt_TB  Pnt_DN y ss1 Pnt_i e)
(defun *error* ( msg )
(if Olmode (setvar 'osmode Olmode))
(if (not (member msg '("*BREAK,*CANCEL*,*EXIT*")))
    (princ (strcat "\nError: " msg))
)
(princ)
)
(setq Olmode (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq ss (ssget "_X" (list (cons 0 "TEXT"))))
(setq ss1 (vl-remove nil (mapcar '(lambda(x) (if  (= (acet-dxf 0 (entget x)) "TEXT")  (TD:Text-Base x) nil)) (acet-ss-to-list ss))))
(setq ss2 (vl-sort (vl-sort ss1 '(lambda(x y) (< (car x) (car y)))) '(lambda(x y) (< (cadr x) (cadr y)))))

(setq ssObjPline (ssget (list (cons 0 "*POLYLINE"))))
(setq LtsObjPline (acet-ss-to-list ssObjPline))
(foreach en LtsObjPline
	(CV1PL3D en ss2)
)
(setvar "OSMODE" Olmode)
(princ)
)




(defun CV1PL3D( ObjPline ss2 / Olmode en n ob Pnt_i Lts1 i P1 Pnt_TB  Pnt_DN y ss1 Pnt_i e)
(setvar "OSMODE" 0)
(setq ob (vlax-ename->vla-object ObjPline)
       n (vlax-curve-getEndParam ob)
)
(setq Lts1 (list))
(setq Pnt_i nil)
(setq i 0)
(while (<= i n)
	(progn
		(setq P1 (vlax-curve-getPointAtParam ob i))
		(setq Pnt_text (car (vl-sort ss2 '(lambda(x y) (< (distance x P1) (distance y P1))))))
	  	(if (and (equal (car P1) (car Pnt_text) 0.0000000001) (equal (cadr P1) (cadr Pnt_text) 0.0000000001))
			 (setq Pnt_i Pnt_text)
		  	 (setq Pnt_i P1)
	  	)
		(setq Lts1 (append Lts1 (list Pnt_i)))
	)
(setq i (+ i 1))
)
(entdel ObjPline)
(MakePolyline3D Lts1)
)


(defun TD:Text-Base (ent)
  (setq Ma10  (cdr (assoc 10 (entget ent))))
  (setq Ma11  (cdr (assoc 11 (entget ent))))
  (setq X11 (car Ma11))
  (setq Ma71  (cdr (assoc 71 (entget ent))))
  (setq Ma72  (cdr (assoc 72 (entget ent))))
  (if (or (and (= Ma71 0) (= Ma72 0) (= X11 0))
	  (and (= Ma71 0) (= Ma72 3) )
	  (and (= Ma71 0) (= Ma72 5) )
      )
    Ma10
    Ma11
   )
)


(defun MakePolyline3D (vtcs)
  (entmake
    (list
    '(0 . "POLYLINE")
    '(66 . 1)
    '(70 . 8)
    )
  )
  (foreach vtx vtcs
    (entmake
      (list
      '(0 . "VERTEX")
      (cons 10 vtx)
      '(70 . 32)
      )
    )
  )
  (entmake '((0 . "SEQEND")))
)

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 dùng một số hàm sau đây để vẽ lại 3D Polyline từ 2D Polyline có các đỉnh đi qua các TEXT.

Tại mỗi đỉnh 2D Polyline em cứ phải duyệt qua tất cả các Text có trong bản vẽ. 

Cho em hỏi các bác xem còn cách nào làm tối ưu hơn không ạ?

Đây là CODE của em.

(vl-load-com)
(defun C:CV3D23D(/ Olmode en n ob Pnt_i Lts1 i P1 Pnt_TB  Pnt_DN y ss1 Pnt_i e)
(defun *error* ( msg )
(if Olmode (setvar 'osmode Olmode))
(if (not (member msg '("*BREAK,*CANCEL*,*EXIT*")))
    (princ (strcat "\nError: " msg))
)
(princ)
)
(setq Olmode (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq ss (ssget "_X" (list (cons 0 "TEXT"))))
(setq ss1 (vl-remove nil (mapcar '(lambda(x) (if  (= (acet-dxf 0 (entget x)) "TEXT")  (TD:Text-Base x) nil)) (acet-ss-to-list ss))))
(setq ss2 (vl-sort (vl-sort ss1 '(lambda(x y) (< (car x) (car y)))) '(lambda(x y) (< (cadr x) (cadr y)))))

(setq ssObjPline (ssget (list (cons 0 "*POLYLINE"))))
(setq LtsObjPline (acet-ss-to-list ssObjPline))
(foreach en LtsObjPline
	(CV1PL3D en ss2)
)
(setvar "OSMODE" Olmode)
(princ)
)




(defun CV1PL3D( ObjPline ss2 / Olmode en n ob Pnt_i Lts1 i P1 Pnt_TB  Pnt_DN y ss1 Pnt_i e)
(setvar "OSMODE" 0)
(setq ob (vlax-ename->vla-object ObjPline)
       n (vlax-curve-getEndParam ob)
)
(setq Lts1 (list))
(setq Pnt_i nil)
(setq i 0)
(while (<= i n)
	(progn
		(setq P1 (vlax-curve-getPointAtParam ob i))
		(setq Pnt_text (car (vl-sort ss2 '(lambda(x y) (< (distance x P1) (distance y P1))))))
	  	(if (and (equal (car P1) (car Pnt_text) 0.0000000001) (equal (cadr P1) (cadr Pnt_text) 0.0000000001))
			 (setq Pnt_i Pnt_text)
		  	 (setq Pnt_i P1)
	  	)
		(setq Lts1 (append Lts1 (list Pnt_i)))
	)
(setq i (+ i 1))
)
(entdel ObjPline)
(MakePolyline3D Lts1)
)


(defun TD:Text-Base (ent)
  (setq Ma10  (cdr (assoc 10 (entget ent))))
  (setq Ma11  (cdr (assoc 11 (entget ent))))
  (setq X11 (car Ma11))
  (setq Ma71  (cdr (assoc 71 (entget ent))))
  (setq Ma72  (cdr (assoc 72 (entget ent))))
  (if (or (and (= Ma71 0) (= Ma72 0) (= X11 0))
	  (and (= Ma71 0) (= Ma72 3) )
	  (and (= Ma71 0) (= Ma72 5) )
      )
    Ma10
    Ma11
   )
)


(defun MakePolyline3D (vtcs)
  (entmake
    (list
    '(0 . "POLYLINE")
    '(66 . 1)
    '(70 . 8)
    )
  )
  (foreach vtx vtcs
    (entmake
      (list
      '(0 . "VERTEX")
      (cons 10 vtx)
      '(70 . 32)
      )
    )
  )
  (entmake '((0 . "SEQEND")))
)

Mình có mấy góp ý sau:

1./ Đã sử dụng hàm entmake vẽ POLYLINE thì không cần phải tắt chế độ bắt điểm. Vì khi tạo đối tượng bằng entmake thì không phụ thuộc vào chế độ bắt điểm

2./ Nên sử dụng hàm Repeat để lặp khi biết trước số lần lặp, không nên dùng While vì dùng While thì cứ mỗi lần lặp thì phải kiểm tra điều kiện lặp (mục đích đẩy nhanh tốc độ)

3./ Hàm con TD:Text-Base sao không sử dụng Prop TextAlignmentPoint cho gọn. Mình nghĩ tốc độ sẽ nhanh hơn vì không phải kiểm tra If và setq chi cả

4./ Mình cũng chưa hiểu ý đồ của bạn lắm. Banj có thể post file lên thì mọi người mới có góp ý cụ thể đượ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

Mình có mấy góp ý sau:

1./ Đã sử dụng hàm entmake vẽ POLYLINE thì không cần phải tắt chế độ bắt điểm. Vì khi tạo đối tượng bằng entmake thì không phụ thuộc vào chế độ bắt điểm

2./ Nên sử dụng hàm Repeat để lặp khi biết trước số lần lặp, không nên dùng While vì dùng While thì cứ mỗi lần lặp thì phải kiểm tra điều kiện lặp (mục đích đẩy nhanh tốc độ)

3./ Hàm con TD:Text-Base sao không sử dụng Prop TextAlignmentPoint cho gọn. Mình nghĩ tốc độ sẽ nhanh hơn vì không phải kiểm tra If và setq chi cả

4./ Mình cũng chưa hiểu ý đồ của bạn lắm. Banj có thể post file lên thì mọi người mới có góp ý cụ thể được

1. Dạ vâng. Do thói quen nên em cho vào chứ em cũng hiểu Entmake ko phụ thuộc vào OSNAP

2. Dạ, em sẽ rút kinh nghiệm. Cơ mà em cũng có ý là while với điều kiện thì thoát, ko phải chạy hết

3. Hàm em tự tạo để lấy điểm chuẩn của Text

4. Em làm về Trắc Địa nên khi đo địa hình về mng thường nối các điểm bằng 2D Polyline. Em viết hàm này mục đích để không phải vẽ lại các đường 3D Polyline. Các đường này sẽ là đường Break Line để chạy mặt cắt địa hình.

Thuật toán là tại các đỉnh Pline xét toàn bộ các Text, tính khoảng cách từ điểm đó đến các text, sort các khoảng cách đó và lấy ra phần tử đầu tiên.

Nếu tọa độ đỉnh đó trùng với tọa độ Text nào đó thì lấy ra tọa độ Text đó, nếu ko thỏa mãn thì giữ nguyên độ cao đỉnh đó.

Thuật toán chậm là do xét quá nhiều Text. Em nghĩ sẽ có cách khác nhanh 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

1. Dạ vâng. Do thói quen nên em cho vào chứ em cũng hiểu Entmake ko phụ thuộc vào OSNAP

2. Dạ, em sẽ rút kinh nghiệm. Cơ mà em cũng có ý là while với điều kiện thì thoát, ko phải chạy hết

3. Hàm em tự tạo để lấy điểm chuẩn của Text

4. Em làm về Trắc Địa nên khi đo địa hình về mng thường nối các điểm bằng 2D Polyline. Em viết hàm này mục đích để không phải vẽ lại các đường 3D Polyline. Các đường này sẽ là đường Break Line để chạy mặt cắt địa hình.

Thuật toán là tại các đỉnh Pline xét toàn bộ các Text, tính khoảng cách từ điểm đó đến các text, sort các khoảng cách đó và lấy ra phần tử đầu tiên.

Nếu tọa độ đỉnh đó trùng với tọa độ Text nào đó thì lấy ra tọa độ Text đó, nếu ko thỏa mãn thì giữ nguyên độ cao đỉnh đó.

Thuật toán chậm là do xét quá nhiều Text. Em nghĩ sẽ có cách khác nhanh hơn.

 

1. Dạ vâng. Do thói quen nên em cho vào chứ em cũng hiểu Entmake ko phụ thuộc vào OSNAP

2. Dạ, em sẽ rút kinh nghiệm. Cơ mà em cũng có ý là while với điều kiện thì thoát, ko phải chạy hết

3. Hàm em tự tạo để lấy điểm chuẩn của Text

4. Em làm về Trắc Địa nên khi đo địa hình về mng thường nối các điểm bằng 2D Polyline. Em viết hàm này mục đích để không phải vẽ lại các đường 3D Polyline. Các đường này sẽ là đường Break Line để chạy mặt cắt địa hình.

Thuật toán là tại các đỉnh Pline xét toàn bộ các Text, tính khoảng cách từ điểm đó đến các text, sort các khoảng cách đó và lấy ra phần tử đầu tiên.

Nếu tọa độ đỉnh đó trùng với tọa độ Text nào đó thì lấy ra tọa độ Text đó, nếu ko thỏa mãn thì giữ nguyên độ cao đỉnh đó.

Thuật toán chậm là do xét quá nhiều Text. Em nghĩ sẽ có cách khác nhanh hơn.

1). Nếu đơn giản chỉ là cái màu đỏ thì em đã quá phức tạp hóa vấn đề. Anh đề xuất thuật toán như sau:

Tại mỗi đỉnh của 2DPolyline, ví dụ nó là pt, dùng (setq ss (ssget "c" pt pt '((0 . "Text")))) để chọn text.

Nếu có ss thì thay đỉnh, nếu không có ss thì giữ nguyên đỉnh.

2). Cách lấy tọa độ đỉnh 2DPolyline của em đã bị sai.

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). Nếu đơn giản chỉ là cái màu đỏ thì em đã quá phức tạp hóa vấn đề. Anh đề xuất thuật toán như sau:

Tại mỗi đỉnh của 2DPolyline, ví dụ nó là pt, dùng (setq ss (ssget "c" pt pt '((0 . "Text")))) để chọn text.

Nếu có ss thì thay đỉnh, nếu không có ss thì giữ nguyên đỉnh.

2). Cách lấy tọa độ đỉnh 2DPolyline của em đã bị sai.

1. Đỏ: Liệu có liên quan đến vấn đề ZOOM ko bác Hạ? Em đã nghĩ tới cách bác nói trong câu hỏi lần trước. Bác cho em lời khuyên với ạ

2. Xanh: Bác chỉ cho em với ạ? Em thấy nó chạy đúng 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

thanhduan2407:

1. nó liên quan den zoom, bạn nên chọn theo cách bạn đã làm ở bài #1790

2. Bạn dùng 1 trong 2 cách sau:

 (acet-geom-vertex-list ss)) - lấy được tất cả các đỉnh kể cả đa giác kín

(mapcar 'cdr(vl-remove-if-not'(lambda (x) (= (car x) 10))(entget ss))) - đa giác kín thì thiếu điểm cuối cùng

 

Vết cắt địa hình của bạn là 1 đường thẳng hay là đường gấp khúc

 

Doanvanha: mình nhớ bạn có đặt câu hỏi làm sao để chọn các point, text,.. gần điểm pt nhất 1 cách nhanh nhất (mình đã tìm lại nhưng không thấy đâu). Câu trả lời này chắc giúp được cho thanhduan2047. Không biết Ha đã có thuật toán giải quyết vấn đề này chưa vì mình cũng đang tìm hiểu

  • 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

Sao lại foreach mà không phải là while not nhỉ :)

Bài toán còn nhanh hơn nữa nếu vl-sort cả list pt và list text base cùng chung 1 quy luật sắp xếp, hoặc gom nhóm theo độ chênh tọa độ , sau đó mới dùng vòng lặp.

Chém chém ché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

Hề hề. Cách làm của bác Hạ sẽ bị sai và lâu. he he.

Với lại cái cho equal p pt là sai vì nó có pt có cao độ.

@Ketxu: Em có ý tưởng nào không?

Viết dùm anh nghen.

Anh tham khảo cũng được. Bài toán sẽ áp dụng rất nhiều đấy. Hiii  :wub:

 (if (equal pt p 1E-8)
   p

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

 

(setq lst (acet-ss-to-list (ssget "_X" '((0 . "text")))))

(setq lst_pt (mapcar '(lambda(ent) (cdr (assoc 10 (entget ent)))) lst))

Cái đấy của bác Hạ sẽ sai base của Text nếu Justify của Text khác nhau. :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

Em tìm được cái này hay quá nhưng nó lại là sách. Tìm được quyển này thì hay, cơ mà đắt quá.

http://www.cs.stonybrook.edu/~algorith/files/nearest-neighbor.shtml

Bán rẻ cho em đây!

http://sist.sysu.edu.cn/~isslxm/DSA/textbook/Skiena.-.TheAlgorithmDesignManual.pdf

  • 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

Quý hóa quá. Cảm ơn bác Hạ nhiều. Bác có nhiều tài liệu hay ghê.

Cho em tham lam 1 chút nữa được không ạ?

Em đang nghiên cứu về tạo vùng Topology trong Autocad.

Đầu vào là các LINE nối với nhau thành các vùng kín và không kín.

Việc tạo Topology này là nếu vùng nào có Line nối khép kín với nhau thì tóm được các đỉnh thuộc vùng đó cho vào 1 danh sách. Nếu có n vùng thì có n danh sách các điểm của vùng.

Đây là bài toán rất hay trong Trắc Địa bác Hạ ạ!

Em đang làm đến bước khoanh vùng thì bị dừng lại do thuật toán chưa hiểu trong VB

(em đọc Code từ VB và muốn biến nó thành trong Autocad)

Nhờ các bác tư vấn cho em.

Function KhoanhVung(Ds_TopoEdges() As TopoEdge, TopoEdgesCount As Long, Ds_Areas() As Area, Areascount As Long, DS_Points() As Point_3D)
    Dim i As Long, j As Long
    Dim P1 As Point_3D, P2 As Point_3D
    Dim Id1 As Long, Id2 As Long, Ido As Long, K As Long
    Dim idCount As Long
    For i = 1 To TopoEdgesCount
        Ds_TopoEdges(i).Flag = False
    Next
    For i = 1 To TopoEdgesCount
    'Khoi tao vung
        If Ds_TopoEdges(i).Flag = False Then
            Ds_TopoEdges(i).Flag = True
            Id1 = Ds_TopoEdges(i).Id1
            Id2 = Ds_TopoEdges(i).Id2
            Ido = Id1
            Areascount = Areascount + 1
            ReDim Preserve Ds_Areas(Areascount)
            idCount = 0
            Do
                idCount = idCount + 1
                ReDim Preserve Ds_Areas(Areascount).Ds_Id(idCount)
                Ds_Areas(Areascount).Ds_Id(idCount) = Id1
                
                K = GetEdge(Id2, Id1, Ds_TopoEdges, TopoEdgesCount)
                If K < TopoEdgesCount Then
                    If Ds_TopoEdges(K + 1).Id1 = Id2 Then
                        K = K + 1
                    Else
                        For j = K To 1 Step -1
                            If Ds_TopoEdges(j).Id1 <> Id2 Then
                                K = j + 1
                                Exit For
                            End If
                        Next
                    End If
                Else
                    For j = K To 1 Step -1
                        If Ds_TopoEdges(j).Id1 <> Id2 Then
                            K = j + 1
                            Exit For
                        End If
                    Next
                End If
                Id1 = Ds_TopoEdges(K).Id1
                Id2 = Ds_TopoEdges(K).Id2
                Ds_TopoEdges(K).Flag = True
                If Id2 = Ido Then
                    idCount = idCount + 1
                    ReDim Preserve Ds_Areas(Areascount).Ds_Id(idCount)
                    Ds_Areas(Areascount).Ds_Id(idCount) = Id1
                    Ds_Areas(Areascount).idCount = idCount
                    Exit Do
                End If
            Loop
'TÝnh diÖn tÝch vïng
'C¸ch 1
'                    Dim PL As PolyLine_3D
'                    .Dientich = 0
'                    For j = 1 To Areascount - 1
'                        PL = CoverAreaToPlLine(DS_Areas(j))
'                        .Dientich = GetArea(PL)
'                    Next
'C¸ch 2
            With Ds_Areas(Areascount)
                    Dim DX As Double, YTB As Double
                    .Dientich = 0
                    For j = 1 To .idCount - 1
                        DX = DS_Points(.Ds_Id(j + 1)).rX - DS_Points(.Ds_Id(j)).rX
                        YTB = (DS_Points(.Ds_Id(j + 1)).rY + DS_Points(.Ds_Id(j)).rY) / 2
                        .Dientich = .Dientich + DX * YTB
                    Next
                    DX = DS_Points(.Ds_Id(1)).rX - DS_Points(.Ds_Id(.idCount)).rX
                    YTB = (DS_Points(.Ds_Id(1)).rY + DS_Points(.Ds_Id(.idCount)).rY) / 2
                    .Dientich = Format((.Dientich + DX * YTB), "0.00")
'TÝnh t©m vïng
                    For j = 1 To .idCount
                        .Po.rX = .Po.rX + DS_Points(.Ds_Id(j)).rX
                        .Po.rY = .Po.rY + DS_Points(.Ds_Id(j)).rY
                    Next
                    .Po.rX = .Po.rX / .idCount
                    .Po.rY = .Po.rY / .idCount
                    If .Dientich > 0 Then
                        SoTamVung = SoTamVung + 1
                        ReDim Preserve Ds_Tam(SoTamVung)
                        Ds_Tam(SoTamVung).Po.rX = .Po.rX
                        Ds_Tam(SoTamVung).Po.rY = .Po.rY
                    End If
                End With
        End If
    Next
End Function

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ạ đây ạ.

Sau khi tạo vùng xong thì ta  lấy được 1 danh sách các vùng.Mỗi vùng chứa các đỉnh.

Cái vòng tròn màu vàng là đánh dấu vùng tạo được topology.

1 bài toán trong Địa Chính bác Hạ ạ

 

http://www.cadviet.com/upfiles/3/36665_topology.dwg

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ôi nhớ mang máng là hình như có đọc đâu đó vấn đề này rồi, nhưng giờ quên mất.

Hỏi: tôi load 1 file lisp xong. Vậy có thể lấy được đường dẫn đến file lisp vừa load đó không?

Ai biết nhờ chỉ giùm. 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

Tôi nhớ mang máng là hình như có đọc đâu đó vấn đề này rồi, nhưng giờ quên mất.

Hỏi: tôi load 1 file lisp xong. Vậy có thể lấy được đường dẫn đến file lisp vừa load đó không?

Ai biết nhờ chỉ giùm. Thanks!

 

Đây bác : http://www.cadviet.com/forum/topic/14210-hoi-ve-lisp-thuat-toan-y-tuong-coding/page-41

  • 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

 

  1. Dictionary được lưu trong Database của bản vẽ ko phải trong ModelSpace (chỉ là 1 BlockTablecord) nó chứa tất cả scale list được khai báo ko phải đang sử dụng
  2.  AcDbContextDataManager là 1 class được wrap lại cho .NET ko phải cho lisp (dùng ActiveX với các Interface) nên code của bạn bị lỗi
  3. Về cái ví dụ của bạn, giải thích thì dài dòng và nảy sinh ra thêm nhiều vấn đề nữa nên mình gợi ý bạn google  những thứ sau để hiểu sự khác nhau giữa: người bán đưa trái đào (value) cho người mua và phích cắm nối với thiết bị điện để truyền điện (reference,  object reference, pointer point to memory address)  ngoài ra có thể tìm hiểu thêm sự khác nhau như giữa Hard PointerSoft Pointer trong AutoCAD

Thời gian vừa rồi mình bận quá nên hôm nay mới rảnh rỗi tiếp tục chủ đề lần trước thảo luận với Detailing.

 

1. Mình đã mò mẫm hết mọi ngóc ngách của Dictionary nhưng không thể tìm thấy chỗ nào chỉ lưu "tất cả scale list được khai báo ko phải đang sử dụng". Mà nó lưu toàn bộ scale được người dùng khai báo, hoặc autocad khai báo mặc định, không cần biết có được sử dụng vào đối tượng nào đó hay không.

Có lẽ chỗ này đành nhờ Detailing chỉ cụ thể hơn chứ mình chịu rồi. hì

 

2. AcDbContextDataManager chính xác là có thể dùng với lisp như mình đã ví dụ trong bài trước. Code của mình bị lỗi vì đơn giản là "nó không có ở đó" để lấy ra mà thôi. đúng ra mình cần thêm 1 hàm kiểm tra dữ liệu trước khi lấ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

Thời gian vừa rồi mình bận quá nên hôm nay mới rảnh rỗi tiếp tục chủ đề lần trước thảo luận với Detailing.

 

1. Mình đã mò mẫm hết mọi ngóc ngách của Dictionary nhưng không thể tìm thấy chỗ nào chỉ lưu "tất cả scale list được khai báo ko phải đang sử dụng". Mà nó lưu toàn bộ scale được người dùng khai báo, hoặc autocad khai báo mặc định, không cần biết có được sử dụng vào đối tượng nào đó hay không.

Có lẽ chỗ này đành nhờ Detailing chỉ cụ thể hơn chứ mình chịu rồi. hì

 

2. AcDbContextDataManager chính xác là có thể dùng với lisp như mình đã ví dụ trong bài trước. Code của mình bị lỗi vì đơn giản là "nó không có ở đó" để lấy ra mà thôi. đúng ra mình cần thêm 1 hàm kiểm tra dữ liệu trước khi lấy.

1. AutoCAD lưu tất cả trong Dictionary (public - bạn có thể try cập được) 

Nếu bạn "đã đã mò mẫm hết mọi ngóc ngách của Dictionary" nhưng vẫn ko tìm được thì mình nghĩ nó đã được AutoCAD lưu ở môt variables nào đấy (private, protected hay internal và chỉ có Acad.exe mới truy cập được) trong quá trình regeneration drawing, hay các task đại loại như thế. Do đó nếu bạn muốn làm việ này thì chỉ có cách đi lần theo các entity để tìm scalelist nào đang được sử dụng thôi. :D

 

2. Nếu bạn dùng được nghĩa là Autodesk đã export class đó sang ActiveX hay họ đã có lib để sử dụng class đó :)

1. AutoCAD lưu tất cả trong Dictionary (public - bạn có thể try cập được) 
Nếu bạn "đã đã mò mẫm hết mọi ngóc ngách của Dictionary" nhưng vẫn ko tìm được thì mình nghĩ nó đã được AutoCAD lưu ở môt variables nào đấy (private, protected hay internal chỉ có Acad.exe mới truy cập được) trong quá trình regeneration drawing, hay các task đại loại như thế. Do đó nếu bạn muốn làm việ này thì chỉ có cách đi lần theo các entity để tìm scalelist nào đang được sử dụng thôi. :D
 
1. AutoCAD lưu tất cả trong Dictionary (public - bạn có thể try cập được) 
1. AutoCAD lưu tất cả trong Dictionary (public - bạn có thể try cập được) 
Nếu bạn "đã đã mò mẫm hết mọi ngóc ngách của Dictionary" nhưng vẫn ko tìm được thì mình nghĩ nó đã được AutoCAD lưu ở môt variables nào đấy (private, protected hay internal chỉ có Acad.exe mới truy cập được) trong quá trình regeneration drawing, hay các task đại loại như thế. Do đó nếu bạn muốn làm việ này thì chỉ có cách đi lần theo các entity để tìm scalelist nào đang được sử dụng thôi. :D

 

2. Nếu bạn dùng được nghĩa là Autodesk đã export class đó sang ActiveX hay họ đã có lib để sử dụng class đó :)
1. AutoCAD lưu tất cả trong Dictionary (public - bạn có thể try cập được) 
Nếu bạn "đã đã mò mẫm hết mọi ngóc ngách của Dictionary" nhưng vẫn ko tìm được thì mình nghĩ nó đã được AutoCAD lưu ở môt variables nào đấy (private, protected hay internal chỉ có Acad.exe mới truy cập được) trong quá trình regeneration drawing, hay các task đại loại như thế. Do đó nếu bạn muốn làm việ này thì chỉ có cách đi lần theo các entity để tìm scalelist nào đang được sử dụng thôi. :D
 
Nếu bạn "đã đã mò mẫm hết mọi ngóc ngách của Dictionary" nhưng vẫn ko tìm được thì mình nghĩ nó đã được AutoCAD lưu ở môt variables nào đấy (private, protected hay internal chỉ có Acad.exe mới truy cập được) trong quá trình regeneration drawing, hay các task đại loại như thế. Do đó nếu bạn muốn làm việ này thì chỉ có cách đi lần theo các entity để tìm scalelist nào đang được sử dụng thôi. :D
2. Nếu bạn dùng được nghĩa là Autodesk đã export class đó sang ActiveX hay họ đã có lib để sử dụng class đó :)
1. AutoCAD lưu tất cả trong Dictionary (public - bạn có thể try cập được) 
Nếu bạn "đã đã mò mẫm hết mọi ngóc ngách của Dictionary" nhưng vẫn ko tìm được thì mình nghĩ nó đã được AutoCAD lưu ở môt variables nào đấy (private, protected hay internal chỉ có Acad.exe mới truy cập được) trong quá trình regeneration drawing, hay các task đại loại như thế. Do đó nếu bạn muốn làm việ này thì chỉ có cách đi lần theo các entity để tìm scalelist nào đang được sử dụng thôi. :D
2. Nếu bạn dùng được nghĩa là Autodesk đã export class đó sang ActiveX hay họ đã có lib để sử dụng class đó :)
1. AutoCAD lưu tất cả trong Dictionary (public - bạn có thể try cập được) 
Nếu bạn "đã đã mò mẫm hết mọi ngóc ngách của Dictionary" nhưng vẫn ko tìm được thì mình nghĩ nó đã được AutoCAD lưu ở môt variables nào đấy (private, protected hay internal chỉ có Acad.exe mới truy cập được) trong quá trình regeneration drawing, hay các task đại loại như thế. Do đó nếu bạn muốn làm việ này thì chỉ có cách đi lần theo các entity để tìm scalelist nào đang được sử dụng thôi. :D
2. Nếu bạn dùng được nghĩa là Autodesk đã export class đó sang ActiveX hay họ đã có lib để sử dụng class đó :)
  • 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ó bản vẽ kèm theo với tỷ lệ 1/1000. Các bác hộ mình với. Mình muốn thống kê diện tích các hatch theo layer (trong đó có cả layer 0 nhưng không có hatch) trong vùng giới hạn được bao bởi 2 đường polyline (LC Diahinh và 0) với độ cao đáy là 265 (độ cao này thay đổi) và tính theo tầng 10m. Ví dụ tầng 260, tầng 270...E xin cảm ơn.http://www.cadviet.c...ui_cad_viet.dwg


 

  • Vote giảm 3

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


×