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. qua VB.Net bạn không nên dùng On error resume next nữa mà nên dùng cú pháp Try Catch End Try để bắt lỗi.

     

    VD: Khởi động và liên kết với GCAD Star, AutoCAD cũng tương tự:

     

    DIm CadApp as Object

    Try

    CadApp = GetObject(,"GCAD.Application")

    Catch

    CadApp = CreateObject("GCAD.Application")

    End try

     

    Mặc định bản Acad/Gcad sẽ không hiển thị, vì thế phải dùng lệnh CadApp.Visible = True sau đó.

     

    Trong khi chạy thử, bạn đã vô tình tạo ra một số phiên (session) của Cad chạy ở background, nên cái dòng GetObject kia sẽ liên kết với phiên đang ẩn --> Đã có liên kết nhưng bạn không trông thấy được.

     

    Dùng TaskManager đóng hết các session đang chạy của CAD. rồi chạy lại.

     

    Bài hướng dẫn VB.NET cho AutoCAD ở đây, tất cả đều áp dụng được cho GCAD.

    • Vote tăng 1

  2. ======================================================================

    Với VB6 : thì toàn bộ các biến liên quan đến CAD em đều khai báo Object

    Ví dụ

    Dim AcadApp as Object

    ======================================================================

     

    Nếu VB6 như thế thì VB.NET bạn cũng dùng như thế.

    Đừng import các thư viện của CAD vào, như vậy sẽ chạy với mọi phiên bản AutoCAD và đặc biệt là với GCAD luôn.

    • Vote tăng 1

  3. Các bác cho e hỏi xí về VBA,e muốn offset các đối tượng sau khi mirror mà sao không thực hiện dc nhỉ

     

    b as acadline

    a as variant

    c as variant

     

    a = b.mirror(A1,B1)

    c= a.offset (5)

     

    'cho em hoi tai sao cad không vẽ được đường thẳng c ạ,tương tự thế sao e không set layer cho đối tượng c được ạ.Cảm ơn các bác

     

    Đoạn lệnh này mình không thấy gì có lỗi.

     

    Có những đối tượng sau khi offset thì chia thành nhiều đối tượng con, vì thế c là mảng các đối tượng sau khi offset.

    Bạn kiểm tra số lượng các đối tượng và thay đổi giá trị

    VD:

    c(0).Layer = "cadviet"

     

    Tổng quát hơn

    for i=0 to ubound©

    c(i).Layer ="0"

    next i

    • Vote tăng 1

  4. 3. Vì có thể đọc được code của nó. E ví dụ ở đây là 1 số hàm check lience code dạng Boolean, kết quả trả về True or Flase.

    Có khi nào "đè" được nó thành hàm luôn luôn trả True ?

     

    Nếu sử dụng private thì khó mà bị ghi đè, tuy nhiên phần kết quả trả về như bạn nói vẫn có thể thay đổi được bằng kỹ thuật patch (không cần biết đè hay không)

    Nói chung, ứng dụng là để dùng và bảo mật là tránh mấy kẻ tò mò, còn gặp thợ thì cũng thua.


  5. chendoituong.png

    Chen doi tuong

    Đã xong cho bạn đây rồi, nhưng nhớ đừng hỏi về spline nhé, hơi khó làm.

    Với cái tiêu đề không biết số lượng có quá nhiều không, vì nhiều thì chưa biết chương trình chạy có nổi không?

    Bạn có thể gởi một cái file gốc chứa kha khá đối tượng để test thử xem như thế nào.

    • Vote tăng 2

  6. Mình cũng góp vui một tí với chương trình của mình: http://www.mediafire...322fdncyewgrfut

     

    Chương trình cho phép:

    - Mỗi lần có thể chọn nhiều đối tượng, mỗi lần nên chọn cỡ 10 tập là được, càng chọn nhiều càng chậm.

    - Chọn theo window, các đối tượng thừa sẽ không được tính đến

    - Tự xác định tập và điểm quay của tập đó.

    - Xem trước các thay đổi tương ứng với góc nhập vào


  7. 1. Bạn hỏi cái này trong VBA, vậy liệu có phải là nhầm chủ đề rồi không?

    2. Nếu bình thuờng thì cứ bắt điểm vuông góc (per) thôi.

     

    Đoạn này người ta hỏi về VBA, bạn lấy CAD ra trả lời.

     

    Em thì không biết gì về VBA, nhưng mà có vô số đường vuông góc chung với 2 đường này. Bởi vì đường vuông góc ấy chính là giao tuyến của hai mặt phẳng, mỗi mặt phẳng trong đó lấy lần lượt d1 d2 làm pháp tuyến.

    Mặt phẳng vuông góc với d1 có phương trình là :

    0x+50y-50z+D1=0

    Mặt phẳng vuông góc với d2 có phương trình là:

    25x+25y+50z+D2=0

    Đường thẳng cần tìm có phương trình là:

    0x+50y-50z+D1=0 và 25x+25y+25z+D2=0. Từ đây có thể dựng nó qua 2 điểm tìm được từ phương trình trên!

     

    Đoạn này hỏi về CAD, bạn lại đem cái khác ra.

    2 phương trình 3 ẩn x,y,z nói chung là khó giải lắm.

    • Vote tăng 1

  8. Cám ơn anh em đã nhiệt tình giúp đỡ. Mình sẽ nghiên cứu sub về đường thẳng. nhưng vấn đề khó khăn ở đây là đường tròn và spline, cái này không biết anh em nào đã thử làm chưa cho mình tham khảo thuật toán cùng với. xin chân thành cám ơn anh em rất nhiều!

     

    SPLine thì mình chưa nghiên cứu, còn elip, đường tròn, point, line thì mình đã và đang làm.

     

    Đã dịch thành thư viện, tải ở đây: anhcos.geometry.dll. (viết bằng C#)

    Lưu ý: đây là bản đang phát triển, nên vẫn còn lỗi...

     

    Cách dùng:

     

    - Từ VB: dùng từ khóa Declare để import các cấu trúc dữ liệu từ dll. Cái này tự nghiên cứu, mình không rành.

     

    - Từ VS:

    Chèn vào đầu file

     

    Imports Anhcos.Geometry

    hoặc using Anhcos.Geometry

     

    Các kiểu dữ liệu trong thư viện

     

    PointD: cấu trúc điểm trong 3D

    Vector: thông tin về vector, tính tích vô hướng, có hướng

    Line:

    Plane: Mặt phẳng

    Circle

    Ellipse

     

    VD: Tìm hình chiếu G của M trên đường thẳng L

     

    Dim M as new Point(Mx,My,Mz)

    Dim L as new Line(LineObj.StartPoint,LineObj.EndPoint)

     

    Dim G as PointD = M.Project(L) 'hình chiếu của M trên L

     

    VD: Tìm hình chiếu G của M trên mặt phẳng chứa đường tròn C

     

    Dim M as new Point(Mx,My,Mz)

    Dim C as new Circle(CircleObj.Normal, CircleObj.Center, CircleObj.Radius)

     

    Dim G as PointD = M.Project© 'hình chiếu của M trên C

     

    Một đoạn code trong thư viện:

    /// <summary>Cấu trúc điểm trong hệ tọa độ 3 chiều</summary>
       	public class PointD
       	{
           	/// <summary>Hoành độ của điểm</summary>
           	public double X;
           	/// <summary>Tung độ của điểm</summary>
           	public double Y;
           	/// <summary>Cao độ của điểm</summary>
           	public double Z;
    
           	/// <summary>Khởi tạo với 3 phần tử X,Y,Z đều bằng 0</summary>
           	public PointD()
           	{
               	X = Y= Z = 0;      	
           	}
    
           	/// <summary>Khởi tạo giá trị cho một điểm</summary>
           	public PointD(Single X, Single Y, Single Z)
           	{
               	this.X = (double)X;
               	this.Y = (double)Y;
               	this.Z = (double)Z;
           	}
    
           	/// <summary>Khởi tạo giá trị cho một điểm 2D</summary>
           	public PointD(Single X, Single Y)
           	{
               	this.X = (double)X;
               	this.Y = (double)Y;
               	this.Z = 0;
           	}
    
           	/// <summary>Khởi tạo giá trị cho một điểm</summary>
           	public PointD(double X, double Y, double Z)
           	{
               	this.X = X;
               	this.Y = Y;
               	this.Z = Z;
           	}
    
           	/// <summary>Khởi tạo giá trị cho một điểm 2D</summary>
           	public PointD(double X, double Y)
           	{
               	this.X = X;
               	this.Y = Y;
               	this.Z = 0;
           	}
    
           	/// <summary>Khởi tạo giá trị cho một điểm khi biết tham số t của đường thẳng</summary>
           	public PointD(Line L, double t)
           	{
               	X = L.M0.X + L.Normal.A * t;
               	Y = L.M0.Y + L.Normal.B * t;
               	Z = L.M0.Z + L.Normal.C * t;
           	}
    
           	/// <summary>Khởi tạo giá trị cho một điểm khi biết tham số t của đường thẳng, 1 điểm trên đường thẳng và vector chỉ phương</summary>
           	public PointD(Vector Normal, PointD M0, double t)
           	{
               	X = M0.X + Normal.A * t;
               	Y = M0.Y + Normal.B * t;
               	Z = M0.Z + Normal.C * t;
           	}
    
           	/// <summary>Nhập tọa độ từ một biến có kiểu tọa độ của AutoCAD, là mảng 3 phần tử X,Y,Z</summary>
           	public PointD(object AcadPointD)
           	{
               	try
               	{
                   	double[] pts = (double[])AcadPointD;
                   	X = pts[0];
                   	Y = pts[1];
                   	Z = pts[2];
               	}
               	catch
               	{
                   	X = Y = Z = 0;
               	}            	
           	}
    
           	/// <summary>So sánh trùng 2 điểm</summary>
           	public static bool operator ==(PointD P1, PointD P2)
           	{
               	return (P1.X == P2.X && P1.Y == P2.Y && P1.Z == P2.Z);
           	}
    
           	/// <summary>So sánh không trùng 2 điểm</summary>
           	public static bool operator !=(PointD P1, PointD P2)
           	{
               	return !(P1.X == P2.X && P1.Y == P2.Y && P1.Z == P2.Z);
           	}
    
           	/// <summary>So sánh trùng 2 điểm</summary>
           	public override bool Equals(object obj)
           	{
               	PointD P2 = (PointD)obj;
               	return (X == P2.X && Y == P2.Y && Z == P2.Z);
           	}
    
           	/// <summary>Hàm băm</summary>
           	public override int GetHashCode()
           	{
               	return base.GetHashCode();
           	}
    
           	/// <summary>Tổng của 2 điểm</summary>
           	public static PointD operator +(PointD P1, PointD P2)
           	{
               	return new PointD(P1.X + P2.X, P1.Y + P2.Y, P1.Z + P2.Z);
           	}
    
           	/// <summary>Hiệu của 2 điểm</summary>
           	public static PointD operator -(PointD P1, PointD P2)
           	{
               	return new PointD(P1.X - P2.X, P1.Y - P2.Y, P1.Z - P2.Z);
           	}
    
           	/// <summary>Nhân một điểm với một số</summary>
           	public static PointD operator *(double K, PointD P)
           	{
               	return new PointD(K * P.X, K * P.Y, K * P.Z);
           	}
    
           	/// <summary>Nhân một điểm với một số</summary>
           	public static PointD operator *(PointD P,double K)
           	{
               	return new PointD(K * P.X, K * P.Y, K * P.Z);
           	}
    
           	/// <summary>Chia một điểm với một số</summary>
           	public static PointD operator /(PointD P, double K)
           	{
               	return new PointD(P.X / K, P.Y / K, P.Z / K);
           	}
    
           	/// <summary>Khoảng cách giữa 2 điểm</summary>
           	public double Distance(PointD P)
           	{
               	return System.Math.Sqrt((X - P.X) * (X - P.X) + (Y - P.Y) * (Y - P.Y) + (Z - P.Z) * (Z - P.Z));
           	}
    
           	/// <summary>Khoảng cách giữa nó đến một đường thẳng</summary>
           	public double Distance(Line L)
           	{
               	return L.Distance(this);
           	}
    
           	/// <summary>Khoảng cách giữa nó đến một mặt phẳng</summary>
           	public double Distance(Plane PL)
           	{
               	return PL.Distance(this);
           	}
    
           	/// <summary>Hình chiếu của nó lên một đường thẳng</summary>
           	/// Sử dụng mảng để tương thích
           	public PointD[] Project(Line L)
           	{
               	//Giao điểm G giữa đường thẳng L với đường thẳng qua điểm này và vuông góc với L
               	//G thuộc L --> xG = xL0 + At, yG = yL0 + Bt, zg = zL0 + Ct
               	//Gọi d là khoảng cách từ điểm đến đường thẳng
               	//d^2 = (xG - x0)^2 + (yG - y0)^2 + zG - z0)^2 = this.Distance(L)   		[1]
               	//Thay xG, yG, zG vào phtr [1] -->
               	//(xL0 + At - x0)^2 + (yL0 + Bt - y0)^2 + (zL0 + Ct - z0)^2 --> sau khi khai triển ta có phương trình bậc 2 ẩn t có 3 hệ số A, B, C
               	double A = L.Normal.A * L.Normal.A + L.Normal.B * L.Normal.B + L.Normal.C * L.Normal.C;
               	double B = 2 * (L.Normal.A * (L.M0.X - X) + L.Normal.B * (L.M0.Y - Y) + L.Normal.C * (L.M0.Z - Z));
               	double C = (L.M0.X - X) * (L.M0.X - X) + (L.M0.Y - Y) * (L.M0.Y - Y) + (L.M0.Z - Z) * (L.M0.Z - Z) - Distance(L);
    
               	Math.QuadraticEquation eq2 = new Math.QuadraticEquation(A, B, C);
               	double[] nghiem = eq2.Solve();
    
               	if (nghiem != null)
               	{
                   	if (nghiem.Length == 1) return new PointD[] { L.GetPoint(nghiem[0]) };
                   	else return new PointD[] { L.GetPoint(nghiem[0]), L.GetPoint(nghiem[1]) };
               	}
    
               	return null;
           	}
    
           	/// <summary>Hình chiếu của nó lên một mặt phẳng</summary>
           	/// Sử dụng mảng để tương thích
           	public PointD[] Project(Plane PL)
           	{
               	//đường thẳng nối điểm này và điểm hình chiếu sẽ cùng phương với cevtor chỉ phương của mặt phẳng
               	Line L = new Line(PL.Normal, this);
    
               	PointD[] Intersects = L.IntersectWith(PL);
    
               	if (Intersects != null) return Intersects;
    
               	return null;
           	}
    
           	/// <summary>Di chuyển thêm một đoạn</summary>
           	public void Move(double dX, double dY, double dZ)
           	{
               	X += dX;
               	Y += dY;
               	Z += dZ;
           	}
    
           	/// <summary>Di chuyển thêm một đoạn</summary>
           	public void Move(PointD delta)
           	{
               	X += delta.X;
               	Y += delta.Y;
               	Z += delta.Z;
           	}
    
           	/// <summary>Sao chép điểm qua một biến mới</summary>
           	public PointD Copy()
           	{
               	return new PointD(X, Y, Z);
           	}
    
           	/// <summary>Quay 3D một điểm quanh 1 điểm khác, tức là quay nó quanh đường thẳng vuông góc với mặt phẳng xOy
           	/// Tọa độ Z sẽ không thay đồi</summary>                	
           	public void Rotate(PointD Center, double Angle)
           	{
               	//Sử dụng công thức
               	//x' = (x - a) * cosA - (y - B) * sinA + a
               	//y' = (x - a) * sinA + (y - B) * cosA + b
               	//Với tâm quay I (a,B) và góc quay A
               	double temp_X = (X - Center.X) * System.Math.Cos(Angle) - (Y - Center.Y) * System.Math.Sin(Angle) + Center.X;
               	Y = (X - Center.X) * System.Math.Sin(Angle) - (Y - Center.Y) * System.Math.Cos(Angle) + Center.Y;
               	X = temp_X;
    
               	//Góc hiện tại giữa điểm này và điểm tâm
               	//double this_ang = System.Math.Atan2(Y - Center.Y, X - Center.X);
    
               	//this_ang += Angle;
    
               	//double this_radius = System.Math.Sqrt((X - Center.X) * (X - Center.X) + (Y - Center.Y) * (Y - Center.Y) + (Z - Center.Z) * (Z - Center.Z));
               	//X = Center.X + this_radius * System.Math.Cos(this_ang);
               	//Y = Center.Y + this_radius * System.Math.Sin(this_ang);
           	}
    
           	/// <summary>Quay 3D một điểm quanh đường thẳng qua 2 điểm</summary>
           	public void Rotate(PointD P1, PointD P2, double Angle)
           	{
               	Rotate(new Line(P1, P2), Angle);
           	}
    
           	/// <summary>Quay 3D một điểm quanh 1 đường thẳng</summary>
           	public void Rotate(Line L, double Angle)
           	{
               	//Trình tự tạm thời như sau:
               	// 1. Tìm điểm tâm quay nằm trên đường thẳng
               	// 2. Trải phẳng điểm này tương đối so với tâm quay đã chuyển về (0,0)
               	// 3. Quay phẳng nó trong mp xOy
               	// 4. Chiếu M trở lại mp vòng tròn quay ban đầu
               	// 5. Dời theo điểm quay để lấy lại tọa độ cũ
    
               	// 1. Tìm điểm tâm quay nằm trên đường thẳng
               	PointD[] centers = Project(L);
    
               	// 2. Trải phẳng điểm này tương đối so với tâm quay đã chuyển về (0,0)
               	PointD M = new PointD(this - centers[0]);
               	M = M.To2DPoint();
    
               	// 3. Quay phẳng nó trong mp xOy
               	M.Rotate(new PointD(0, 0, 0), Angle);
    
               	// 4. Chiếu M trở lại mp vòng tròn quay ban đầu
               	Plane PL = new Plane(L.Normal, centers[0]);
               	PointD[] Mps = M.Project(PL);
    
               	// 5. Dời theo điểm quay để lấy lại tọa độ cũ
               	Mps[0] += centers[0];
    
               	X = Mps[0].X;
               	Y = Mps[0].Y;
               	Z = Mps[0].Z;
           	}
    
           	/// <summary>Đối xứng trong không gian qua 1 đường thẳng, tức là đối xứng qua mặt phẳng chứa đường thẳng 
           	/// và có vector pháp tuyến đi qua điểm này và điểm hình chiếu của nó trên đường thẳng</summary>
           	public PointD Mirror(double X1, double Y1, double Z1, double X2, double Y2, double Z2)
           	{
               	return Mirror(new Line(new PointD(X1, Y1, Z1), new PointD(X2, Y2, Z2)));
           	}
    
           	/// <summary>Đối xứng trong không gian qua 1 đường thẳng, tức là đối xứng qua mặt phẳng chứa đường thẳng 
           	/// và có vector pháp tuyến đi qua điểm này và điểm hình chiếu của nó trên đường thẳng</summary>
           	public PointD Mirror(PointD P1, PointD P2)
           	{
               	return Mirror(new Line(P1, P2));
           	}
    
           	/// <summary>Đối xứng trong không gian qua 1 đường thẳng, tức là đối xứng qua mặt phẳng chứa đường thẳng 
           	/// và có vector pháp tuyến đi qua điểm này và điểm hình chiếu của nó trên đường thẳng</summary>
           	public PointD Mirror(Line L)
           	{
               	try
               	{
                   	//Hình chiếu của nó trên đường thẳng
                   	PointD[] ProjectPointD = Project(L);
                   	//Độ lệch giữa chúng
                   	PointD delta = ProjectPointD[0] - this;
                   	//Di chuyển đến vị trí mới
                   	ProjectPointD[0].Move(delta);
    
                   	return ProjectPointD[0];
               	}
               	catch { };
    
               	return null;
           	}
    
           	/// <summary>Đối xứng trong không gian qua mặt phẳng</summary>
           	public PointD Mirror(PointD P1, PointD P2, PointD P3)
           	{
               	return Mirror(new Plane(P1, P2, P3));
           	}
    
           	/// <summary>Đối xứng trong không gian qua mặt phẳng</summary>
           	public PointD Mirror(Plane PL)
           	{
               	try
               	{
                   	//Hình chiếu của nó trên mặt phẳng
                   	PointD[] ProjectPointD = Project(PL);
                   	//Độ lệch giữa chúng
                   	PointD delta = ProjectPointD[0] - this;
                   	//Di chuyển đến vị trí mới
                   	ProjectPointD[0].Move(delta);
    
                   	return ProjectPointD[0];
               	}
               	catch { };
    
               	return null;
           	}
    
           	/// <summary>Chuyển thành kiểu dữ liệu PointF của Windows</summary>
           	public System.Drawing.PointF ToPointF()
           	{
               	return new System.Drawing.PointF((float)X, (float)Y);
           	}
    
           	/// <summary>Chuyển thành điểm phẳng, là phép khử Z</summary>
           	public PointD To2DPoint()
           	{
               	//Hình chiếu của M trên mp xOy là Mz, góc giữa OMz và Ox là
               	double a1 = System.Math.Atan2(Y, X);
               	//Khoảng cách từ M --> O
               	double radius = System.Math.Sqrt(X * X + Y * Y + Z * Z);
               	//Tọa độ M' khi quay M đến mp xOy là
    
               	return new PointD(radius * System.Math.Cos(a1), radius * System.Math.Sin(a1), 0);
           	}
    
           	/// <summary>Xuất tọa độ thành chuỗi có dạng (X, Y, Z)</summary>
           	public override string ToString()
           	{
               	return "(" + X + ", " + Y + ", " + Z + ")";
           	}
    
           	/// <summary>Xuất tọa độ thành chuỗi có dạng (X.digit, Y.digit, Z.digit)</summary>
           	public string ToString(int Digit)
           	{
               	return "(" + System.Math.Round(X, Digit) + ", " + System.Math.Round(Y, Digit) + ", " + System.Math.Round(Z, Digit) + ")"; 
           	}
       	}
    

    • Vote tăng 1

  9. Các bác cho em hỏi có cách nào vẽ một đường thẳng từ một điểm cho trước vuông góc với một đối tượng(Line, Spline,Pline...) không ah?

     

    VD tìm điểm vuông góc với đường thẳng:

     

    - Bài toán tổng quát trong không gian 3 chiều:

     

    Gọi G là giao điểm vuông góc giữa đường thẳng qua M và đường thẳng có sẵn L.

     

    G thuộc L --> phương trình tham số của L(t)

    xG = StartPoint(0) + A*t

    yG = StartPoint(1) + B*t

    zG = StartPoint(2) + C*t

    với (A,B,C) là vector chỉ phương của L, sử dụng thuộc tính L.Normal để xác định.

     

    Gọi d là khoảng cách từ điểm M đến đường thẳng L

    d^2 = (xG - xM)^2 + (yG - yM)^2 + (zG - zM)^2 [pt (1)]

     

    Thay 3 tham số trên vào pt (1) --> phương trình bậc 2, ẩn là tham số t.

    thay t vào 3 phương trình trên --> tọa độ G.

     

    - Trong 2D:

    Đường L có vector chỉ phương L.Normal (A, B ) và qua điểm L.StartPoint

    Đường vuông góc có vector chỉ phương (-B,A) và qua điểm M (tích vô hướng = 0)

    G là giao của 2 đường --> giải là xong


  10. Để đọc toạ độ của pline thì không còn là vấn đề nan giải, nhưng nhận diện tên đỉnh của nó thì đúng là khó thật. Nếu lấy tiêu chí là text gần đỉnh nhất thì cũng hơi chủ quan, nhưng mà ngoài cái đó ra, em không nghĩ ra một thuật toán nào khác :)

     

    Tôi cũng nghĩ như vậy, tìm text gần đỉnh nhất là được rồi.


  11. Cả tôi với bạn cùng sai rồi.

     

    Chỉnh như thế này mới đúng, đầu vào của hàm phải là một đối tượng Block để ta có thể duyệt qua từng đối tượng con, và block con sẽ là BlockReference

     

    Function Dem(block as AcadBlock) as Integer
    'Duyệt qua từng đối tượng xem nó có phải là Block con hay không
    Dim i as Integer
    Dim SoLuong as Integer
    Dim SubBlock as Object
    
    For i=0 to block.Count-1
     if block.Item(i).ObjectName = "AcDbBlockReference"
           'Tìm block tương ứng với BlockRef này
       	SubBlock = block.Document.Blocks(block.Item(i).Name)
    
     SoLuong = SoLuong + Dem(SubBlock)
     Else 'không phải Block
    	SoLuong = SoLuong + 1
     End if
    Next i
    
    Dem = SoLuong
    End Function

     

    Hoặc đầu vào của hàm là BlockReference

    Function Dem(blockref as AcadBlockReference as Integer)
    'Tìm block tương ứng với BlockRef này
    Dim block = blockref.Document.Blocks(blockref.Name)
    
    'Duyệt qua từng đối tượng xem nó có phải là Block con hay không
    Dim i as Integer
    Dim SoLuong as Integer
    Dim SubBlock as Object
    
    For i=0 to block.Count-1
     if block.Item(i).ObjectName = "AcDbBlockReference
           'Tìm block tương ứng với BlockRef này
           SubBlock = block.Document.Blocks(block.Item(i).Name)
           SoLuong = SoLuong + Dem(block.Item(i))
     Else 'không phải Block
    	SoLuong = SoLuong + 1
     End if
    Next i
    
    Dem = SoLuong
    End Function

     

    • Vote tăng 2

  12. Trong video và file bản vẽ kèm theo, một đường bao chính đại diện cho vùng đất đắp, với đường trên cùng là mặt đường, có chỉ định vị trí và cao độ tâm đường.

    Sau đó phân lớp theo từng lát có độ dày theo yêu cầu.

    Kết quả tính toán xuất qua diện tích phần bên trái bên phải của từng phân lớp, cao độ bên trái và fai của phân lớp.

     

    Ý sơ bộ mình thấy là như thế. Bạn có thể chỉnh lại cho phù hợp.

    Mọi trao đổi có thể tiến hành qua 4r cũng dc.


  13. Cách sử dụng tlbimp.ex:

    Đây là tiện tích của VS, nằm đâu đó trong thư mục cài đặt của microsoft visual studio, search là ra ngay thôi.

    Cách sử dụng từ ms: http://msdn.microsoft.com/en-us/library/tt0cf3sx%28VS.80%29.aspx

    Sử dụng trực tiếp từ Command Line của windows.

     

    .NET reflector là công cụ dịch ngược file .NET, hỗ trợ dịch ngược .exe, .dll. Bản này tìm và tra cứu trên google có rất nhiều.

    Khi cài đặt cần thêm addon FileDisassembler mới dịch ngược được.


  14. Chào Bác! Em imports 2 file của bác vào thì được nhưng khi chạy thì lại báo lỗi không nhận file. Mà cái này Bác viết trên nền net1.0 à. Lúc Add vào nó báo phải thay đổi version của net framework.

     

    2 thư viện này là trích xuất từ 2 thư viện chuẩn của AutoCAD:

    - AutoCAD.dll trích xuất ra từ AutoCAD 17 Type Library

    - AXDBLib.dll trích xuất ra từ AutoCAD/ObjectDBX 17 Common Type Library

     

    Để trích xuất, bạn dùng command line của windows, tìm đến file tlbimp.exe để xuất thư viện TLB --> DLL.

    Bạn có thể dùng .NET reflector để lấy mã nguồn dạng VB/C# từ thư viện dll kia luôn. Từ đó về sau có thể dùng các thư viện mã nguồn chèn trực tiếp vào chương trình mà không cần add bất kỳ thư viện nào nữa.


  15. Hề hề! Em lại làm phiền các Bác chút.

    Em gạp sự cố với hatch với code sau

    Dim OuterLoop(0 To 0) As Object

    OuterLoop(0) = plineObj

    Add_plHatch = AcadApp.ActiveDocument.ModelSpace.AddHatch(0, hName, True)

    Add_plHatch.AppendOuterLoop(OuterLoop)

    bị lỗi "Invalid object array" thật bó tay với cái .net này.

     

    Lỗi này rất khó hiểu, mà không có cách giải quyết.

     

    Bạn dùng cách sau xem sao:

    Chèn thư viện đối tượng của CAD mà mình đã trích xuất qua dạng dll ở đây, bao gồm AutoCAD.DLL và AXDBLib.dll.

    2 thư viện này copy vào cùng chỗ với chương trình đã biên dịch.

     

    Lúc đó trong chương trình mình sẽ dùng code giống như chèn thư viện chuẩn của CAD vậy.

     

    Như VD trên sẽ viết lại, theo kiểu thực thi giao diện:

     

    Imports AutoCAD

    Imports AXDBLib

    ...

    ...

    Dim AcadApp as IAcadApplication

    ...

    Dim plineObj as IAcadPolyline

    ...

    Dim OuterLoop(0 To 0) As IAcadEntity

    OuterLoop(0) = plineObj

     

    Dim Add_plHatch as IAcadHatch = AcadApp.ActiveDocument.ModelSpace.AddHatch(0, hName, True)

    Add_plHatch.AppendOuterLoop(OuterLoop)

×