unit Main;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,ComObj, ExtCtrls, StdCtrls;
const
  acLine = 19;//直线
  acCircle = 8 ;//园
  acCreateLine= 36;//构造线
  acManayLine = 24;//多线段,矩形
  acCircleLine = 4 ;//圆弧
 
type
  ZPoint=Record
    x,y:Double;
  end;
  PZLine=^ZLine;
  ZLine=Record
    sp,ep:ZPoint;
    Next:PZLine;
end;
type
  TForm1 = class(TForm)
    btnOpen: TButton;
    btnSend: TButton;
    btnGet: TButton;
    PaintBox1: TPaintBox;
    DrowCircle: TButton;
    DrowLine: TButton;
    procedure DrowLineClick(Sender: TObject);
    procedure DrowCircleClick(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
    procedure btnGetClick(Sender: TObject);
    procedure btnSendClick(Sender: TObject);
    procedure btnOpenClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    pData: PZLine;
  public
    { Public declarations }
    procedure FreeData;
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.btnGetClick(Sender: TObject);
var
  AcadApp: OleVariant;
  AcadDoc: OleVariant;
  AcadMoSpace: OleVariant;
  AcadObj: OleVariant;
  AcadPt: Variant;
  i: integer;
  EntiType: Integer;
  pTmp: PZLine;
begin
  //得到所需的AutoCad对象
  AcadApp := GetActiveOleObject('AutoCad.Application');
  AcadDoc := AcadApp.ActiveDocument;
  AcadMoSpace := AcadDoc.ModelSpace;
  //释放以前存放的数据
  FreeData;
  //遍历模型空间中的每一个实体对象
  for i := 0 to AcadMoSpace.Count-1 do
  begin
    //引用第i个实体对象
    AcadObj := AcadMoSpace.Item(i);
    //提取实体类型
    EntiType := AcadObj.EntityType;
    //判断是不是直线
    if EntiType = acLine then
    begin
    //如果是直线,则提取相应的起点终点数据
      new(pTmp);
      AcadPt := AcadObj.StartPoint;
      pTmp^.sp.x := AcadPt[0];
      pTmp^.sp.y := AcadPt[1];
      AcadPt := AcadObj.EndPoint;
      pTmp^.ep.x := AcadPt[0];
      pTmp^.ep.y := AcadPt[1];
      pTmp^.next := pData;
      pData := pTmp;
    end;
  end;
  //刷新用于显示结果的PaintBox
  PaintBox1.Invalidate;
end;
procedure TForm1.btnOpenClick(Sender: TObject);
var
 AcadApp : OleVariant;
begin
  try
    AcadApp:=GetActiveOleObject('AutoCAD.Application');
  except
    try
      AcadApp:=CreateOleObject('AutoCAD.Application');
    except
      ShowMessage('你没有安装AutoCAD!请先安装');
    end;
  end;
  AcadApp.Visible:=False;
end;
procedure TForm1.btnSendClick(Sender: TObject);
var
  AcadApp: OleVariant;
  AcadDoc: OleVariant;
  AcadMoSpace: OleVariant;
  sp,ep: Variant;
  pTmp: PZLine;
begin
  //得到已启动的AutoCad Application对象
  AcadApp := GetActiveOleObject('AutoCad.Application');
  //得到AutoCad Document对象
  AcadDoc := AcadApp.ActiveDocument;
  //得到AutoCad ModelSpace对象
  AcadMoSpace := AcadDoc.ModelSpace;
  //遍历数据链表
  pTmp := pData;
  while pTmp <> nil do
  begin
    //创建包含数组的Variant变量sp,用于向AutoCad传递起点数据
    sp := VarArrayCreate([0,2],VarDouble);
    sp[0] := pTmp^.sp.x;
    sp[1] := pTmp^.sp.y;
    sp[2] := 0.0;
    //创建包含数组的Variant变量ep,用于向AutoCad传送终点数据
    ep := VarArrayCreate([0,2],VarDouble);
    ep[0] := pTmp^.ep.x;
    ep[1] := pTmp^.ep.y;
    ep[2] := 0.0;
    //VarArrayRef把包含数组的Variant变量转换成Variant数组,
    //使用AutoCad 14.0时要调用此函数,AutoCad 2000不需要
    AcadMoSpace.AddLine(VarArrayRef(sp),VarArrayRef(ep));
    pTmp := pTmp^.next;
  end;
AcadApp.Visible:=True;
end;
procedure TForm1.DrowCircleClick(Sender: TObject);
var
  AcadApp: OleVariant;
  AcadDoc: OleVariant;
  AcadMoSpace: OleVariant;
  lCenter:Variant;
begin
  //得到已启动的AutoCad Application对象
  AcadApp := GetActiveOleObject('AutoCad.Application');
  //得到AutoCad Document对象
  AcadDoc := AcadApp.ActiveDocument;
  //得到AutoCad ModelSpace对象
  AcadMoSpace := AcadDoc.ModelSpace;
  lCenter:=VarArrayCreate([0,2],VarDouble);
  lCenter[0]:=10;
  lCenter[1]:=20;
  lCenter[2]:=0.0;
  AcadMoSpace.addcircle(VarArrayRef(lCenter),StrToInt('200'));
  AcadApp.Visible:=True;
end;
procedure TForm1.DrowLineClick(Sender: TObject);
var
  pLine1,pLine2:PZLine;
begin
  pData := nil;
  New(pData);
  New(pLine1);
  New(pLine2);
  pData.sp.x:=100;
  pData.sp.y:=100;
  pData.ep.x:=300;
  pData.ep.y:=300;
  pData.Next:=pLine1;
  pLine1.sp.x:=600;
  pLine1.ep.y:=260;
  pLine1.Next:=pLine2;
  pLine2.sp.x:=900;
  pLine2.ep.y:=100;
  pLine2.Next:=nil;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  pData := nil;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeData;
end;
procedure TForm1.FreeData;
var
  pTmp: PZLine;
begin
  while pData <> nil do
  begin
    pTmp := pData;
    pData := pData^.next;
    Dispose(pTmp);
  end;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  MaxX, MaxY: double;
  MinX, MinY: double;
  pTmp: PZLine;
  scale: double;
  x,y: integer;
begin
  pTmp := pData;
  if pTmp = nil then
    Exit;
 
  //计算放缩比例
  MaxX := pTmp^.sp.x;
  MinX := MaxX;
  MaxY := pTmp^.sp.y;
  MinY := MaxY;
while pTmp <> nil do
  begin
    if MaxX < pTmp^.sp.x then MaxX := pTmp^.sp.x;
    if MinX > pTmp^.sp.x then MinX := pTmp^.sp.x;
    if MaxY < pTmp^.sp.y then MaxY := pTmp^.sp.y;
    if MinY > pTmp^.sp.y then MinY := pTmp^.sp.y;
    if MaxX < pTmp^.ep.x then MaxX := pTmp^.ep.x;
    if MinX > pTmp^.ep.x then MinX := pTmp^.ep.x;
    if MaxY < pTmp^.ep.y then MaxY := pTmp^.ep.y;
    if MinY > pTmp^.ep.y then MinY := pTmp^.ep.y;
    pTmp := pTmp^.next;
  end;
scale := (PaintBox1.Width - 10) / (MaxX-MinX);
  if scale > (PaintBox1.Height - 10) / (MaxY-MinY) then
  begin
    scale := (PaintBox1.Height- 10) / (MaxY-MinY);
  end;
  //显示提取的数据
  pTmp := pData;
  while pTmp <> nil do
  begin
    x := round((pTmp^.sp.x - MinX) * scale) + 5;
    y := PaintBox1.Height - (round((pTmp^.sp.y - MinY) * scale) + 5);
    PaintBox1.Canvas.MoveTo(x,y);
    x := round((pTmp^.ep.x - MinX) * scale) + 5;
    y := PaintBox1.Height - (round((pTmp^.ep.y - MinY) * scale) + 5);
    PaintBox1.Canvas.LineTo(x,y);
    pTmp := pTmp^.next;
  end;
end;
end.

转载于:https://blog.51cto.com/bigpower/88784

一个关于指针+记录数据类型的使用技巧相关推荐

  1. java定义一个指针类型变量赋值吗,C++中指针的数据类型和运算相关知识小结

    C++有关指针的数据类型和指针运算的小结 前面已用过一些指针运算(如p++,p+i等),现在把全部的指针运算列出如下. 1) 指针变量加/减 一个整数 例如:p++,p--,p+i,p-i,p+-i, ...

  2. 共享内存 传一个类指针_C++指针

    简介 指针一直是C语言和C++语言最难理解的一部分,无论是C语言和C++语言,复杂的数据结构都是离不开指针的运用,所以必须掌握好指针这个数据类型,你才能够在阅读框架代码时,游刃有余.今天我们从指针的本 ...

  3. 【精华文】C语言结构体特殊情况分析:结构体指针 / 基本数据类型指针,指向其他结构体

    参考链接:Structure pointer pointing to different structure instance 注:可以查看此篇的问题和唯一的回复,那是相对正确的,不要看comment ...

  4. 有关指针的数据类型的小结

    有关指针的数据类型的小结 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/23/3846519.html

  5. C语言:一个涉及指针函数返回值与printf乱码、内存堆栈的经典案例

    C语言:一个涉及指针函数返回值与printf乱码.内存堆栈的经典案例 一个奇怪的C语言问题,涉及到指针.数组.堆栈.以及printf.以下实现: 整数向字符串的转换,返回字符串指针,并在main函数中 ...

  6. C语言 | 编写一个使用指针的c函数,交换数组a和数组b中的对应元素

    ================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:h ...

  7. win10电脑黑屏只有鼠标箭头_电脑开机进入系统后显示黑屏,只能看到一个鼠标指针,如何解决?...

    使用电脑时可能会遇到各种小问题,当电脑开机后进入系统后显示黑屏,看不到任何图标只有一个鼠标指针的情况,这是资源管理器没有正常加载并运行的原因.我们可以调出任务管理器重新启动下资源管理器,就可以让桌面图 ...

  8. 一个使用指针的简单程序

    一个使用指针的简单程序 /* 一个使用指针的简单程序 */ #include <stdio.h> void main() { int number = 0; //一个出初始化为0的整形变量 ...

  9. mysql 为了检索从某一个偏移量到记录集的结束所有的记录行_mysql limit 效率分析...

    SELECT*FROM table LIMIT [offset,] rows | rows OFFSET offset mysql>SELECT*FROM table LIMIT 5,10; / ...

最新文章

  1. 可以通过无线充电的软脑植入物来控制大脑中的脑细胞
  2. 学习笔记Kafka(一)—— Kafka简介
  3. 在CDS(Core Data Services)中使用DCL(Data Control Language)
  4. 7-5 求前N天 (30 分)
  5. 使用rsync和scp远程同步文件
  6. Scanner类的一个小例子
  7. Angular Component的DOM级别的单元测试方法
  8. 5919. 所有子字符串中的元音
  9. 流畅的Python 1. Python数据模型(特殊方法 __func__())
  10. php连接mysql并操作系统_PHP 连接并操作MySQL的一个实例
  11. EAI企业应用集成场景及解决方案
  12. [UVA-1218] Perfect Service(树的最小支配集)
  13. 基于矩阵分解的隐因子模型
  14. oracle rpad()函数
  15. 教程篇(7.0) 02. FortiGate基础架构 SD-WAN本地分汇 ❀ Fortinet 网络安全专家 NSE 4
  16. 数学在计算机领域的应用,浅析数学在计算机领域中的重要性
  17. int.prase和int.tryprase
  18. tinymce粘贴word图片问题解决
  19. 【算法】3 由招聘问题看随机算法
  20. x86-64平台栈帧结构与ARM64栈帧结构对比

热门文章

  1. 移动设备安全隐患分析
  2. 云卓遥控器+DIY高清摄像机的方案(完美接入原系统)
  3. 旷视产品营销总监吕盟:构建AIoT时代的城市智慧|量子位沙龙回顾
  4. 李飞飞新动向:创建斯坦福“以人为本AI研究院”,担任共同院长
  5. 3个问题,1套非技术人员的AI方法论 | 哈佛商业评论最新热文
  6. 汤晓鸥为CNN搓了一颗大力丸
  7. Google Pixel 2拍照黑科技:单摄搞定背景虚化+内部潜伏神秘芯片
  8. vue项目打包优化策略
  9. 小白该如何学习Linux操作系统(1)
  10. python pip 安装