一DWG文件,编程根据状态改变对应的图形(如颜色),怎么弄?高分相送。

解决方案 »

  1.   

    在delphi中使用 VBA 对CAD进行控制,关于CAD的VBA接口可以看下CAD自带的帮助文件
      

  2.   

    使用delphi在CAD中创建的对象可以取得其句柄,如:var
      acad:OleVainat;
      aLine:Variant;
      startPoint,endPoint:Variant;
      aHandle:Variant;
      
    begin
      //连接CAD
       acad:=GetActiveOleObject('AutoCAD.Application');  //创建直线起点
      startPoint:=VarArrayCeate([0,2],VarDouble);
      startPoint[0]:=0;
      startPoint[0]:=0;
      startPoint[0]:=0;  //创建直线终点
      endPoint:=VarArrayCeate([0,2],VarDouble);
      endPoint[0]:=100;
      endPoint[0]:=100;
      endPoint[0]:=100;  //在CAD中创建一条直线
      aLine:=acad.ActiveDocument.ModelSpace.addline(startPoint,endPoint);  //将该直线以起点为中心,旋转90度
      aLine.Rotate(startPoint,3.14/2);  //取得直线句柄,CAD中的句柄好像是string类型的,不太确定,故这里用variant类型
      aHandle:=aLine.Handle;  //其它处理  //详细内容参考AutoCAD的VBA部分
    end;直接在CAD中创建的对象,必须通过选定才能取得句柄
     
    var
      aObject:Variant;
      basePoint:Variant;
      aHandle:Variant;
      ......
    begin
      ......
      aObject:=acad.Utility.GetEntity(aObject,basePoint);  //取得对象句柄
      aHandle:=aObject.Handle;  
    end;
      

  3.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, ComCtrls, StdCtrls, ExtDlgs;type
      TForm1 = class(TForm)
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        T_red: TTrackBar;
        T_green: TTrackBar;
        T_blue: TTrackBar;
        Panel1: TPanel;
        Panel2: TPanel;
        Panel3: TPanel;
        B_open: TButton;
        B_close: TButton;
        OpenPictureDialog1: TOpenPictureDialog;
        Label4: TLabel;
        Label5: TLabel;
        Label6: TLabel;
        Label7: TLabel;
        Label8: TLabel;
        Image_source: TImage;
        Image_target: TImage;
        B_reset: TButton;
        procedure B_closeClick(Sender: TObject);
        procedure B_openClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure T_redChange(Sender: TObject);
        procedure B_resetClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;const
     MaxPixelCount=32768;type
     pRGBArray=^TRGBArray;
     TRGBArray=ARRAY[0..MaxPixelCount-1] OF TRGBTriple;var
      Form1: TForm1;
      str: String;  //记录文件名implementation{$R *.dfm}function Min(a, b: integer): integer;
    begin
      if a < b then
       result:=a
      else
       result:=b;
    end;function Max(a, b: integer): integer;
    begin
      if a > b then
       result:=a
      else
       result:=b;
    end;procedure TForm1.B_closeClick(Sender: TObject);
    begin
     Close;
    end;procedure TForm1.B_openClick(Sender: TObject);
    begin
     T_red.Position:=0;
     T_red.Enabled:=False;
     T_green.Position:=0;
     T_green.Enabled:=False;
     T_blue.Position:=0;
     T_blue.Enabled:=False;
     if OpenPictureDialog1.Execute then
      begin
       str:=OpenPictureDialog1.FileName;
       Image_source.Picture.LoadFromFile(OpenPictureDialog1.FileName);
       Image_target.Picture.LoadFromFile(OpenPictureDialog1.FileName);
       T_red.Enabled:=True;
       T_green.Enabled:=True;
       T_blue.Enabled:=True;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
     T_red.Position:=0;
     T_red.Enabled:=False;
     T_green.Position:=0;
     T_green.Enabled:=False;
     T_blue.Position:=0;
     T_blue.Enabled:=False;
    end;procedure TForm1.T_redChange(Sender: TObject);
    var
     Red_value,Green_value,Blue_value: integer;
     i,j: integer;
     source_Row,target_Row: pRGBArray;
    begin
     Red_value:=T_red.Position;
     Green_value:=T_green.Position;
     Blue_value:=T_blue.Position;
     for i := 0 to Image_source.Picture.Height-1 do
      begin
        source_Row:=Image_source.Picture.Bitmap.ScanLine[i];
        target_Row:=Image_target.Picture.Bitmap.ScanLine[i];
        for j:=0 to Image_source.Picture.Width - 1 do
        begin
          if Red_value>0 then
            target_Row[j].rgbtRed:=Min(255,source_Row[j].rgbtRed+Red_value)
          else
            target_Row[j].rgbtRed:=Max(0,source_Row[j].rgbtRed+Red_value);
          if Green_value>0 then
            target_Row[j].rgbtGreen:=Min(255,source_Row[j].rgbtGreen+Green_value)
          else
            target_Row[j].rgbtGreen:=Max(0,source_Row[j].rgbtGreen+Green_value);
          if Blue_value>0 then
            target_Row[j].rgbtBlue:=Min(255,source_Row[j].rgbtBlue+Blue_value)
          else
            target_Row[j].rgbtBlue:=Max(0,target_Row[j].rgbtBlue+Blue_value);
        end;
      end;
      Image_target.Repaint;
    end;procedure TForm1.B_resetClick(Sender: TObject);
    begin
     T_red.Position:=0;
     T_red.Enabled:=False;
     T_green.Position:=0;
     T_green.Enabled:=False;
     T_blue.Position:=0;
     T_blue.Enabled:=False;
     self.Image_target.Picture.LoadFromFile(str);
    end;end.
    可以使用上面的代码,,处理颜色,,,,
      

  4.   

    如果是已有图形呢,不是自已程序中创建的,如何获取在CAD中的句柄值,以便通过句柄获取对象,进一步改变对象的状态?
      

  5.   

    现在好象变成一个CAD操作的问题了。我稍后结贴给分。
      

  6.   

    直接在CAD中创建的对象,必须通过选定才能取得句柄 
      
    var 
      aObject:Variant; 
      basePoint:Variant; 
      aHandle:Variant; 
      ...... 
    begin 
      ...... 
      aObject:=acad.Utility.GetEntity(aObject,basePoint);   //取得对象句柄 
      aHandle:=aObject.Handle;   
    end;我认为只有通过 GetEntity 方法选定要选择的对象,之后在通过 Handle 属性取得句柄才行。比如在CAD中有3个直线对象La、Lb和Lc,目标是要操作La对象,那么只有通过人工选择才能断定哪个是La阿。