电路原理图控件

通过海龟绘图我们可以构建元件库,特别是利用新版本的海龟绘图,可以支持旋转,因此我们构建的电子元件可以横放和竖放,同时利用海龟绘图的锚点功能将元器件的连接点贡献出来,方便外部电路的连线;

在本控件内,构建了一个元件库的概念,即一行一个元件,以行号来调用(第一行编号0);其次我们构建了标记字符串库,同样以行号标记,可以在原理图字符串中调用;

本控件实际上是用控件脚本解码命里字符串,这个与海龟绘图有些类似,不同处在于考虑到整个图纸不需要旋转,因此命令采用上下左右来标识,而非左转和右转,详细参见命令表(注意,本控件的命令表和海龟绘图的命令表是不同的两组命令)

属性:

属性名 描述 默认值 备注
x1 左上角X1坐标 10
y1 左上角y1坐标 10
x2 右下角X2坐标 30
y2 右下角y2坐标 30
status 状态寄存器 128 这里设置定时值
status2 状态寄存器 0
lib 元件库字符串 一样一个,详细见下面说明
shstr 图纸字符串 一样一个,详细见下面说明
mark 文本标注 一样一个,0开始
dotm 显示汉字的点阵大小 16 汉字点阵数12/16/24/32/48/64
linec 15画线的颜色 15
cc 字符的颜色 1

元件库:

lib 属性:

C15K0G3AG1BG5BG1S0G1BG5BG1J0BG3K1//0:电阻
C15K0BG4BG3BBG6BT0G1BG1T1G4AT0G1AG1T1G2//1:GND
C15K0G3AG3BBG6T0AG2AT1G3S0G3J0BG3K1//2:电容
C15K0G3BG1AG2S0AG4S1AG2AG1S2G2J2BG3K1 J1BRG3RBG10BRG3//3:蜂鸣器
C15K0T1G3AG4BT0G2BT1G1S0G1  T0G1T1G1S1G1 T0G1T1G1S2G1 T0BG2T1BG5BB AJ0G4AG4K1 BJ1G1S3LG1J3BG1LJ3G3BG7K2 J0G1BBG2 BJ2G4//4:NMOS
C15K0AG3AG2BBG4//5:vcc
C15K0G4LG1BG1BG1BG1BRT0 G4T1LG1S1BG1S0BG1BG1J0BRG4K1 J1T0AG1BG1 AA T1G6BBG3AG2//6:按钮

元件库是利用海龟绘图构建的符号,其中命令解析参见:tpen 语句

shstr图纸字符串

命令表:

命令 描述 备注
Un 上移n点
Dn 下移n点
Ln 左移n点
Rn 右移n点
Tn 抬笔 0=不绘制 1-绘制
Mn 记录当前位置到n号 n<16
Jn 跳到n号位置
Fn 设置元件的方向
Sn 设置元件得到放大倍数
Pn 绘制n号元件
Bn 绘制n号字符串
Xn 绘制圆点(实心圆),半径n
Hn 设置(选择)元件编号
Kn 跳转到当前元件的n号锚点

例如:

T0R10D70B0
D15T1R40
X3H0S3F1P0//R
R10H1F0P4//mos
H0K1R37X3//R下连接线
H1K2D20F0P1//GND
H1K1U10H2F0P3//蜂鸣器
H2K1U15F0P5//vcc
U25L20B1//3.3V

算法讲解

本控件比较复杂,且与海龟绘图的内部语句相关,下面讲述一下核心原理:

void create()
{    int i;
    ms=newbin(512);  //建立一个数据结构
    // 初始化这个结构
    for (i=0;i<512;i++){
        setbin(ms,i,0xff);    //全部填写ff
    }
    defbin(ms,0,"55 AA");
    setbin(ms,34,16);    //R34=16 初始化坐标编号计数器
}

在控件的create事件中,首先构建了一个512字节的bin数组,并且获得句柄存在ms变量中;

void drawyj(int n,int x,int y){
    //绘制一个元件
    int bs;
    str s;
    bs=strlist_creat(lib);
    s="Z"+ms+"H"+dqyj+"F"+yjfx+strlist_get(bs,n);
    s=explode_str(s,"/",0);
    tpen(x,y,yjsize,s);
}

然后通过Z命令设置bin数组的句柄,H命令设置元件的编号,F命令设置方向,这样绘制元件,当执行到元件内部的K命令的时候,当前坐标会存储到bin对应的位置;

当绘制完元件后,通过Hn选择元件,K命令跳转到对应锚点,于是可以方便绘制连接线构成原理图。

bin数据格式

bin数据格式,512字节 256个坐标,每元件最多16mark点,最多32个元件
0-10x55 0xaa  标志位,用于识别存储区存在
2-3332个元件的指针,u8的值,ff表示空,可以设置
34:坐标编号js,默认16开始
35-39:备用
40-512:存储坐标,编号0~157;每坐标3字节
        [XL8][YL8][S2.XH3.YH3] 
        其中前16个为系统使用,非元件使用
        XL8 表示X坐标的低8
        YL8 表示Y坐标的低8
        s2暂时00(2bit),存储状态字节目前备用
        XH3 表示X坐标高3位;也就是0~7; 表达最大值8*256=2048
        YH3 表示Y坐标高3位;也就是0~7; 表达最大值8*256=2048

注意