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

anhcos

Nhà quảng cáo
  • Số lượng nội dung

    305
  • Đã tham gia

  • Lần ghé thăm cuối

  • Ngày trúng

    21

Bài đăng được đăng bởi anhcos


  1. Một Entity có các đặc điểm nhận dạng:

    - ObjectName: ứng với từng kiểu đối tượng,cho dù ở bất kỳ bản vẽ nào.

    - ObjectID: duy nhất tại thời điểm mở, thay đổi mỗi khi bản vẽ được mở lên.

    - Handle: duy nhất trong 1 bản vẽ, không thay đổi trong suốt thời gian sống của nó.

     

    Entity Name ở câu hỏi trên trong VBA chính là Handle của nó.

     

    Từ Handle, ta có thể lấy dữ liệu từ nó: ThisDrawing.HandleToObject(Handle)

    • Vote tăng 1

  2. Giả sử tập chọn có n đối tượng

     

    Dùng 2 vòng lặp lồng nhau, một cái chạy theo i = 1 .. n-1, cái kia chạy từ i+1 đến n để tránh trùng hợp.

    Dùng hàm IntersectWith để tìm giao giữa 2 đối tượng.

     

    IntersectWith Method

     

    Gets the points where one object intersects another object in the drawing.

     

    Signature

    RetVal = object.IntersectWith(IntersectObject' date=' ExtendOption)

     

    object: All Drawing Objects (Except Pviewport and PolygonMesh)

    The object or objects this method applies to.

     

    IntersectObject: Object, input-only;

    The object can be one of All Drawing Objects.

     

    ExtendOption: AcExtendOption enum; input-only

     

    This option specifies if none, one or both, of the objects are to be extended in order to attempt an intersection.

    acExtendNone

    Does not extend either object.

    acExtendThisEntity

    Extends the base object.

    acExtendOtherEntity

    Extends the object passed as an argument.

    acExtendBoth

    Extends both objects.

     

    RetVal

    Variant (array of doubles)

    The array of points where one object intersects another object in the drawing.

    Remarks

    If the two objects do not intersect, no data is returned. You can request the point of intersection that would occur if one or both of the objects were extended to meet the other. For example, in the following illustration, Line1 is the base object from which this method was called and line3 is the object passed as a parameter. If the ExtendOption passed is acExtendThisEntity, point A is returned as the point where line1 would intersect line3 if line1 were extended. If the ExtendOption is acExtendOtherEntity, no data is returned because even if line3 were extended, it would not intersect line1.

    If the intersection type is acExtendBothEntities and line2 is passed as the parameter entity, point B is returned. If the ExtendOption is acExtendNone and line2 is the parameter entity, no data is returned.

     

    More information:

    http://www.progecad.us/index.pl?iid=21577

    http://forums.autodesk.com/t5/Visual-Basic-Customization/intersectwith/td-p/1343013

    • Vote tăng 1

  3. Tôi thấy phần dữ liệu nên gom lại để trong 1 file riêng, có thể ở dạng text or dạng binary theo định dạng riêng của mình.

    Như thế chương trình tránh được sự lệ thuộc quá nhiều vào các chương trình ngoài. Nó sẽ linh hoạt hơn, vì trong trường hợp chương trình ngoài có lỗi mà ta không kiểm soát được thì chương trình của ta sẽ đứng mà đợi...

     

    Hầu như các chương trình lớn đều có dữ liệu theo định dạng riêng của mình, sau đó có thêm tool để chỉnh sửa dữ liệu đó.

     

    Còn phần chương trình thì tùy theo sở trường mà làm thôi.

    • Vote tăng 2

  4. Đây là bài toán tối ưu hóa (2 chiều) nên cực khó, cho dù có viết bằng ngôn ngữ nào.

     

    Có thể sử dụng thư viện Solver của Microsoft để tính, nhưng chả dễ dàng tí nào.

     

    Nếu toàn là hình chữ nhật thì dùng chương trình này, việc nhập liệu thông qua textfile hơi mất công.

    Nếu hên thì có thể tìm thấy source code bằng Delphi đó:

     

    cutlist4.gif

    http://www.delphifor...ams/CutList.htm


  5. Bài này kiểu như lý thuyết đồ thị và tìm đường đi ngắn nhất, khi mô hình hóa các line thành một cây, ta có thể tìm đường đi từ node này đến node khác.

    Trước đây tôi toàn dùng kiểu con trỏ, rất dễ làm, mà giờ nếu sử dụng họ Visual basic thì phải triển khai dữ liệu kiểu khác.


  6. Đã cập nhật mới link tải về, nhớ đừng hỏi link ở đâu nhé. :)

     

    - Sẵn bonus thêm một User Control - NumericAcad giúp lấy số thực từ Acad.

    Em này kế thừa từ Control NumericUpDown, nên thừa hưởng tất cả các thuộc tính và thành phần của cha nó.

    Ngoài ra còn đo khoảng cách hoặc lấy chiều dài Arc, Circle, Line, Polyline, số trong Text và Mtext, kích thước/nội dung của Dimesion đưa vào điều kiểm này.

     

    7507005702_f753620ffe.jpg


  7. Hi AnhCos! Mình đang dùng tool của bạn cho ứng dụng của mình. Nói chung là ổn và tuyệt. Mình xin góp ý bạn có thể add thêm array đối tượng nữa là tuyệt. Cảm ơn share của bạn.

     

    Đã thêm lệnh tạo đối tượng mảng cho đối tượng: ArrayPolar và ArrayRectangle.

     

    Cách sử dụng:

     

    'Tạo đối tượng mà không thêm vào khung thể hiện

    dim ent as TEntityData = CreateCircle(0,0,1)

     

    + Entity.ArayPolar(NumberOfObjects, AngleToFill, CenterPoint)

    'array thành 16 đối tượng, góc quay tổng 3*pi/2, tâm quay (12,8)

    dim ents() as TEntityData = ent.ArrayPolar(16 , 3*pi/2, 12, 8)

    'thêm vào khung thể hiện

    Add(ents)

     

    hoặc viết tắt:

    Add(ent.ArrayPolar(16 , 3*pi/2, 12, 8))

     

    + Entity.ArrayRectangular (NumberOfRows, NumberOfColumns, DistBetweenRows, DistBetweenColumns)

    'array 2 chiều, 4 hàng, 5 cột ...

    Add(ent.ArrayRecTangle(4,5,1.3,2.85))

    • Vote tăng 1

  8. Tình hình là em đang có nhu cầu vẽ các đường ống hơi-khí nén trong nhà máy.Dạng 3D giả, coi thì thấy 3D thôi, chứ ko có xoay vòng vòng được.

    Em cũng còn non kinh nghiệm, được các anh trong cty cho cái bản vẽ như File đính kèm, nhưng ko có chỉ cách vẽ.Em vẽ từng nét từng nét thì mệt quá.KO biết có phải đó là do vẽ bằng phần mềm khác rồi chuyển qua hay ko.Có anh nào biết vẽ giống bản vẽ này, chỉ cho em với nha.Em cám ơn rất nhiều

     

    Tìm chương trình Autodesk Plant Design Suite mà xài.

    3D thực, có giải quyết đụng chạm và tìm đường đi hợp lý từ sơ đồ nguyên lý.

    Vẽ xong có thể sửa, có thể "đi bộ" qua hệ thống.

     

    Xem thêm:

    • Vote tăng 2

  9. .Chương trình này trước đây tôi đã làm cho một công ty, có các chức năng chính:

     

    - Chèn tự động, tự tìm và xóa, kiểm tra COG, PROP (FF, NF), LIFTER ... trên sub-drawing và cả trên elevation drawing.

    - Tách evelavtion drawing thành các sub-drawing

    - Cập nhật thông số gross area, net area, volume, mass, perimeter bar, main reinforcement, grade 28day, elevation number, view looking, cog x, cog y cho sub-drawing và elevation-drawing.

    Trong trường hợp chọn nhiều panel khác nhau, các panel chính và các penetrate của nó sẽ được xác định tự động. Các LIFTER cũng tương tự, sẽ tự tính số lượng và nơi cần đặt.


  10. Hướng dẫn sử dụng tập chọn đối tượng có trong thư viện:

     

    Tập chọn đối tượng của acad rất mạnh và dễ tùy biến, tuy nhiên việc triển khai hơi mất công sức một chút.

    Vì thế rút gọn được phần này sẽ đỡ mất thời gian hơn.

     

    Trong thư viện sử dụng lớp TFilterSet để chọn đối tượng trong acad.

     

    * Cách khai báo:

    - TFilterSet(mảng_tên_các_đối_tượng() as string) 'không quan tâm đến tên của tập chọn

    - hoặc TFilterSet(Tên_tập chọn as string, mô_tả as string, mảng_tên_các_đối_tượng() as string)

     

    VD:

    - Tạo tập chọn Line và Text

    Dim fs as New TFilterSet(new string(){"Line","Text"})

    - Tạo tập chọn MText và Block có tên là "tập chọn a"

    Dim fs as New TFilterSet("tap chon a", "tap chon vd", new string(){"Insert", "Mtext"})

     

    * Để kết hợp dùng thêm Layer khi chọn, sử dụng hàm SetFilter(layers() as tring) như sau:

    Dim fs as New TFilterSet(new string(){"Line","Text"})

    fs.SetFilter(new string(){"0","Center"})

    Sẽ chọn Line và Text nằm trong layer "0" và "Center"

     

    *Để kết hợp với TextStyle, sử dụng hàm SetFilter(layers() as tring, textstyles() as string) như sau:

    Dim fs as New TFilterSet(new string(){"Line","Text"})

    fs.SetFilter(new string(){"0","Center"}, new string(){"UNI"})[/code]

    Sẽ chọn Line và Text nằm trong layer "0" và "Center", Text phải thuộc textstyle có tên là UNI

     

    * Để chọn theo tên Block, dùng hàm SetBlock(blocks() as string)

    Dim fs as New TFilterSet(new string(){"Line","INSERT","Text"})
    fs.SetFilter(new string(){"0","Center"}, new string(){"UNI"})
    fs.SetBlock(new string(){"Abc","Def","GGH"})

    Sẽ chọn Line, Text, BlockRef trong layer 0 và Center, texstyle UNI, block có tên "Abc" or "Def" or"GGH".

     

    * Chọn đối tượng

    Gọi hàm SelectOnScreen(Dwg as Object, SelectionSet as Object, Optional Clear as Boolean = True) hoặc

    SelectAll(Dwg as Object, SelectionSet as Object, Optional Clear as Boolean = True)

     

    Trong đó:

    Hàm sẽ trả về True nếu có đối tượng được chọn

    - Dwg là biến đại diện cho bản vẽ

    - SelectionSet là biến đại diện cho tập chọn sẽ được tạo ra trong bản vẽ

    - Clear: xóa tập chọn trước khi bắt đầu chọn mới

     

    VD:

    if Acad_link() then
    ...Dim selset as Object
    ...Dim fs as New TFilterSet(new string(){"Line","Text"})
    
    ...if fs.SelectOnScreen(acad.ActiveDocument, selset) then
    ......'neu co doi tuong duoc chon
    ......'xu ly no....
    ......Dim i%
    ......for i=0 to selset.Count -1
    ......next i
    ...end if
    end if
    

     

    hoặc đơn giản hơn có thể dùng bằng như sau:

    if Acad_link() then
    ...Dim selset as Object
    
    ...If New TFilterSet(New String() {"Line","Text"}).SelectOnScreen(Acad.ActiveDocument, SelSet) Then
    ......Dim i%
    ......for i=0 to selset.Count -1
    ......next i
    ...End If
    End if

     

    Lưu ý:

    Tập chọn chỉ dùng theo các tên thực thể, layer, textstyle, block name, các kiểu lọc theo các tính chất khác chưa có trong phiên bản này, VD như lọc theo màu, dimstyle ... hoặc áp dụng lọc tùy chọn của người dùng

    • Vote tăng 4
×