cchart波形图表在aardio中的简单调用示例

By admin at 2020-03-08 • 1人收藏 • 1259人看过

首先介绍下这个图表:

CChart可以绘制多种二维、三维曲线,包括折线图、等高线图、云图、饼图、柱图、散点图、面积图、直方图、极线图、甘特图、雷达图、瀑布图、K线图,频谱图等,功能非常全面。 而且,CChart内部选项极为丰富,无论是曲线本身,还是标题、坐标轴、图例、背景、图像注释等部分,都有大量的选项可供设置,甚至消息响应、右键菜单等元素,都提供了自定义的方法。

CChart最大的优势,还是在于其对用户的友好性。在追求功能的同时,CChart在简化调用方面,做到了极致,一般只用几句代码就可以画出精致的图像。这一点可以说不仅胜过绝大部分非商业的图表软件,甚至不输于大部分商业图表软件。


CChart 开源免费, 支持MIT开源协议

CChart官方:http://www.cchart.net/


提示: 此 cchart.dll 可以通过$符号内嵌到exe里, 这样就可以生成完全绿色版独立exe了,使用波形图的时候不用释放dll到外部目录.

image.png


注意: 使用下面的代码,请升级aardio到 v27 版本以上 , 因为下面的tocdecl函数,需要新增的功能支持.


下面的代码中, 主要看下dll中的回调函数在 aardio中怎么定义

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="创建";left=0;top=420;right=160;bottom=470;db=1;dl=1;z=2};
button2={cls="button";text="画图";left=183;top=420;right=343;bottom=470;db=1;dl=1;z=3};
static={cls="static";text="Static";left=0;top=0;right=760;bottom=407;db=1;dl=1;dr=1;dt=1;notify=1;transparent=1;z=1}
)
/*}}*/

var dll = ..raw.loadDll("\res\CChartu.dll","ccshare","cdecl");
Attach = dll.api("?Attach@Classless@@YAHPAUHWND__@@@Z", "int(addr hwnd)");//int __cdecl Attach(struct HWND__ *)
CreateChart = dll.api("?CreateChart@Classless@@YAXXZ", "void(void)");
DestroyChart = dll.api("?DestroyChart@Classless@@YAXXZ", "void(void)");
SetType = dll.api("?SetType@Classless@@YA_NH@Z", "byte(int)");//bool __cdecl SetType(int)
//静态回调函数
SetFieldFcn = dll.api("?SetFieldFcn@Classless@@YAXP6ANNN@Z@Z", "void(pointer fun)");//void __cdecl SetFieldFcn(double (__cdecl*)(double,double))
SetPlotRange = dll.api("?SetPlotRange@Classless@@YAXNNNN@Z", "void(double, double, double, double)");//(void __cdecl SetPlotRange(double,double,double,double))
ReDraw = dll.api("?ReDraw@Classless@@YAXXZ", "void(void)");//void __cdecl ReDraw(void)
SetTitle = dll.api("?SetTitle@Classless@@YAXPB_W@Z", "void(ustring title)");//void __cdecl SetTitle(wchar_t const *)
SimpleMsgLoop = dll.api("?SimpleMsgLoop@NsCChart@@YAHXZ", "void(void)");
       
winform.static.onEraseBkgnd  = function(hwnd,message,wParam,lParam){
    return 0;//禁止擦除背景
};
winform.button.oncommand = function(id,event){
	CreateChart();
	Attach(winform.static.hwnd);
	ReDraw();
}


import console
console.open()

//定义静态回调函数
func = function(x,y){
	var ret = 1.0/(x*x+y*y+1.0);
	return ret;
}
//dll中在别的线程中调用,所以这里用thread
func_c = thread.tocdecl(func,"double(double,double)");

winform.button2.oncommand = function(id,event){
	SetType(6)
	//主要看这个: 静态回调
	SetFieldFcn(func_c);
	SetPlotRange(-3.0, 3.0, -2.0, 2.0);
	SetTitle("GCC标题");
	ReDraw();
	//SimpleMsgLoop();
}

winform.show();
win.loopMessage();
return winform;

下面是cchart.dll文件

CChartu.7z

函数H头文件

CChartu_H.zip


↓↓↓↓↓以下所有aardio调用cchart示例集合工程:

cchart.zip


18 个回复 | 最后更新于 20 天前
2020-04-18   #1

添加双Y轴曲线图:

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="创建";left=0;top=420;right=160;bottom=470;db=1;dl=1;z=2};
button2={cls="button";text="画图";left=183;top=420;right=343;bottom=470;db=1;dl=1;z=3};
button3={cls="button";text="画图2";left=600;top=420;right=760;bottom=470;db=1;dl=1;z=4};
static={cls="static";text="Static";left=0;top=0;right=760;bottom=407;db=1;dl=1;dr=1;dt=1;notify=1;transparent=1;z=1}
)
/*}}*/

var dll = ..raw.loadDll("\res\CChartu.dll","ccshare","cdecl");
Attach = dll.api("?Attach@Classless@@YAHPAUHWND__@@H@Z", "int(addr hwnd,int)");//int __cdecl Attach(struct HWND__ *)
CreateChart = dll.api("?CreateChart@Classless@@YAXXZ", "void(void)");
DestroyChart = dll.api("?DestroyChart@Classless@@YAXXZ", "void(void)");
SetType = dll.api("?SetType@Classless@@YA_NH@Z", "byte(int)");//bool __cdecl SetType(int)
//静态回调函数
SetFieldFcn = dll.api("?SetFieldFcn@Classless@@YAXP6ANNN@Z@Z", "void(pointer fun)");//void __cdecl SetFieldFcn(double (__cdecl*)(double,double))
SetPlotRange = dll.api("?SetPlotRange@Classless@@YAXNNNN@Z", "void(double, double, double, double)");//(void __cdecl SetPlotRange(double,double,double,double))
ReDraw = dll.api("?ReDraw@Classless@@YAXXZ", "void(void)");//void __cdecl ReDraw(void)
SetTitle = dll.api("?SetTitle@Classless@@YAXPB_W@Z", "void(ustring title)");//void __cdecl SetTitle(wchar_t const *)
SimpleMsgLoop = dll.api("?SimpleMsgLoop@NsCChart@@YAHXZ", "void(void)");

ResizePlots = dll.api("?ResizePlots@Classless@@YAXH@Z", "void(int)");//void __cdecl ResizePlots(int) 

//ResizePlots = dll.api("?ResizePlots@Classless@@YAXHHH@Z", "void(int,int,int)");//void __cdecl ResizePlots(int) 
AddCurve = dll.api("?AddCurve@Classless@@YAHPAN0HH@Z", "int(struct,struct,int,int)");//int __cdecl AddCurve(double* ,double*,int,int); 
AddAxis = dll.api("?AddAxis@Classless@@YAXHH@Z", "void(int, int)");//void __cdecl AddAxis(int,int)

        
winform.static.onEraseBkgnd  = function(hwnd,message,wParam,lParam){
    return 0;//禁止擦除背景
};
winform.button.oncommand = function(id,event){
        //创建波形图
    CreateChart();
    //绑定到窗口,定义X轴共享波形
    Attach(winform.static.hwnd,10);
    ReDraw();
}

winform.button3.oncommand = function(id,event){
        //X轴共享波形
    ResizePlots(2);
	var x = { double arr[200] = {0} };
	var y = { double arr[200] = {0} };
	for(i=1;200;1){
		x.arr[i] = i ;
		y.arr[i] = 5.0*math.sin(i*2.0*3.14/360.0*3.0) ;
	}
	//添加曲线
	AddCurve(x,y,200,0);
	//设置曲线0的Y轴到左边
	AddAxis(0,0);
	for(i=1;200;1){
		y.arr[i] = 2.0*math.sin(i*1.0*3.14/360.0*3.0) ;
	}
	//再增加一跳曲线
	AddCurve(x,y,200,1);
	//设定曲线1的Y轴到右边
	AddAxis(2,1)
	//设置标题
	SetTitle("双Y轴");
    ReDraw();
} 
 
import console
console.open()
 
//定义静态回调函数
func = function(x,y){
    var ret = 1.0/(x*x+y*y+1.0);
    return ret;
}
//dll中在别的线程中调用,所以这里用thread
func_c = thread.tocdecl(func,"double(double,double)");
 
winform.button2.oncommand = function(id,event){
    SetType(6)
    //主要看这个: 静态回调
    SetFieldFcn(func_c);
    SetPlotRange(-3.0, 3.0, -2.0, 2.0);
    SetTitle("GCC标题");
    ReDraw();
    //SimpleMsgLoop();
}



winform.show();
win.loopMessage();
return winform;

image.png

所有支持的类型:

image.png

2020-04-18   #2

aardio调用dll的界面好简单,赞一个。

2020-04-18   #3

回复#2 @baita00 :

谢谢您提供这么好的控件

2020-04-19   #4

cchart 第一个示例:

image.png

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="第一个示例";left=0;top=440;right=119;bottom=470;db=1;dl=1;z=2};
static={cls="static";left=0;top=0;right=760;bottom=428;db=1;dl=1;dr=1;dt=1;transparent=1;z=1}
)
/*}}*/

//调用CChart波形图动态库函数
var dll = raw.loadDll("\res\CChartu.dll","ccshare","cdecl");
Attach = dll.api("?Attach@Classless@@YAHPAUHWND__@@H@Z", "int(addr hwnd,int)");
Detach = dll.api("?Detach@Classless@@YA_NPAUHWND__@@@Z", "int(addr hwnd)");
CreateChart = dll.api("?CreateChart@Classless@@YAXXZ", "void(void)");
DestroyChart = dll.api("?DestroyChart@Classless@@YAXXZ", "void(void)");
ReDraw = dll.api("?ReDraw@Classless@@YAXXZ", "void(void)");
SetTitle = dll.api("?SetTitle@Classless@@YAXPB_W@Z", "void(ustring title)");
//
AddPoint2D = dll.api("?AddPoint2D@Classless@@YAHNNHH@Z", "int(double,double,int,int)");


CreateChart();
//绑定窗口,并设置XY折线图样式
Attach(winform.static.hwnd,0);//kTypeXY = 0 折线图
ReDraw();

winform.button.oncommand = function(id,event){
	AddPoint2D(-3.0, 9.0 ,0,0);
	AddPoint2D(-2.0, 4.0 ,0,0);
	AddPoint2D(-1.0, 1.0 ,0,0);
	AddPoint2D(0.0, 0.0 ,0,0);
	AddPoint2D(1.0, 1.0 ,0,0);
	AddPoint2D(2.0, 4.0 ,0,0);
	AddPoint2D(3.0, 9.0 ,0,0);
 
	SetTitle("Hello World,我的第一个CChart程序!");
	ReDraw();
}

winform.onClose = function(hwnd,message,wParam,lParam){
    Detach(winform.static.hwnd);
    DestroyChart();
}


winform.show();
win.loopMessage();
return winform;


2020-04-19   #5

第二例: 开启cchart的交互功能

这个在aardio中不需要什么修改, 在属性里开启[事件回调]即可

image.png

然后, 还是原来 第一个示例里面的代码, 运行即可. 然后在波形图显示区就可以点鼠标右键弹出系统默认菜单了.

image.png

其实右键菜单的功能非常丰富,看看各条菜单的作用和效果。

其他详细功能可以参考官方的 第三课 

2020-04-19   #6

第三例: 等高线

image.png

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="第一个示例";left=0;top=440;right=119;bottom=470;db=1;dl=1;z=2};
static={cls="static";left=0;top=0;right=760;bottom=428;db=1;dl=1;dr=1;dt=1;notify=1;transparent=1;z=1}
)
/*}}*/

//调用CChart波形图动态库函数
var dll = raw.loadDll("\res\CChartu.dll","ccshare","cdecl");
Attach = dll.api("?Attach@Classless@@YAHPAUHWND__@@H@Z", "int(addr hwnd,int)");
Detach = dll.api("?Detach@Classless@@YA_NPAUHWND__@@@Z", "int(addr hwnd)");
CreateChart = dll.api("?CreateChart@Classless@@YAXXZ", "void(void)");
DestroyChart = dll.api("?DestroyChart@Classless@@YAXXZ", "void(void)");
ReDraw = dll.api("?ReDraw@Classless@@YAXXZ", "void(void)");
SetTitle = dll.api("?SetTitle@Classless@@YAXPB_W@Z", "void(ustring title)");

//静态回调函数
SetFieldFcn = dll.api("?SetFieldFcn@Classless@@YAXP6ANNN@Z@Z", "void(pointer fun)");//void __cdecl SetFieldFcn(double (__cdecl*)(double,double))
SetPlotRange = dll.api("?SetPlotRange@Classless@@YAXNNNN@Z", "void(double, double, double, double)");//(void __cdecl SetPlotRange(double,double,double,double))
SetContourPrecision = dll.api("?SetContourPrecision@Classless@@YAXH@Z", "void(int)");
SetContourLineNum = dll.api("?SetContourLineNum@Classless@@YAXH@Z", "void(int)");

CreateChart();
Attach(winform.static.hwnd,4);//kTypeContourLine=4 等高线图

//定义静态回调函数
func = function(x,y){
    var ret = 1.0/((x-1.0)*(x-1.0)+y*y+1.0);
    return ret;
}
//dll中在别的线程中调用,所以这里用thread
func_c = thread.tocdecl(func,"double(double,double)");

SetFieldFcn(func_c);
SetPlotRange(-2.0, 2.0, -2.0, 2.0);
SetTitle("Cchart等高线");
//设置等高线的精度,一般设置为5或者6就可以了。设置得越高,第一次绘制的时候延迟就越长
SetContourPrecision(8);
//设置等高线高度的个数
SetContourLineNum(50);
ReDraw();


winform.onClose = function(hwnd,message,wParam,lParam){
    Detach(winform.static.hwnd);
    DestroyChart();
}


winform.show();
win.loopMessage();
return winform;


2020-04-19   #7

第四例: 折线图 的一些操作

image.png

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="第一个示例";left=0;top=440;right=119;bottom=470;db=1;dl=1;z=2};
static={cls="static";left=0;top=0;right=760;bottom=428;db=1;dl=1;dr=1;dt=1;notify=1;transparent=1;z=1}
)
/*}}*/

var dll = ..raw.loadDll("\res\CChartu.dll","ccshare","cdecl");
Attach = dll.api("?Attach@Classless@@YAHPAUHWND__@@H@Z", "int(addr hwnd,int)");//int __cdecl Attach(struct HWND__ *)
CreateChart = dll.api("?CreateChart@Classless@@YAXXZ", "void(void)");
DestroyChart = dll.api("?DestroyChart@Classless@@YAXXZ", "void(void)");
Detach = dll.api("?Detach@Classless@@YA_NPAUHWND__@@@Z", "int(addr hwnd)");
SetType = dll.api("?SetType@Classless@@YA_NH@Z", "byte(int)");//bool __cdecl SetType(int)

ReDraw = dll.api("?ReDraw@Classless@@YAXXZ", "void(void)");//void __cdecl ReDraw(void)
SetTitle = dll.api("?SetTitle@Classless@@YAXPB_W@Z", "void(ustring title)");//void __cdecl SetTitle(wchar_t const *)

AddCurve = dll.api("?AddCurve@Classless@@YAHPAN0HH@Z", "int(struct,struct,int,int)");//int __cdecl AddCurve(double* ,double*,int,int); 
AddAxis = dll.api("?AddAxis@Classless@@YAXHH@Z", "void(int, int)");//void __cdecl AddAxis(int,int)
SetLegendShow = dll.api("?SetLegendShow@Classless@@YAX_NH@Z", "void(bool,int)");
SetDataTitle = dll.api("?SetDataTitle@Classless@@YAXPB_WHH@Z", "void(ustring,int,int)");
SetAxisTitle = dll.api("?SetAxisTitle@Classless@@YAXPB_WHH@Z", "void(ustring,int,int)");
SetGridLine = dll.api("?SetGridLine@Classless@@YAX_N000H@Z", "void(bool,bool,bool,bool,int)");
SetBkgndColor = dll.api("?SetBkgndColor@Classless@@YAXKH@Z", "void(INT,int)");


CreateChart();
Attach(winform.static.hwnd,0);//kTypeXY=0 折线图

var x = { double arr[200] = {0} };
var y = { double arr[200] = {0} };
for(i=1;200;1){
	x.arr[i] = i ;
	y.arr[i] = 5.0*math.sin(i*2.0*3.14/360.0*3.0) ;
}

AddCurve(x,y,200,0);
//显示图例
SetLegendShow(true,0)
//设置图例名称
SetDataTitle("aardio王菲",0,0)
//设置轴名,左坐标轴为0,下坐标轴为1,右坐标轴为2,上坐标轴为3
SetAxisTitle("左边轴名",0,0);
SetAxisTitle("下边轴名",1,0);
//设置显示网格
SetGridLine(true,true,true,true,0);
//设置背景色
SetBkgndColor(0xFFE6C2,0);
ReDraw();

winform.onClose = function(hwnd,message,wParam,lParam){
    Detach(winform.static.hwnd);
    DestroyChart();
}


winform.show();
win.loopMessage();
return winform;


2020-04-19   #8

第五例: 饼图

image.png

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="第一个示例";left=0;top=440;right=119;bottom=470;db=1;dl=1;z=2};
static={cls="static";left=0;top=0;right=760;bottom=428;db=1;dl=1;dr=1;dt=1;notify=1;transparent=1;z=1}
)
/*}}*/

var dll = ..raw.loadDll("\res\CChartu.dll","ccshare","cdecl");
Attach = dll.api("?Attach@Classless@@YAHPAUHWND__@@H@Z", "int(addr hwnd,int)");//int __cdecl Attach(struct HWND__ *)
CreateChart = dll.api("?CreateChart@Classless@@YAXXZ", "void(void)");
DestroyChart = dll.api("?DestroyChart@Classless@@YAXXZ", "void(void)");
Detach = dll.api("?Detach@Classless@@YA_NPAUHWND__@@@Z", "int(addr hwnd)");
SetType = dll.api("?SetType@Classless@@YA_NH@Z", "byte(int)");//bool __cdecl SetType(int)

ReDraw = dll.api("?ReDraw@Classless@@YAXXZ", "void(void)");//void __cdecl ReDraw(void)
SetTitle = dll.api("?SetTitle@Classless@@YAXPB_W@Z", "void(ustring title)");//void __cdecl SetTitle(wchar_t const *)
AddPie = dll.api("?AddPie@Classless@@YAHNPA_W@Z", "int(double,ustring)");



CreateChart();
Attach(winform.static.hwnd,1);//kTypePie=1 饼图

AddPie(28,"VB");
AddPie(22,"C++");
AddPie(21,"无名氏");
AddPie(39,"aardio");
ReDraw();

winform.button.oncommand = function(id,event){
	
}

winform.show();
win.loopMessage();
return winform;


2020-04-19   #9

第六例: 柱状图

image.png

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="第一个示例";left=0;top=440;right=119;bottom=470;db=1;dl=1;z=2};
static={cls="static";left=0;top=0;right=760;bottom=428;db=1;dl=1;dr=1;dt=1;notify=1;transparent=1;z=1}
)
/*}}*/

var dll = ..raw.loadDll("\res\CChartu.dll","ccshare","cdecl");
Attach = dll.api("?Attach@Classless@@YAHPAUHWND__@@H@Z", "int(addr hwnd,int)");//int __cdecl Attach(struct HWND__ *)
CreateChart = dll.api("?CreateChart@Classless@@YAXXZ", "void(void)");
DestroyChart = dll.api("?DestroyChart@Classless@@YAXXZ", "void(void)");
Detach = dll.api("?Detach@Classless@@YA_NPAUHWND__@@@Z", "int(addr hwnd)");
SetType = dll.api("?SetType@Classless@@YA_NH@Z", "byte(int)");//bool __cdecl SetType(int)

ReDraw = dll.api("?ReDraw@Classless@@YAXXZ", "void(void)");//void __cdecl ReDraw(void)
SetTitle = dll.api("?SetTitle@Classless@@YAXPB_W@Z", "void(ustring title)");//void __cdecl SetTitle(wchar_t const *)
SetDataTitle = dll.api("?SetDataTitle@Classless@@YAXPB_WHH@Z", "void(ustring,int,int)");
SetLegendShow = dll.api("?SetLegendShow@Classless@@YAX_NH@Z", "void(bool,int)");

AddStems = dll.api("?AddStems@Classless@@YAHPANH@Z", "int(struct,int)");
SetStemLabel = dll.api("?SetStemLabel@Classless@@YAXPB_WH@Z", "void(ustring,int)");


CreateChart();
Attach(winform.static.hwnd,2);//kTypeStem=2 柱图

var data = { double arr[4]={0}; };

data.arr[1]=28;
data.arr[2]=22;
data.arr[3]=21;
data.arr[4]=39;


AddStems(data,4);
//显示图例
SetLegendShow(true,0)
SetDataTitle("使用率1",0,0)

SetStemLabel("VB",0);
SetStemLabel("C++",1);
SetStemLabel("无名氏",2);
SetStemLabel("aardio",3);

data.arr[1]=20;
data.arr[2]=38;
data.arr[3]=12;
data.arr[4]=30;

AddStems(data,4);
SetLegendShow(true,1)
SetDataTitle("使用率2",1,0)

ReDraw();

winform.button.oncommand = function(id,event){
	
}

winform.show();
win.loopMessage();
return winform;


2020-04-19   #10

第七例: 动态显示波形(实时波形)

此例子在第一个折线图例子上添加定时器得来

GIF.gif

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="动起来";left=0;top=440;right=119;bottom=470;db=1;dl=1;z=2};
button2={cls="button";text="暂停";left=134;top=440;right=253;bottom=470;db=1;dl=1;z=3};
static={cls="static";left=0;top=0;right=760;bottom=428;db=1;dl=1;dr=1;dt=1;notify=1;transparent=1;z=1}
)
/*}}*/

var dll = ..raw.loadDll("\res\CChartu.dll","ccshare","cdecl");
Attach = dll.api("?Attach@Classless@@YAHPAUHWND__@@H@Z", "int(addr hwnd,int)");//int __cdecl Attach(struct HWND__ *)
CreateChart = dll.api("?CreateChart@Classless@@YAXXZ", "void(void)");
DestroyChart = dll.api("?DestroyChart@Classless@@YAXXZ", "void(void)");
Detach = dll.api("?Detach@Classless@@YA_NPAUHWND__@@@Z", "int(addr hwnd)");
SetType = dll.api("?SetType@Classless@@YA_NH@Z", "byte(int)");//bool __cdecl SetType(int)

ReDraw = dll.api("?ReDraw@Classless@@YAXXZ", "void(void)");//void __cdecl ReDraw(void)
SetTitle = dll.api("?SetTitle@Classless@@YAXPB_W@Z", "void(ustring title)");//void __cdecl SetTitle(wchar_t const *)
SetGridLine = dll.api("?SetGridLine@Classless@@YAX_N000H@Z", "void(bool,bool,bool,bool,int)");
SetBkgndColor = dll.api("?SetBkgndColor@Classless@@YAXKH@Z", "void(INT,int)");

//
AddPoint2D = dll.api("?AddPoint2D@Classless@@YAHNNHH@Z", "int(double,double,int,int)");


CreateChart();
Attach(winform.static.hwnd,0);//kTypeXY=0 折线图

//设置显示网格
SetGridLine(true,true,true,true,0);
//设置背景色
SetBkgndColor(0xFFE6C2,0);
ReDraw();

var timeid;
var index = 0;
winform.button.oncommand = function(id,event){
    //开定时器
	timeid = winform.setInterval(
	300,function(){
		AddPoint2D(index, math.random(0,50) ,0,0);
		ReDraw();
		index++;
	}
);
}
winform.button2.oncommand = function(id,event){
    if(timeid){
        //暂停定时器
    	winform.changeInterval(timeid,-1);	
    }
	
}

//防止闪烁
winform.static.onEraseBkgnd  = function(hwnd,message,wParam,lParam){
    return 0;//禁止擦除背景
};


winform.onClose = function(hwnd,message,wParam,lParam){
    Detach(winform.static.hwnd);
    DestroyChart();
}



winform.show();
win.loopMessage();
return winform;


2020-04-19   #11

第八例: 三维线图个曲面图 (3dLine/surface)

image.png

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="第一个示例";left=0;top=440;right=119;bottom=470;db=1;dl=1;z=2};
static={cls="static";left=0;top=0;right=760;bottom=428;db=1;dl=1;dr=1;dt=1;notify=1;transparent=1;z=1}
)
/*}}*/

var dll = ..raw.loadDll("\res\CChartu.dll","ccshare","cdecl");
Attach = dll.api("?Attach@Classless@@YAHPAUHWND__@@H@Z", "int(addr hwnd,int)");//int __cdecl Attach(struct HWND__ *)
CreateChart = dll.api("?CreateChart@Classless@@YAXXZ", "void(void)");
DestroyChart = dll.api("?DestroyChart@Classless@@YAXXZ", "void(void)");
Detach = dll.api("?Detach@Classless@@YA_NPAUHWND__@@@Z", "int(addr hwnd)");
SetType = dll.api("?SetType@Classless@@YA_NH@Z", "byte(int)");//bool __cdecl SetType(int)

ReDraw = dll.api("?ReDraw@Classless@@YAXXZ", "void(void)");//void __cdecl ReDraw(void)
SetTitle = dll.api("?SetTitle@Classless@@YAXPB_W@Z", "void(ustring title)");//void __cdecl SetTitle(wchar_t const *)

AddCurve = dll.api("?AddCurve@Classless@@YAHPAN00H@Z", "int(struct,struct,struct,int)");

CreateChart();
Attach(winform.static.hwnd,12);//kType3DLine = 12 3维折线图

var x = { double arr[200] = {0} };
var y = { double arr[200] = {0} };
var z = { double arr[200] = {0} };
for(i=1;200;1){
	x.arr[i] = 2.0*3.1415926536*i/200*5; ;
	y.arr[i] = math.cos(x.arr[i]);
	z.arr[i] = math.sin(x.arr[i]);
}

AddCurve(x,y,z,200);
ReDraw();

winform.onClose = function(hwnd,message,wParam,lParam){
    Detach(winform.static.hwnd);
    DestroyChart();
}


winform.show();
win.loopMessage();
return winform;


同上的代码, 只需要将图表格式改为

Attach(winform.static.hwnd,13);//kType3DSurface=13 3维曲面图

image.png

2020-04-19   #12

第九例: 分裂图

image.png

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="创建";left=0;top=420;right=160;bottom=470;db=1;dl=1;z=2};
button2={cls="button";text="画图";left=183;top=420;right=343;bottom=470;db=1;dl=1;z=3};
button3={cls="button";text="画图2";left=600;top=420;right=760;bottom=470;db=1;dl=1;z=4};
static={cls="static";text="Static";left=0;top=0;right=760;bottom=407;db=1;dl=1;dr=1;dt=1;notify=1;transparent=1;z=1}
)
/*}}*/

var dll = ..raw.loadDll("\res\CChartu.dll","ccshare","cdecl");
Attach = dll.api("?Attach@Classless@@YAHPAUHWND__@@H@Z", "int(addr hwnd,int)");//int __cdecl Attach(struct HWND__ *)
CreateChart = dll.api("?CreateChart@Classless@@YAXXZ", "void(void)");
DestroyChart = dll.api("?DestroyChart@Classless@@YAXXZ", "void(void)");
SetType = dll.api("?SetType@Classless@@YA_NH@Z", "byte(int)");//bool __cdecl SetType(int)
//静态回调函数
SetFieldFcn = dll.api("?SetFieldFcn@Classless@@YAXP6ANNN@Z@Z", "void(pointer fun)");//void __cdecl SetFieldFcn(double (__cdecl*)(double,double))
SetPlotRange = dll.api("?SetPlotRange@Classless@@YAXNNNN@Z", "void(double, double, double, double)");//(void __cdecl SetPlotRange(double,double,double,double))
ReDraw = dll.api("?ReDraw@Classless@@YAXXZ", "void(void)");//void __cdecl ReDraw(void)
SetTitle = dll.api("?SetTitle@Classless@@YAXPB_W@Z", "void(ustring title)");//void __cdecl SetTitle(wchar_t const *)
SimpleMsgLoop = dll.api("?SimpleMsgLoop@NsCChart@@YAHXZ", "void(void)");

//ResizePlots = dll.api("?ResizePlots@Classless@@YAXH@Z", "void(int)");//void __cdecl ResizePlots(int) 

ResizePlots = dll.api("?ResizePlots@Classless@@YAXHHH@Z", "void(int,int,int)");//void __cdecl ResizePlots(int) 
AddCurve = dll.api("?AddCurve@Classless@@YAHPAN0HH@Z", "int(struct,struct,int,int)");//int __cdecl AddCurve(double* ,double*,int,int); 
AddAxis = dll.api("?AddAxis@Classless@@YAXHH@Z", "void(int, int)");//void __cdecl AddAxis(int,int)

        
winform.static.onEraseBkgnd  = function(hwnd,message,wParam,lParam){
    return 0;//禁止擦除背景
};


CreateChart();
Attach(winform.static.hwnd,9);//kTypeSplit=9 分裂视图
ReDraw();

//ResizePlots第一个参数mode表示分裂的模式。查看Chart.h文件头部被注释掉的代码可知:mode=0表示不分裂;mode=1表示行列分裂;mode=2表示左一右二分裂;mode=3表示左二右一分裂;mode=3表示上一下二分裂;mode=4表示上二下一分裂
//第二个参数nRows表示分裂的行数,第三个参数nCols表示分裂的列数。这两个参数只有当mode=1时候才起作用,其它时候被忽略
ResizePlots(2,1,2);
var x = { double arr[200] = {0} };
var y = { double arr[200] = {0} };
for(i=1;200;1){
	x.arr[i] = i ;
	y.arr[i] = 5.0*math.sin(i*2.0*3.14/360.0*3.0) ;
}

AddCurve(x,y,200,0);
AddAxis(0,0);
for(i=1;200;1){
	y.arr[i] = 2.0*math.sin(i*1.0*3.14/360.0*3.0) ;
}
AddCurve(x,y,200,1);
AddAxis(0,1)

for(i=1;200;1){
	y.arr[i] = math.sin(i*6.0*3.14/360.0*3.0) ;
}
AddCurve(x,y,200,2);
AddAxis(0,1)


SetTitle("分裂图");
ReDraw();


winform.show();
win.loopMessage();
return winform;


2020-04-28   #13

借宝地说句话,博主的网站在我的收藏夹里很久了.

本人非码农,普通职场小白.最近学了Python的pandas知识,对Python其他的编程没有什么概念,因此打包或者做个界面比较苦手.

我百度到可以用aardio给Python加个界面,然后调用.py脚本,甚至发布的时候带上pandas的文件之类的,这样可以换个电脑使用.

不知道博主有没有研究.

2020-04-28   #14

arrdio操作excel通过之前你介绍的libxl会有收费提示,用com操作excel和VBA差不多,

2020-04-28   #15

额,想换行变成了发送...然后现在我用pandas汇总计算excel相当方便,就是界面是命令行的话,我效率还是不高.所以打算再学点aardio 配合py脚本,就能做个小的成品了.

目前还没开始研究aardio..因为这种正规的做软件的知识,我很贫乏.所以先问下博主有没有兴趣,aardio调用py,最后是有第三方库的用法.我aardio作者有回帖,但是没有形成一个体系,所以我这个照虎画猫的人..更加看不懂了

2020-04-28   #16

回复#15 @周山下樵夫 :

你说的论坛的回复不成体系其实有所误解,你要知道我们毕竟不是 python 论坛,也要理解python是一个庞大复杂的开发环境,使用python的每个模块遇到的问题可能都不一样,例如有的模块引用失败是少复制了文件,引用了错误的位置,或者把64位当32位使用了,作为aardio的论坛,很难把使用python可能遇到的所有问题都包含进去,而且目前来说我遇到的询问 python 这类问题的,基本上分析了以后,大多数都发现问题出在 python 本身的使用上面,而不是 aardio 调用 python 这个环节。

aardio 中你使用任何一个扩展模块,只要一句import 调用就可以了,不需要任何复杂的操作,不存在版本碎片化的问题,也没有不同运行环境之间相互兼容的问题要处理,但 python 不是这样,python很复杂。例如pip,anaconda这些安装的模块,有时候你直接复制过去用不了,即使是python本身提供的运行环境都会出现相互不兼容的问题,并且非常麻烦,你用其他python打包工具也会遇到这些头疼的问题。

实际上 aardio 调用 python 的范例和文档是比较多的,
aardio 开发环境中就自带了几十个 aardio 调用 python的范例,
每一个范例我都写了详细的注释,从怎样引用 python 模块,到 python的基础语法都有介绍。也详细的介绍了 aardio 与 python 怎样交互。


python.png
实际上就以aardio论坛python版块的几个典型问题来说,
在 aardio 自带的范例、文档中都有非常详细的说明。这里我就复制几个关键的要点:

1、在aardio 中添加引用模块的目录其实非常简单,代码如下: py.appendPath("C:\Python34\Lib\site-packages\");


2、如果引用模块失败,那么你需要检查一下你引用的模块适不适合你运行的解释器版本,aardio 使用的是32位python,所以模块应当支持32位python解释器,aardio 中的 python   解释器实际上就是python官方提供的解释器环境,实际上你可以在 aardio 中调用 py.run(); 启动一个python.exe相似的环境,并且里面会显示python解释器的版本信息。


3、如果仍然引用模块失败,那么你可能需要联系该模块的作者,或者查看该模块的手册,是否需要安装其他的dll,或者其他的运行时等等,或者是否有任何特别的要求或限制。

这些知识 aardio 很难“形成一个体系”地提供给你,因为我们都不知道你遇到的具体问题是什么,发生在哪个环节,以论坛里的帖子来说 - 把 python 3.6的模块放到python 3.4 里都用不了 - 这真的不是 aardio 的锅啊。

2020-04-28   #17

回复#16 @jacen :

感谢回复. 还是实践出真知,待我把PY脚本都写完了,立马转头到aardio的学习.

普普通通的办公室人员,我最多的也就是一些数据的汇总计算等等,最近从excel的函数学习到vba后来到Python,最近接触了sql,感觉打开了新世纪的大门.

其实学的越多,越觉得自己只是学了皮毛,毕竟我还只是使用轮子还要看教程的人.

感谢回复.再次感谢

13 天前   #18

非常感谢,很好的教程!

登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前正在学aardio+halcon机器视觉.
Sciter中文在线文档Sciter在线学习文档
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
C大Aardio论坛:Aar爱好者论坛
简码教程网:简码编程
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...