Quantcast
Channel: C++博客-所有随笔
Viewing all 7880 articles
Browse latest View live

tizen开发基础设置


POJ 1099 -- Square Ice

VIM 插件 NERDTree 使用笔记

VC2008在WIN8下安装后出现.net 组件未加载解决方法

组合模式,为统一和区分“部分-整体关系”使用树状结构来管理对象节点。

$
0
0
关于组合模式,JS的DOM、文件系统的目录系统、mp4的一些demux实现都用到了这个模式。
不过我觉得用的比较好的是cocos2d-x引擎,它里面有很多的CCNode就是组合模式的实际实现.由于CCNode的头文件比较长,就不在这里粘贴了。
关于Cocos2d-x的组合模式原文见这里:http://zilongshanren.com/blog/2012/11/05/cocos2d-x-design-patterns-7-composite/

一棵树一般只包含一个根,若干树干和大量的叶子。同时,树干长在树根上,树叶长在树干上。(PS:这有点废话了,不过读者莫急,耐着性着往下看。)对应于Cocos2d-x里面,就是一个游戏有一个主场景GameScene,它是树根,然后它有若干个树干(GameLayer、HudLayer、InputLayer、BackgroundLayer和LevelLayer等),最后,每一个树干又包含若干个树叶(比如sprite、particles、font、TiledMap nodes、etc)


pasting
































UML图:


代码我不自己写了,见多了但是发现这个模式除了在框架程序里面用之外不太在别的地方使用,所以自己也不去单独实现了,下面的代码原文摘自:http://www.cnblogs.com/tiandsp/archive/2012/06/26/2563575.html

源码:


#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Composite
{
public:
    Composite():_name(""){}
    Composite(string name):_name(name){}
    virtual ~Composite(){}

    virtual void operation()=0;    
    virtual void add(Composite*){}
    virtual void del(Composite*){}
    virtual Composite* find(int index){return NULL;}

protected:
    string _name;
};

class Leaf : public Composite
{
public:
    Leaf(){}
    Leaf(string name){_name=name;}
    virtual ~Leaf(){}
    void operation(){cout<<_name<<endl;}
};

class subComposite : public Composite
{
public:
    subComposite():level(0){}
    subComposite(string name):level(0){_name=name;}
    virtual ~subComposite(){}

    void add(Composite*);
    void del(Composite*);
    Composite* find(int index);
    void operation();

private:
    vector<Composite*> v_pcom;
    int level;
};

void subComposite::add(Composite* com)
{
    level++;
    v_pcom.push_back(com);
}

void subComposite::del(Composite* com)
{
    v_pcom.pop_back();
}

Composite* subComposite::find(int index)
{
    return v_pcom[index];
}

void subComposite::operation()
{
    for(int i=0;i<level;i++)
        cout<<"+";
    cout<<_name<<endl;
    vector<Composite*>::iterator it;
    for (it=v_pcom.begin();it!=v_pcom.end();it++)
    {
        (*it)->operation();
    }
}

int main()
{
    Composite* psubcom  = new subComposite("动物");
    Composite* psubcom1 = new subComposite("非哺乳动物");
    Composite* pleaf1   = new Leaf("鸟");
    Composite* pleaf2   = new Leaf("鱼");
    Composite* psubcom2 = new subComposite("哺乳动物");
    Composite* pleaf3   = new Leaf("人");
    
    psubcom1->add(pleaf1);
    psubcom1->add(pleaf2);
    psubcom2->add(pleaf3);
    psubcom->add(psubcom1);
    psubcom->add(psubcom2);
    psubcom->operation();

    delete pleaf1;
    delete pleaf2;
    delete pleaf3;
    delete psubcom1;
    delete psubcom2;
    delete psubcom;

    system("pause");
    return 0;
}


何清龙 2014-01-03 16:29 发表评论

委托模式,被调用者的执行动作交给另一个对象实际操作,使用聚合代替继承

$
0
0
委托模式的作用是将一个接口的实现委托给另一个内部对象,这使得我们可以用聚合来替代继承,不必用继承的方式去实现具体动作,而把这个具体实现留给聚合的内部对象去实现。


#include <iostream>
class RealPrinter { // the "delegate"
public:
    void print() { 
        printf("I'll really print something"); 
    }
};
 
class Printer { // the "delegator"
public:
    Printer(){
        p = new RealPrinter(); // create the delegate 
    }
    ~Printer(){
        delete p;
    }
    void print() { 
        p->print(); // delegation
    }
private:
    RealPrinter *p;
};
 
int main() {
    Printer *printer = new Printer();
    printer->print();
    return 0;
}
 


何清龙 2014-01-03 17:05 发表评论

shell应用(5): 自动生成并安装服务脚本

$
0
0
   一般地,当在目标机器编译安装某个服务程序后,为了使服务能开机自启动和关机自停止,则需要将其添加为系统服务。但不同的Linux系统管理服务的方法不同,如Ubuntu使用update-rc.d命令,而RedHat则使用chkconfig命令。因此为了能自动识别系统的类型,减少人工控制,编写了一个简单的autosrv脚本,要求至少1个最多2个参数,特点如下:
   ● 第1个参数只能为install或uninstall,表示安装或卸载服务。
   ● 第2参数是可选的,表示系统名称,如果没有指定,那么会自动识别,若出现提示错误,则表示应该要显式指定系统名称了。  
  1#! /bin/bash
  2# autosrv
  3
  4if [ $# -lt 1 ]; then
  5    echo "Usage: $(basename "$0") install | uninstall [sysname]"
  6    exit
  7elif [ "$1" != "install" -a "$1" != "uninstall" ]; then
  8    echo "The first parameter must be install or uninstall" 
  9    exit
 10fi
 11
 12action=$1
 13sysname=$2
 14
 15if [ -z "$sysname" ]; then
 16    sysname=`lsb_release -a | sed -n '2p' | awk '{if($0~/[Uu][Bb][Uu][Nn][Tt][Uu]/) print "ubuntu"; else if($0~/[Dd][Ee][Bb][Ii][Aa][Nn]/) print "debian"; else if($0~/[Rr][Ed][Dd][Hh][Aa][Tt]/) print "redhat"; else if($0~/[Cc][Ee][Nn][Tt][Oo][Ss]/) print "centos"; else print ""}'`
 17    if [ -z "$sysname" ]; then
 18        echo "Unknown system, you can explicitly specify it with the second parameter to retry"
 19        exit
 20    fi
 21    echo "Current system is $sysname"
 22fi
 23
 24create_file_ubuntu_debian()
 25{
 26ca<< END > srv_name
 27#! /bin/bash
 28. /lib/lsb/init-functions
 29
 30END
 31cat srv_name.body >> srv_name
 32}
 33
 34create_file_redhat_centos()
 35{
 36cat << END > srv_name
 37#! /bin/bash
 38#chkconfig:2345 90 10
 39#description:srv_name
 40
 41. /etc/rc.d/init.d/functions
 42
 43END
 44cat srv_name.body >> srv_name
 45}
 46
 47copy_file()
 48{
 49    cp srv_name /etc/init.d/srv_name
 50    chmod u+x /etc/init.d/srv_name
 51}
 52
 53remove_file()
 54{
 55    rm -f /etc/init.d/srv_name
 56}
 57
 58install_ubuntu_debian()
 59{
 60    create_file_ubuntu_debian
 61    copy_file
 62    update-rc.d srv_name defaults 90 10
 63}
 64
 65uninstall_ubuntu_debian()
 66{
 67    update-rc.d -f srv_name remove
 68    remove_file
 69}
 70
 71install_redhat_centos()
 72{
 73    create_file_redhat_centos
 74    copy_file
 75    chkconfig --add srv_name
 76}
 77
 78uninstall_redhat_centos()
 79{
 80    chkconfig --del srv_name
 81    remove_file
 82}
 83
 84case "$sysname" in
 85    ubuntu|debian)
 86    if [ "$action" = "install" ]; then
 87        install_ubuntu_debian
 88    else
 89        uninstall_ubuntu_debian
 90    fi
 91    ;;
 92
 93    redhat|centos)
 94    if [ "$action" = "install" ]; then
 95        install_redhat_centos
 96    else
 97        uninstall_redhat_centos
 98    fi
 99    ;;
100
101    *)
102    echo "Currently only support ubuntu, debian, redhat and centos system"
103    exit
104    ;;
105esac
   从上可知,自动识别的方法是获取lsb_release -a返回的文本再使用awk来匹配ubuntu,redhat,debian,centos这几个子串(忽略大小写)。要注意的是,返回的文本可能有所不同,当系统安装了LSB模块时,返回结果如下
   没有安装时,返回结果如下
   无论哪种情况,要提取分析的都是第2行文本,因此使用了sed -n '2p'。srv_name.body是用于生成最终服务脚本的部分代码文件,通常包含了start,stop,status,restart几个函数,只是没有包含前面的一部分,而这部分则由autosrv脚本来根据不同的系统生成不同的代码。


春秋十二月 2014-01-03 17:11 发表评论

2013总结

$
0
0

2013,对我来说,这是特殊的一年,因为在这一年,我步入30岁了.无论如何,这都是无法被忽视的.

总的来说,2013年总共只做了3件事情:
1.脱离了这家为之奋斗多年的公司,5年,这对于职业生涯来说,不长也不短;
2.开发了几款游戏,并完善了游戏引擎.计划中,这件事情本该在2010年做的事情,当然,现实总不会如人意的;
3.开发了一款音视频解决方案,支持P2P以及服务器中转,支持H264,AAC.


关于第一件事,我不愿多说,个中滋味,只有当事人自己才能知道.对于这五年,如果非要做一个评价,那只有一句话可以表达:往事不堪回首.当然,这么说,并非就是说这五年是一无是处,不是这样的.任何事情都是有好的一面和不好的一面.
不好的一面是,这个项目做得并不轻松,而且也并没有向着健康的方向发展,各种原因,我只能说,现实并不是那么单纯和纯粹的.
好的一面是,我有了一个长足的提高和提升,这正是我想要的.很高兴的一点是,我很好的认清了一个人.失败并不是一件坏事情,在失败中,我们能够得到许多的教训和经验,所以失败要趁早.失败,也并不可怕,可怕的永远都是爬不起来.失败了,就要爬起来,吸取教训,再来.否则,再多的失败也是没有意义的.


关于第二件事,这个游戏引擎是一个2D的游戏引擎,当初是基于HGE改的,然后吧,我这人看的引擎又颇多,所以其中杂糅了许多其他游戏引擎的东西.比如Ogre3d,CEGUI,popCap,GameBryo...每个引擎都有好的和不好的东西,而有的时候,好的东西又不是合适的.所以,这一过程是纠结而又痛苦的.
我当初用了一个月的时间作出了引擎的雏形,并用它开发了一个连连看.其时,引擎并不是完善的,发生了一些不愉快的事情,整个进程就停滞了下来.今年初,我研读并重构了之前手下人拿引擎开发的游戏,对引擎进行了一个补足和改进.这时候,游戏引擎才算是一个完整的游戏引擎.
任何一个游戏引擎和框架,如果没有经历过一两个应用程序开发的考验,它就不是一个好东西,它不过是一个空中楼阁,站不住脚的.不论是引擎也好,应用程序也好,它们只有在应用当中才能发现自己的不足,才能找寻到改进的动力.像GameBryo,cocos2d,它们都是一个游戏的开发产物,它们更为讨好开发者,尽管如此,他们也还是有需要改进的余地.
现在的游戏引擎,跨平台也变成了考量的一个标准.后面,引擎的跨平台也是要做的一件事情.当然,这需要需求来推动,如果有这个必要的话,我就会做这个事情了.


关于第三件事,前不久有人问我的职业是什么.我说我是:互联网娱乐开发者.就是因为我掺和了一下音视频的领域,在此之前,我会说我是:网络游戏开发者.当然,我对这一领域的关注也不是从今年开始的,很早,至少四五年前,我就开始在读libjingle的源代码,去年开始在读webrtc的代码.虽说,这是一场没太大信心的战,但是,至少我是有所准备的.
最开始,我在和编解码器在较劲.
最开始支持的视频编解码器是:DivX和xvid.但是显然他们是不适用的,后来发现H264是行业标准.H264可以说是xvid升级版,在高压缩率下能够很好的保证画面质量,所以H264不成行业标准,舍我其谁.
音频编码器最开始只支持iLBC,但是音频又区分为:语音和音乐.这样两种质量水平.像iLBC和Speex都是这样的语音级别的编解码器,也就打打电话聊聊天就可以了,如果你想要听音乐,唱K,抱歉,他们的质量就不行了.这时候就需要AAC这样的编码了.
最终确立的标准音视频编码是:H264+AAC.为了达到一个合适的码流,比如音频,我总共听了好几百组的录音,最终确定了其参数.视频我都不知道我折腾了多久.我是发扬了愚公移山的精神,最终总算是把这一块给搞定了.
搞定了编解码器,这还不算完,这还只是一个开始而已,网络传输这一块的水更深,折腾了好几个月,首先支持了基于UDP协议的RTP/RTCP协议,然后还要做重传啊.总之还是发扬的愚公移山的精神,把能够试的方法都试遍了,这样做有一个好处,好的不好的都清楚明白了,之后最终要怎么做,就可以做到了然于胸了.不过,这一块还没结束,我觉得是远远没有结束,之后要走的路还很长.
在这里要感谢Google,他们开源了webrtc,这是一个巨大的宝库.它使得音视频这一块的门槛降低了下来,虽然这样说,不过它实在是太复杂了,要把webrtc给吃透也并非轻易之举.所幸我花费了好几年的时间读libjingle,故而webrtc读起来也就相对轻松许多了,可是这块领域实在是太大了,要吃透它还是需要很长时间.而且,我也暂时没有打算要完全的把webrtc应用到项目中,因为webrtc是重型的,而我的项目本身是轻量级的,只需要取其精华就够了.
做这一块,最大的收获是,我更为深刻的理解了TCP和UDP.有段时间,我试着用TCP传输,虽说最后的结果是:这条路是行不通的.但是这次尝试中,我发现了我TCP服务器底层的好几个隐藏已久的bug,只有在高负荷下才会出现的bug.另外还有一个深刻的觉悟,UDP想要不丢包,那是痴人说梦.准确的说,互联网通讯想要不丢包,那是不可能的.


2014年,我还有很多艰难的路要走,而且人生以后的路也会有许多的艰难困苦.但是我始终信奉着:艰难困苦,玉汝于成.只要心中怀着斗志,不服输,不气馁,没有什么是克服不了的.
华丽的辞藻说再多也是没用的,我这人也不是那么喜欢说花哨话,因为我深知,话说得再漂亮,也不能为我的人生改变什么,也不能帮我解决任何问题,唯有脚踏实地,勤奋努力,一步一个脚印的走下去,这才是王道.
2012和2013年,因为一些事情,我变得极度的消极.而且这种消极到现在都还没有完全的根除,人的一生就这么长,不能够总这样消极下去,不经意间,人生就到了尽头.到死的时候,自己还因为消极而一事无成,糊里糊涂的过一辈子,那绝对不是一件好的事.
2014年,我必须要做回我自己,我必须要为我这仅有的一生去写出一份满意的答卷.
2014年,没啥好说的,唯有加油!



杨粼波 2014-01-03 17:50 发表评论

go语言开发环境LiteIDE自动完成功能失效解决方法

$
0
0

比较过LiteIDE和eclipse+goclipse, 最后还是觉得LiteIDE简洁.但发现其自动完成功能偶尔会出现, 随即搜索, 发现其使用gocode的一个开源项目开了一个简单服务, 为各种IDE提供高速的自动完成服务.在goclipse环境发现其报了版本不匹配的错, 而最近go的更新也是很频繁, 所以觉得应该是gocode版本过老造成.

搜索到gocode的开发页面https://github.com/nsf/gocode  结果发现nsf这家伙居然也是luaBridge的作者.

下载最新的gocode代码, 解压后, 编译:

windows下命令行

go build gocode.go autocompletecontext.go autocompletefile.go client.go config.go cursorcontext.go decl.go declcache.go formatters.go os_windows.go package.go ripper.go rpc.go scope.go server.go utils.go

linux下, 只需要将os_windows.go换为os_posix.go即可

编译完成后, 将可执行文件gocode覆盖到liteIDE下的同名文件, 杀掉gocode进程后重启liteIDE即可

image



战魂小筑 2014-01-03 19:10 发表评论

2013

$
0
0
      时间好快,不知不觉就步入了2014年,回顾2013,有收获也有遗憾,最大的收获就是遇到了“她”,真的感谢“她”在我还一无所有的时候选择了我,虽然现在的我还不够优秀,但今后的日子我会尽自己最大的努力让你幸福。每每打电话回家的时候总有点愧疚感,父母这么大年纪还在起早摸黑的干活,希望能早日让他们停下来安详晚年。2013遗憾的是技术积累不够,总感觉自己很忙,但却成长较慢,很多时候自己都认为存在的都是合理的,没有多思考下为什么这样设计,会不会有更好的设计实现。2014希望自己能在技术上有所积累,希望自己能静下心来专注做好该做的事情,不能太着急,慢慢积累,或许10年能专注地做好一件事也已经很不错了。

周强 2014-01-03 21:17 发表评论

C语言中的联合体和结构体

$
0
0
  先说结构体
 
   结构体的定义很简单,注意这里并不分配空间
 
   //这里只是定义一个简单的结构体类型,并不为其分配内存空间
 
   struct student {
 
   int num;
 
   char name[20];
 
   };
 
   定义结构体变量:
 
   struct student stu;
 
   当然了,更简单的方法是用defined,这里就不细说了,因为本篇文章重点不在这里。下面打印一下struct和内部变量的大小
 
   struct student stu;
 
   printf("struct size->%lu\n", sizeof(stu));//结果是24
 
   printf("int size->%lu\n", sizeof(int));//结果是4
 
   printf("char[20] size->%lu\n", sizeof(char[20]));//结果是20
 
   很好4+20=24,但是如果我们在结构体里边再增加一个变量sex:
 
   struct student {
 
   int num;
 
   char sex;
 
   char name[20];
 
   };
 
   在次打印变量大小:
 
   struct student stu;
 
   printf("struct size->%lu\n", sizeof(stu)); //28
 
   printf("int size->%lu\n", sizeof(int)); //4
 
   printf("char size->%lu\n", sizeof(char)); //1
 
   printf("char[20] size->%lu\n", sizeof(char[20])); 20
 
   这次会发现4+1+20并不等于28,如果将char name[20]改成char name[23],struct大小仍为28,但是如果将int num;夹在char sex;和char name[23];之间定义:
 
   struct student {
 
   char name[23];
 
   int num;
 
   char sex;
 
   };
 
   struct大小将变成32,这是为什么呢?
 
   这就和操作系统的内存管理有关了,操作系统为了方便管理内存,一般是以一定数量的字节为单位进行管理的,比如这里是以以四字节为单位的,也就是说如果在struct中出现不足4字节整数倍的变量,就会为其分配四字节整数倍的空间,如果下一个变量仍不足四字节整数倍,就会和上边的变量"凑合一下",共用某一个四字节。当然,内存管理设计的东西不是一句两句能说清楚的,这里只是简单地介绍一下,抛砖引玉,更深的东西大家可以自行学习……
 
   至于union,联合体或者叫做共用体,union使用方法和struct非常相似,唯一的不同是struct变量所占内存长度是各成员的内存之和,而union内存长度则是占内存最大的成员的长度,也就是说union的几个成员变量是共用一块内存的。托福答案
 
 

HAOSOLA 2014-01-03 23:16 发表评论

D语言排名持续升上升

Open Cascade DataExchange IGES

$
0
0

Open Cascade DataExchange IGES

eryar@163.com

摘要Abstract:本文结合OpenCascade和Initial Graphics Exchange Specification来对IGES格式进行详细说明,理解IGES格式的结构,进而方便对OpenCascade中IGES格式文件读写的实现进行理解。

关键字Key Words:IGES、Open Cascade、Data Exchange

一、引言 Introduction

目前市面上的CAD系统都有自己的数据文件,各个系统之间的数据结构和格式各不相同,这样极大影响了设计和制造部门之间或企业之间的数据传输和程序衔接的自动化,同样给CMM和CAD/CAM的数据通信带来困难。因此,迫切需要数据交换文件格式的标准化。

产品数据的正确交换可以使双方不必重建数据,提高效率。产品数据交换的通常做法是使用数据交换接口,即需要交换的每一系统与标准数据格式(中性格式)之间开发双向转换接口,两系统通过中性格式进行交换。

20世纪70年代末80年代初以来,国际上已做了大量数据交换标准的研究、制定工作。自1980年最早出现IGES1.0后,又产生了许多其他规范如XBF、SET、VDA-FS、PDDI、ESP、CAD*I、PDES等。这些规范各有不同的目的和使用范围,同时也存在着各种问题。在这些规范中,应用最成熟、最广泛的是IGES(Initial Graphics Exchange Specification)。ISO在上述规范的基础上,制定了新的数据交换标准STEP(Standard for the Exchange of Product Model data),其目的是覆盖过去已经存在的规范的功能,并解决实际应用中存在的问题。

IGES是在美国国家标准局的倡导下,由美国国家标准协会(ANSI)组织波音公司、通过公司等共同商议制订的,1980年公布第一版,以后不断完善和扩充,版本不断升级,从IGES1.0仅包含二维图形到IGES3.0支持曲面和三维线框几何,IGES4.0版支持构造实体几何(CSG)造型技术,IGES5.0支持边界表示(BRep)造型技术。目前几乎所有有影响的CAD/CAM系统都配有IGES接口,如Pro/E、CATIA、OpenCascade等。它由一系列产品的几何、绘图、结构和其他信息组成,可以处理CAD/CAM系统中的在部分信息,是用来定义产品几何形状的现代交互图形标准。

本文结合OpenCascade和Initial Graphics Exchange Specification来对IGES格式进行详细说明,理解IGES格式的结构,进而方便对OpenCascade中IGES格式文件读写实现的方式进行理解。

二、IGES规范 the Initial Graphics Exchange Specification

IGES是一种按特定的文件结构安排的数据格式,用来描述产品的设计和生产信息,可用它来交换CAD/CAM系统中以计算机可读的形式产生和存储的各种信息。标准的IGES文件包含固定长ASCII码(Fixed Format)、压缩的ASCII码(Compressed Format)和二进制(Binary Format)三种格式。

固定长ASCII码的IGES文件每行为80个字符,整个文件分为五段(Section):开始段(Start)、全局段(Global)、元素索引段(Direction Entry)、参数数据段(Parameter Data)和结束段(Terminate)。如图2.1所示:

wps_clip_image-21659

Figure 2.1 Fixed File Formats of ASCII IGES File

段标识符位于每行的第73列,74~80列指定为用于段每行的序号。序号都以1开始,且连续不间断,其值对应该段的列数。段标识符是这样规定的,字符“B”和“C”表示标记段;“S”表示开始段;“G”表示全局段;“D”表示元素索引段;“P”表示参数记录参数记录段;“T”表示结束段。固定长的ASCII格式的IGES格式的大概结构如下图2.2所示:

wps_clip_image-17890

Figure 2.2 General file structure of the Fixed Format

下面结合具体的IGES文件来对每个段进行说明,仅包含一个点的示例文件如下所示:

wps_clip_image-18936

Figure 2.3 IGES demo file Generated by OpenCascade

开始段Start Section:该段是为提供一个可读文件的序言,主要记录图形文件的最初来源及生成该IGES文件的相同名称。IGES文件至少有一个开始记录。

全局段Global Section:主要包含前处理器的描述信息及为处理该文件的后处理器所需要的信息。参数以自由的格式输入,用逗号分隔参数,用分号结束一个参数。主要参数有文件名、前处理器版本、单位、文件生成日期、作者姓名及单位、IGES的版本、绘图标准代码等。如图2.3中的2~5行。

元素索引段Directory Entry Section:该段主要为文件提供一个索引,并含有每个实体的属性信息,文件中每个实体都有一个目录条目,大小一样,由8个字符组成一个域,共20个域,每个条目占用两行。如图2.4所示:

wps_clip_image-16738

Figure 2.4 Format of the Directory Entry(DE) Section in the Fixed Format

每一项内容如下:

l 元素类型号(Entity Type Number):说明元素的类型;

l 参数指针(Parameter Data):说明该元素的参数在参数数据段的开始序号;

l 图层:存放图层名和它的指针;

l 参数记录数(Parameter Line Count):数字代表该元素的参数在参数数据段的行数;

参数数据段Parameter Data Section:该段记录了每个元素的几何数据。根据每个图形元素参数数的多少,决定它将有几行。如图2.3所示,116为点,它有三个数据X,Y和Z,分别为1,2,3。

结束段Terminate Section:只占一行,在前32个字符里,分别用8个字符记录了开始段、全局段、索引段和参数数据段的段码和每段的总行数。第33~72个字符没有用到。最后8个字符为结束段的段码和行数。

三、OpenCascade中IGES读写 OpenCascade IGES Reader/Writer

OpenCascade中提供IGES的程序接口有如下功能:

l 加载IGES文件到内存;loading IGES files into memory;

l 检查IGES文件的一致性;checking IGES files consistency;

l 转换IGES文件到OCCT的形状;translating IGES files into OCCT shapes;

l 转换OCCT的形状到IGES文件;translating OCCT shapes into IGES files;

l 访问IGES文件模型;accessing the IGES model;

l 选择IGES文件模型中的实体;selecting entities from the IGES model;

l 访问IGES文件模型中的每个实体;accessing each entity in the IGES model;

实现上述功能的包是IGESControl,可处理的IGES文件格式的版本为5.3。读取IGES文件实体到OCCT形状的方法如下所示:

 

Standard_Integer ReadIGES(const Standard_CString& aFileName,
                          Handle(TopTools_HSequenceOfShape)
& aHSequenceOfShape)
{
    IGESControl_Reader Reader;

    Standard_Integer status 
= Reader.ReadFile(aFileName);

    
if (status != IFSelect_RetDone) 
    {
        
return status;
    }
        
    Reader.TransferRoots();
    
    TopoDS_Shape aShape 
= Reader.OneShape();     
    aHSequenceOfShape
->Append(aShape);

    
return status;
}

将OCCT形状转换为IGES文件方法如下所示:

Standard_Boolean SaveIGES(const Standard_CString& aFileName,
                          
const Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape)
{

    IGESControl_Controller::Init();
    IGESControl_Writer ICW (Interface_Static::CVal(
"XSTEP.iges.unit"),
               Interface_Static::IVal(
"XSTEP.iges.writebrep.mode"));
    
    
for (Standard_Integer i=1;i<=aHSequenceOfShape->Length();i++)
    {
        ICW.AddShape (aHSequenceOfShape
->Value(i));
    }

    ICW.ComputeModel();
    Standard_Boolean result 
= ICW.Write(aFileName );
    
return result;
}

 

四、程序示例 Example Code

通过将OpenCascade中的形状数据导出到IGES文件,结合IGES规格书,可以方便对IGES格式的理解。如下程序所示为将简单的点、线和圆导出到IGES文件:

 

/*
*    Copyright (c) 2014 eryar All Rights Reserved.
*
*           File : Main.cpp
*         Author : eryar@163.com
*           Date : 2014-01-04 20:00
*        Version : 1.0v
*
*    Description : Export OpenCascade shape to IGES entities.
*
*      Key Words : OpenCascade, IGES, DataExchange
*                  
*/

#define WNT
#include 
<gp_Pnt.hxx>
#include 
<gp_Circ.hxx>

#include 
<TopoDS_Vertex.hxx>
#include 
<TopoDS_Edge.hxx>

#include 
<TopTools_ListIteratorOfListOfShape.hxx>

#include 
<BRepBuilderAPI_MakeVertex.hxx>
#include 
<BRepBuilderAPI_MakeEdge.hxx>

#include 
<IGESControl_Controller.hxx>
#include 
<IGESControl_Writer.hxx>


#pragma comment(lib, 
"TKernel.lib")
#pragma comment(lib, 
"TKMath.lib")
#pragma comment(lib, 
"TKBRep.lib")
#pragma comment(lib, 
"TKTopAlgo.lib")
#pragma comment(lib, 
"TKIGES.lib")


void SaveIges(const std::string& igesFile, const TopTools_ListOfShape& shapes)
{
    IGESControl_Controller::Init();
    IGESControl_Writer igesWriter;

    
for (TopTools_ListIteratorOfListOfShape si(shapes); si.More(); si.Next())
    {
        igesWriter.AddShape(si.Value());
    }

    igesWriter.ComputeModel();
    igesWriter.Write(igesFile.c_str());
}


int main(void)
{
    
// vertices.
    TopTools_ListOfShape vertices;
    TopoDS_Vertex theVertex 
= BRepBuilderAPI_MakeVertex(gp_Pnt(1.02.03.0));

    vertices.Append(theVertex);

    SaveIges(
"vertex.iges", vertices);

    
// edges.
    TopTools_ListOfShape edges;
    TopoDS_Edge theLine 
= BRepBuilderAPI_MakeEdge(gp_Pnt(3.04.05.0), gp_Pnt(6.07.08.0));
    TopoDS_Edge theCircle 
= BRepBuilderAPI_MakeEdge(gp_Circ(gp::XOY(), 9.0));

    edges.Append(theLine);
    edges.Append(theCircle);

    SaveIges(
"edge.iges", edges);

    
// put them together.
    TopTools_ListOfShape shapes;
    shapes.Append(theVertex);
    shapes.Append(theLine);
    shapes.Append(theCircle);
    
    SaveIges(
"shapes.iges", shapes);

    
return 0;
}

生成的IGES文件内容如下所示:

wps_clip_image-28112

Figure 4.1 Simple Fixed Format IGES File

结合下图4.2中实体类型号与实体类型的对应表可知,上图4.1中的元素索引D段可以看总共有三个实体,一个是类型号为116的点;一个是类型号为110的直线;一个是类型号为100的圆。

从数据参数P段可以看出116对应的点的坐标为(1,2,3);110对应的直线的两个端点坐标为(3,4,5)和(6,7,8);100对应的圆的数据为圆心在(0,0)半径为9的位于XY平面上的圆。圆的参数数据项每项数据说明见图4.3。

将IGES在OpenCascade中显示如图4.4所示。

wps_clip_image-6405

Figure 4.2 Curve and Surface Entities

wps_clip_image-14168

Figure 4.3 Parameter Data of Circle Entity in IGES

wps_clip_image-22491

Figure 4.4 IGES Entities in OpenCascade

五、结论 Conclusion

结合OpenCascade生成的IGES文件和Initial Graphics Exchange Specification来对IGES格式进行学习。

虽然目前许多CAD/CAM系统主要应用是在不同系统间交换工程图纸、零件模型、运动仿真和动态实验所需要的几何数据,装配或销售产品所需要的图形文件,但是IGES标准在具体应用中经常出现以下问题:

l 交换过程中会出现错误或数据丢失现象。由于IGES所支持的实体十分庞大,在实际应用中,每一个CAD/CAM系统不可能实现IGES支持的所有实体,而只能实现它所涉及的实体的交换,即只能实现IGES实体集的一个子集,但不同系统所实现的子集不可能完全相同。系统之间只能交换所实现子集的交集部分。

l 发送系统前处理器生成的IGES文件的实体类型超出了接收系统后处理器可能接受的实体类型范围,以及发送系统与接收系统之间实体类型集虽相同,但有关属性如颜色、字体、线型等代码不同,也将使部分数据丢失。

l IGES的目的只是传输工程图形及相应信息,它无法描述CIMS环境所需要的产品数据的全部信息。而且IGES对实体的定义是模糊的,这将造成各CAX系统对IGES中定义的实体有不同的理解,如相同的3D曲线功能会因不同软件的计算方式不同而使在使用IGES来执行图形交换时出现不同的曲线或丢失该曲线。

l IGES文件本身规模太大,影响数据文件的处理速度,使数据传输效率不高。

l 在转换数据的过程中发生的错误很难确定,常要人工去处理IGES文件,如在转换数据的过程中经常发生某个或某几个小曲面丢失的情况,这是要利用原有曲面边界重新生成曲面;某些小曲面(Face)在转换过程中变成大曲面(Surface),此时要对曲面进行裁剪。

六、参考资料 References

1. 李原,张开富,余剑锋. 计算机辅助几何设计技术及应用. 西北工业大学出版社. 2007

2. US PRO. Initial Graphics Exchange Specification .1997

3. OpenCascade. Data Exchange IGES Format User’s Guide. 2013

 



eryar 2014-01-04 21:35 发表评论

2013年终总结

$
0
0

2013年我就干了两件事情。第一件是gaclib,第二件是tinymoe

 

Gaclib终于做到安全的支持C++的反射、从XML加载窗口和控件了。现在在实现的东西则是一个给gaclib用的workflow小脚本,用来写一些简单的view的逻辑、定义viewmodel接口,还有跟WPF差不多的data binding。

 

Tinymoe是我大二的时候就设计出来的东西,无奈以前对计算机的理论基础了解的太少,以至于没法实现,直到现在才能做出来。总的来说tinymoe是一个模仿英语语法的严肃的编程语言——也就是说它是不基于NLP的,语法是严格的,写错一个单词也会编译不过。因此所有的函数都要写成短语,包括控制流语句也是。所以我就想了一想,能不能让分支、循环、异常处理和异步处理等等其他语言的内置的功能在我这里都变成库?这当然是可以的,只要做全文的cps变换,然后要求这些控制流函数也写成cps的风格就可以了。

 

目前的第一个想法是,等搞好了之后先生成javascript或者C#的代码,不太想写自己的VM了,然后就出一个系列文章叫做《看实例跟大牛学编译原理》,就以这个tinymoe作为例子,来把《如何设计一门语言》延续下去,啊哈哈哈哈哈。

 

写博客是一件很难的事情。我大三开始经营这个cppblog/cnblogs的博客的时候,一天都可以写一篇,基本上是在记录我学到的东西和我造的轮子。现在都比较懒了,觉得整天说自己在开发什么也没意思了,于是想写一些别的,竟然不知如何下手,于是就出了各种没填完的系列。

 

我觉得我学编程这13年来也是学到了不少东西的,除了纯粹的api和语言的知识以外,很多方法论都给我起到了十分重要的作用。一开始是面向对象,然后是数据结构算法,然后是面向方面编程,然后是函数式编程,后来还接触了各种跟函数式编程有关的概念,譬如说reactive programming啊,actor啊,异步啊,continuation等等。脑子里充满了各种各样的方法论和模型之后,现在无论写什么程序,几乎都可以拿这些东西往上套,然后做出一个维护也很容易(前提是有这些知识),代码也很简洁的程序了。

 

工作的这四年半里,让我学习到了文档和自动化测试的重要性,于是利用这几年我把文档和测试的能力也锻炼的差不多了。现在我觉得,技术的话工作应付起来是超级简单,但是自己对技术的热情还是促使我不断的研究下去。2014年应该研究的技能就是嘴炮了。



陈梓瀚(vczh) 2014-01-04 21:52 发表评论

qq邮箱outlook设置


软件开发随想之一

How to make thermal grease?

$
0
0
Thermal grease (also called thermal gel, thermal compound, thermal paste, heat paste, heat sink paste or heat sink compound) is a viscous fluid substance, originally with properties akin to grease, which increases the thermal conductivity of a thermal interface by filling microscopic air-gaps present due to the imperfectly flat and smooth surfaces of the components; the compound has far greater thermal conductivity than air (but far less than metal). In electronics, it is often used to aid a component's thermal dissipation via a heat sink.
As an example, I hereby mention heat sinks a little. I think this will give a brief view and ease the way to understand for readers. There are heat sinks in the picture below (one on the left in the picture made by aluminum and a fan, one is made in aluminum fins and six hot pipes with a fan inside, which has been already installed on the motherboard, one embedded in video card Sapphire HD 7750 Ultimate). The thermal grease in the picture is ST700, made by Balance Stars Co LTD. There three CPUs as well made by AMD.


The thermal grease is used between chips and heat sink to conduct the dissipated heat by the chip when working, especially at high loads, or too much heat may gathered and temperature increased greatly which will damage the chip or make it malfunction. The thermal grease is necessary because the air is a poor thermal conductor.

For comparison, the approximate thermal conductivities of various materials relevant to heat sinks in W/(m·K) are:

  • Air 0.024
  • Water 0.58
  • Unbranded grease typically 0.8; some silver-and graphite-based greases claim about 9
  • Aluminum oxide (surface layer on pure aluminum exposed to air) 20 ~ 40
  • Zinc oxide (used in diaper rash ointment) 35
  • Sodium Fluoride (primary active ingredient in most toothpastes) 132
  • Aluminum 217
  • Copper 408
  • Silver 421
  • Natural Diamond 1000 ~ 2200
  • beryllium oxide 330
  • aluminum nitride 170 ~ 210
  • silicon carbide 120 ~ 350
  • magnesium oxide 45 ~ 60
  • graphite 149 ~ 900

Metals are high thermal conductivity substance but also with high electrical conductivity, so cannot be used as to make thermal grease directly! Beryllium oxide (BeO) is high thermal conductivity but cannot be used to make thermal grease because it is toxic.


Aluminum nitride (AlN) is a replacement for BeO in this area because of non-toxic, high thermal conductivity, but not work well in practice . One reason is it reacts with water vapor in the air and generates corrosive ammonia (NH3), and this will damage circuit. The other reason, it reacts with oxygen in the air and its thermal conductivity degrades little by little. At last, AlN becomes aluminum oxide (Al2O3).

Sodium fluoride has a high thermal conductivity but toxic, so cannot be used to make thermal grease.

To make thermal grease, the necessary components are silicon oil, metallic oxide (generally using MgO), silicon carbide (SiC) and additives (such as silver, graphite). The components' granular size, purity are high parameter and should be seriously considered, as this may significantly influence grease's thermal conductivity. The last thing that we should consider is cost. Diamond is a high thermal conductivity and also high electrical insulation substance, which properties makes it an ideal substance to manufacture thermal grease but too expensive!

Hereby I prefer to use silicon oil, silicon carbide, and graphite. The viscosity of silicon oil should be in a range of 1000cs to 10000cs, while its purity should be no less than 98%. For SiC, its granular size shall be less than three micrometers (500nm ~ 1um would be better) and with its purity no less than 94%. In fact, graphite is an optional component. If you want to add a little graphite in silicon grease, the granular size of this additive should be no larger than one micrometer and its purity as high as to 99% or even higher. At the same time, never add graphite too much because of its high electrical conductivity.

Silicon oil, magnesium oxide with or without graphite can also be used to produce thermal grease and are widely use in real world. The pitfalls for MgO based thermal grease is it will gradually reacts with carbon dioxide (CO2) in the air and its thermal conductivity decreased little by little. Despite of this drawback, MgO is still be used to produce thermal grease vastly because it is not expensive and easy to purify.

Now, we can buy some silicon oil (about 10 dollars/kg, viscosity 10000cs), some SiC dust (about 8 dollars/kg, grain size less than 1um) and a bit graphite (about 10 dollars/kg, grain size less than 1um).


Warning: Mask must be worn properly when doing experiment, because silicon carbide and graphite dust may damage lungs once inhaled and damage eyes once contacted with!!!


As a comparison, let's see several popular brands in market.



DIY thermal grease has no luxuriant appearance.



Ok, let's a measure something - Floating points torture with all cores full load lasting for 5 minutes! (Warning: do not imitate, this may damage your CPU permanently)

Experiment: AIDA64, Win7 x64, Xeon 1225, AVC Nepoleon heat sink, Asus P8B75-V motherboard


room temperature 21 degrees, HY-STG1


room temperature 21.5 degree, Nano grease 7783



for the small packet  Stars 102 (2 cents / packet), very cheap, I did not test it.

----------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------

room temperature 18 degrees, Nano grease 7783 with some DIY [I added something]


rooms temperature 18 degree, DIY thermal grease (no graphite)


room temperature 18 degree, DIY thermal grease (added a bit graphite)


-------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------

Conclusion

Out of my expectation, the DIY thermal grease (with graphite) behaves very well!



Chipset 2014-01-05 18:07 发表评论

小麦创业记-2014-1-5

$
0
0
想记录自己的创业经历,已经好久了,一直在犹豫。开始创业已经半个月过去了,三年的打工经历,身上还带有一些对创业的不习惯,总想偷一下懒。
最近一边做一边在想,发现很多奇特的事;比如早上去练车,看见其他学员都想上前去推销,中午吃饭的时间也不放过机会。就跟《中国合伙人》里面的一样,“不能看到任何墙面”。
仔细观察身边,其实机会很大,任何人都是你的上帝,就看自己怎么去接触,我也慢慢的放下了心里的负担。


小麦 2014-01-05 22:19 发表评论

Tcl Tk Introduction

$
0
0

Tcl Tk Introduction

eryar@163.com

摘要Abstract:Tcl/Tck脚本可以很容易实现用户自定义的命令,方便的创建图形化的用户界面GUI,所以Tcl和Tk的应用领域几乎覆盖了图形和工程应用的全部范围,包括计算机辅助设计、软件开发、测试、仪器控制、科学可视化及多媒体方面。即可以使用Tcl/Tk实现AVEVA中的PML类似的功能,允许用户自己编写简单程序实现程序的二次开发。

关键字Key Words:AVEVA, PDMS, PML, Tcl/Tk, Script Modeling

一、PML of AVEVA

看到AVEVA的解决方案中有一个方便灵活的用户自定义语言PML(the AVEVA Programmable Macro Language),通过PML可以根据不同的用户需求来对程序进行扩展,而AVEVA则可以专注于核心模块的开发与完善。这对软件开发而言,是很有益处的,可以在满足各种用户多变的需求的情况下保证软件的质量。使用PML实现一个简单的窗口代码及效果如下图所示:

wps_clip_image-21292

Figure 1.1 Hello World Form code of PML

wps_clip_image-17853

Figure 1.2 A simple Form of PML

二、Tcl/Tk

Tcl表示“Tool Command Language”。在学习OpenCascade的过程中,看到OpenCascade的一个测试工具Draw Test Harness就是使用了Tcl/Tk来实现自定义的命令。通过自定义的命令,即可以对一些功能进行测试,如下图所示,使用简单命令,即可以生成图形:

wps_clip_image-12745

Figure 2.1 Draw Test Harness with Tcl/Tk

Netgen是一个用于网格剖分的程序,它的用户界面也是用Tcl/Tk来实现的,效果也不错,如下图所示:

wps_clip_image-1432

Figure 2.2 Pipe Model in Netgen

三、结论 Conclusion

Tcl和Tk一起为应用程序开发者和使用者提供了很多好处。首先是快速开发。很多有意思的应用程序完全可以用Tcl脚本编写。这样就可以在比C/C++或Java更高的层次上进行开发,Tk隐藏了C或Java程序员必须关注的很多细节。与低级工具相比,要使用Tcl和Tk所需要学习的知识更少,需要编写的代码更少。通过几个小时的学习,Tcl/Tk新手用户就可以创建有意思的用户界面,很多开发人员从其他工具集转而使用Tcl和Tk工具集后,应用程序开发所需要的代码数量和开发时间都减少了90%。

Tcl和Tk适于快速开发的另一个原因在于Tcl是解释语言,使用Tcl应用程序时,可以在运行中生成和使用新脚本,而无需重新编译和重启应用程序。

Tcl可以跨平台,这意味着在一个平台如Linux上开发的程序,在大多数情况下可以不加改动的在另一个平台上运行,如在Windows上或Macintosh上运行。

Tcl还是第一种拥有原生Unicode支持的动态语言。因此,Tcl可以处理这个世界上几乎所有的书面语言。

使用Tcl的另一个显著优点在于它和它的大多数扩展都是免费的开源软件,允许所有人免费下载、查看、修改及再发布。

另外,Tcl还可以让应用程序很容易地拥有强大的脚本功能。例如为要一个已经存在的程序添加脚本功能,您只需要实现几条新的Tcl命令,用来为应用程序提供相应的基本功能。然后,把您的新命令和Tcl库链接起来生成全功能的脚本语言,该语言就包含了Tcl提供的命令和您编写的那些命令。

Tcl还为用户提供了方便。一旦学习了Tcl/Tk就能为任何Tcl和Tk应用程序编写脚本,只需要学习该应用程序特有的少数几条命令即可。这使得更多的用户有能力对应用程序进行个性化改造和强化。

如果不借助别的软件自己来实现一个AVEVA中的PML类似的功能,可能要涉及很多知识,如编译原理,计算机系统等很多很多,编写出来的程序即使能用,可能质量也不好。正如荀子所言:“君子性非异也,善假于物也”;牛顿也说“我不知道在别人看来,我是什么样的人;但在我自己看来,我不过就像是一个在海滨玩耍的小孩,为不时发现比寻常更为光滑的一块卵石或比寻常更为美丽的一片贝壳而沾沾自喜,而对于展现在我面前的浩瀚的真理的海洋,却全然没有发现。如果说我比别人看得更远些,那是因为我站在了巨人的肩上。”如果借助于巨人的力量,使用Tcl就可以方便的实现PML类似的功能,现在需要做的就是对前人知识的学习与使用。

PDF Version: Tcl Tk Introduction



eryar 2014-01-05 22:38 发表评论

日期和时间在PHP中的应用介绍

$
0
0
echo date("Y-m-d", time());   

  1. // Current time, unix timestamp   

  2. echo time();  

  1. echo date("l jS \of F Y h:i:s A");  

  1. date_default_timezone_set('UTC');   

  2. echo date("l jS \of F Y h:i:s A");  

  1. $date = new DateTime();  

  1. // Set the date   

  2. $date = new DateTime('2014-01-01');   

  3.   

  4. // Set the date at a specific timezone,such as Asia/Hong_Kong,No BEIJING?   

  5. //http://www.php.net/manual/en/timezones.asia.php   

  6. $date = new DateTime('2014-01-01', new DateTimeZone('Asia/Hong_Kong'));   

  7.   

  8. // Set date for 4 days from now   

  9. $date = new DateTime('+4 days');  


  1. echo $date->format('Y-m-d');  

  1. $date = new DateTime();   

  2. echo $date->getTimestamp();  

  1. <?php   

  2.   

  3. function weeks_in_month($month, $year)   

  4. {   

  5.     $startDate = new DateTime();   

  6.     $startDate->setDate($year, $month, 1);   

  7.   

  8.     $loopDate = $startDate;   

  9.     $week = 1;   

  10.     for($i = $startDate->format('d'); $i <= cal_days_in_month(CAL_GREGORIAN, $month, $year); $i++)   

  11.     {   

  12.         if($loopDate->format('w') % 7 == 0)   

  13.         {   

  14.             $week++;   

  15.         }   

  16.   

  17.         $loopDate->modify('+1 day');   

  18.     }   

  19.   

  20.     return $week;   

  21. }   

  22.   

  23. echo '<p>Jan '.weeks_in_month(1, 2014).'</p>';   

  24. echo '<p>Feb '.weeks_in_month(2, 2014).'</p>';   

  25. echo '<p>Mar '.weeks_in_month(3, 2014).'</p>';   

  26. echo '<p>Apr '.weeks_in_month(4, 2014).'</p>';   

  27. echo '<p>May '.weeks_in_month(5, 2014).'</p>';   

  28. echo '<p>Jun '.weeks_in_month(6, 2014).'</p>';   

  29. echo '<p>Jul '.weeks_in_month(7, 2014).'</p>';   

  30. echo '<p>Aug '.weeks_in_month(8, 2014).'</p>';   

  31. echo '<p>Sep '.weeks_in_month(9, 2014).'</p>';   

  32. echo '<p>Oct '.weeks_in_month(10, 2014).'</p>';   

  33. echo '<p>Nov '.weeks_in_month(11, 2014).'</p>';   

  34. echo '<p>Dec '.weeks_in_month(12, 2014).'</p>';   

  35. ?> 


老何 2014-01-06 11:00 发表评论
Viewing all 7880 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>