摘要: netbeans中添加依赖库时,有几种类型,一直不太明白他们的区别:我们用pkgonfig库添加了kyotocabinet,最终在makefile中生成了编译选项:`pkg-config --libs kyotocabinet`。下面来研究一下:(1)整个命令用了``,应该表示将``中命令执行的结果传给makefile,在shell中这样的,这里应该也差不多;(2)pkg-config是shell命令,具体介绍如下:1.什么是configure configure会根据传入的配置项目检查程序编译时所依赖的环境以及对程序编译安装进行配置,最终生成编译所需的Makefile文件供程序Ma... 阅读全文
posted @ 2012-08-02 16:51 楚 阅读(1869) 评论(0) 推荐(0) 编辑
摘要: 录制程序要继续添加新功能:模拟电视,板卡发送出来的是rtsp流(h264视频+alaw(pcma)音频)。由于之前做过将rtp流(h264视频+aac音频)录制合成mp4文件(参见http://www.cnblogs.com/chutianyao/archive/2012/04/13/2446140.html),很自然的就决定将其合成为mp4文件。但是有些不同:(1)需要解析RTSP协议。研究了一下RFC2326,发现也不是很复杂。 rtsp分控制流和数据流:控制流就是客户端向服务端发送控制命令,包括查看节目信息、播放、停止节目等,一般是通过TCP协议通信的;数据流就是服务端将音视频数据发送. 阅读全文
posted @ 2012-07-28 12:53 楚 阅读(10874) 评论(1) 推荐(1) 编辑
摘要: 场景:有类crawler,以及它的对象 _pService。crawler类中声明了两个boost thread成员变量:1 boost::thread m_workThrd;2 boost::thread m_parseThrd;由外部线程在需要的时候调用_pService->fun()来启动这两个线程,并给成员变量workThrd、parseThrd赋值。_pService对象也可能没有调用_pService->fun(),因此workThrd、parseThrd可能就是初始值。在程序退出时,workThrd、parseThrd如果已经启动并在运行了,就需要停止这两个线程;.. 阅读全文
posted @ 2012-07-24 11:28 楚 阅读(1341) 评论(0) 推荐(0) 编辑
摘要: 不多解释,用到了log4cpp和boost库。_GLIBCXX_BEGIN_NAMESPACE宏是c++标准库里的,用于声明namespace。我是从stl源码里拿过来用的。 1 /* 2 * File: log.h 3 * Author: raozf 4 * 5 * Created on 2012年7月19日, 上午11:33 6 */ 7 8 #ifndef RZF_LOG_H 9 #define RZF_LOG_H10 11 #include <boost/date_time/posix_time/posix_time.hpp>12 #include <log4cpp/ 阅读全文
posted @ 2012-07-23 17:05 楚 阅读(371) 评论(0) 推荐(0) 编辑
摘要: 最近的项目中需要将几个dump文件(文本格式、1~2G)的记录导入到mysql数据库中,由于数据量比较大(几百万、上千万条记录),有插入记录,也有更新记录的,导致插入\更新速度比较慢。一开始,将单条sql语句交给mysql执行,测试下来,最快一次也要一个半小时。于是想办法改进之。(1)针对插入记录,使用sql语句一次插入多条记录。实例:INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);具体参见sql语法:http://dev.mysql.com/doc/refman/5.0/en/insert.html在程序中,使用循环拼接s 阅读全文
posted @ 2012-07-18 16:05 楚 阅读(7412) 评论(0) 推荐(0) 编辑
摘要: 公司来了新服务器(64位系统),将项目从原来的服务器(32位)上迁移过去后,编译出错:g++ -shared -o dist/Debug/GNU-Linux-x86/libGeoFlock.so -fPIC build/Debug/GNU-Linux-x86/GeoFlock.o build/Debug/GNU-Linux-x86/library.o build/Debug/GNU-Linux-x86/GeoCrawler.o http://www.cnblogs.com/framework/jasgreen/dist/Debug/GNU-Linux-x86/libjasgreen.a... 阅读全文
posted @ 2012-07-09 16:21 楚 阅读(4951) 评论(0) 推荐(0) 编辑
摘要: 和上一次的现象差不多:数据量小时一切正常,稍微大一点monitord就会没响应。具体跟踪之,发现如下现象:(1)MonitorServer给monitord发送请求,一切都正常;但是没有收到monitord返回的响应;(2)monitord收到并解析请求,一切正常;(3)monitord执行请求,一切正常;(4)最后一步:monitord更新配置文件,超时。崩溃。。。写文件居然会超时?这得多大的数据量阿,俺们的数据量也没达到这么恐怖的底部呀?废话少说,扒开代码一看,彻底拜服: 1 static int set_threshold_cfg() 2 { 3 ... 4 5 ... 阅读全文
posted @ 2012-05-11 15:39 楚 阅读(267) 评论(0) 推荐(0) 编辑
摘要: 前几天,MonitorServer有个功能在客户现场被报告无法工作,于是立即跟踪之。该功能要完成的工作是:从上层(BS系统)接收配置参数,按照系统运行情况,将设置参数转发给指定的下层系统(有些发送到嵌入式设备上,有些发送到其他程序)。之前在本地测试,一切都Ok。为什么在客户现场就不行呢?于是做了两项测试:(1)使用本地数据重新测试,结果正常。(2)将涉及到的客户现场数据导回来,测试之,果然无法正常工作。跟踪发现,问题出在MonitorServer将参数转发给下层(另外一个程序monitord)时,没有收到monitord返回的响应,导致转发失败。于是去查看monitord程序,发现它竟然崩溃了 阅读全文
posted @ 2012-04-28 17:38 楚 阅读(417) 评论(0) 推荐(0) 编辑
摘要: Fedora下装好mysql,发现没有自启动,用如下命令添加之:chkconfig --level 345 mysqld on更详细的请查看命令:chkconfig 阅读全文
posted @ 2012-04-17 13:50 楚 阅读(404) 评论(0) 推荐(0) 编辑
摘要: 刚装好Fedora 12,以root登录图形界面,报错:“鉴定故障”。经查:默认不允许以root登录图形界面。解决办法:(1)以普通用户登录。(2)#su切换到root。(3)#vi /etc/pam.d/gdm在如下行前加“#”,将其注释掉:auth required pam_succeed_if.souser != root quiet(4) #vi /etc/pam.d/gdm-passwaord在如下行前加“#”,将其注释掉:auth required pam_succeed_if.souser != root quiet经验证:使用sudo vi /etc/pam.d/gdm无法编辑 阅读全文
posted @ 2012-04-17 10:58 楚 阅读(1606) 评论(0) 推荐(2) 编辑
摘要: 录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流; (2)将H264视频和AAC音频以某种格式封装,最后存成文件,供用户查看。 第一步已经有部分代码可供参考,因此很快 阅读全文
posted @ 2012-04-13 17:30 楚 阅读(34011) 评论(34) 推荐(5) 编辑
摘要: 主要是接收并处理snmp客户端发送控制命令:启动/停止单个节目的录制。也就是实现snmp的SET命令。1.还是从MIB开始。由于只是一个简单的起停命令,前面定义的recordStatusTable中的Status字段完全满足要求,我们只需要给它设置一个不同的值就可以了。之前在文件"/usr/local/share/snmp/mibs/FIGURE-IT-MIB.txt"中给它定义的访问属性是:“read-only”,将它改成“read-write”就OK了。2.生成代码,与之前完全相同,就不多说了。3.由于包含有“read-write”属性的IOD,生成的代码就多了些处理动 阅读全文
posted @ 2012-03-30 14:43 楚 阅读(10429) 评论(1) 推荐(1) 编辑
摘要: 前面提到了程序要主动上报异常状况,snmp提供了notification机制来实现此功能。大致步骤如下:1.还是从MIB文件开始:在文件"/usr/local/share/snmp/mibs/FIGURE-IT-MIB.txt"增加如下内容: 1 recordNotification NOTIFIC... 阅读全文
posted @ 2012-03-29 17:29 楚 阅读(4473) 评论(1) 推荐(0) 编辑
摘要: 录制程序要提供远程控制功能,大概需求为: (1)可以查询程序当前的运行状态:录制了多少路节目,每路节目的状态,数据码率 等等; (2)可以远程控制节目的起停,也就是发一个命令,就可以停掉某一路节目; (3)异常情况,主动上报。 上头决定使用snmp来实现。这几天研究了一下,做点笔记。 闲话休叙,开工 阅读全文
posted @ 2012-03-28 17:04 楚 阅读(10480) 评论(2) 推荐(2) 编辑
摘要: 在cu上看到一种测试大小端的方法,且记下来:内核中抠出来的一个测试大小端的程序,非常好,而且简练。内核的技巧真是无处不再阿. /* *author:qqbsd *email:qqbsd.zhou@gmail.com */ #include stdio.h> static union { char c[4]; unsigned long l; } endian_test = { {'l','?','?','b'} }; #define ENDIANNESS ((char)endian_test.l) int main(void 阅读全文
posted @ 2012-03-12 09:40 楚 阅读(642) 评论(0) 推荐(0) 编辑
摘要: 刚才查看select调用的资料时,发现网上这么一种用法,且记下来: 1 //Socket服务器端,在一个死循环中的代码: 2 nsock = accept(sock, (struct sockaddr *)&sin, &len); 3 iFlag = fcntl(nsock, F_GETFL); 4 iFlag |= O_NONBLOCK; 5 alarm(2); 6 fcntl(nsock, F_SETFL, iFlag); 7 alarm(0); 8 timeout.tv_sec = 1; 9 timeout.tv_usec = 0;10 select(NULL, NULL 阅读全文
posted @ 2012-03-09 23:38 楚 阅读(1378) 评论(0) 推荐(0) 编辑
摘要: 测试时,需要自动删除录制的文件,于是写了个脚本,自动删除过期的文件。如下: 1 #!/bin/bash 2 #待删除目录,根路径 3 root_path="/figure/Record" 4 5 #保存时间:分钟 6 save_time=1 7 8 for source_type in $(ls ${root_path}) 9 do10 if test -d ${root_path}/${source_type};then #录制对象目录11 cd ${root_path}/${source_type}12 13 for channel... 阅读全文
posted @ 2012-03-09 17:44 楚 阅读(528) 评论(0) 推荐(0) 编辑
摘要: 昨天在客户现场部署一套录制时,遇到一个小问题,且记录下来。系统启动后,日志会告警:statfs error. strPath:/figure/datafile/recordfile5/FullRecord/StreamTS/1-1-东方卫视, Value too large for defined data type RepeatCount=34经查问题如下:(1)我们的系统开启了一个线程,不断的扫描系统磁盘的使用情况。使用的是系统调用 statfs();struct statfs { long f_type; /* type of file system (see below) */ lon 阅读全文
posted @ 2012-02-28 09:54 楚 阅读(2608) 评论(0) 推荐(0) 编辑
摘要: 测试NAS的性能,要模拟多录节目同时写数据的场景,来测试该NAS在真实环境中的数据吞吐性能。写了个简单的脚本,同时运行多个dd命令,模拟了多路节目,最近将结果输出到文件中:1 #!/bin/bash2 3 for i in {1..5}4 do5 (dd if=/dev/zero of=/aa bs=1M count=1000) 2>>result.txt &6 done 阅读全文
posted @ 2012-02-22 11:18 楚 阅读(298) 评论(0) 推荐(0) 编辑
摘要: 注意:表述有误! 请以mannul手册为准!-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------最近接触到信号量,看手册里有sem_post族函数和semop族函数,不太清楚有什么不同,于是查了一下。请看下图:sem_post适用于linux线程间同步;semop适用于linux进程间同步。这篇文章不 阅读全文
posted @ 2012-02-09 17:46 楚 阅读(998) 评论(0) 推荐(0) 编辑
摘要: 开始阅读MonitorServer的源代码,记录一些心得。从main函数入手,开始几行代码如下:1 struct sigaction sa;2 sa.sa_handler = SIG_IGN;3 sigaction( SIGPIPE, &sa, 0);以前没用过,不知道为什么遥忽略SIGPIPE信号,于是搜索之,解释如下:在linux下写socket的程序的时候,如果尝试send到一个disconnected socket上,就会让底层抛出一个SIGPIPE信号。这个信号的缺省处理方法是退出进程,大多数时候这都不是我们期望的。因此我们需要重载这个信号的处理方法。调用以上代码,即可安全的 阅读全文
posted @ 2012-02-02 17:37 楚 阅读(391) 评论(0) 推荐(0) 编辑
摘要: 昨天要在视频转发程序里增加转码功能:就是将输入(流/文件)转码成指定格式的视频流和音频流。研究了一下,发现vlc里自带了转码功能,只不过参数设置比较麻烦。我们具体的需求是:输入:rtsp流或者udp组播数据(对设置转码参数来说,其实没有区别)输出:H264视频(644k)+mp2音频(56k),总码率700k,ts封装,使用udp转发到本地单播调用libvlc时的完整转码参数为:sendudp = "--sout=#duplicate{dst=\"transcode{venc=x264{profile=baseline},vcodec=h264,acodec=mpga,vb 阅读全文
posted @ 2012-01-14 14:01 楚 阅读(4199) 评论(2) 推荐(0) 编辑
摘要: 上周,项目里需要一个视频转发工具,我用libvlc完成了一个,大致流程如下:(1)主进程监听指定端口,接收转发请求;(2)验证请求合法性后,主进程fork一个子进程,在子进程中启动vlc进行转发。但调试时发现了一个小问题:fork出子进程后,在父进程中没有调用waitpid,在子进程退出后, 父进程没有为它“收尸”。于是乎,子进程虽然退出了,但进程号在系统历仍然存在,变成了臭名昭著的“僵尸进程”。问题的根源在于:父进程没有调用waitpid来监测子进程的活动状况,关于waitpid能干什么,请搜索之。。。但是:父进程是单线程(称为监听线程),主要干一件事,那就是调用socket的recvfro 阅读全文
posted @ 2012-01-13 17:27 楚 阅读(624) 评论(0) 推荐(0) 编辑
摘要: 要做一个视频转发的小工具,使用netbeans建好工程后,需要使用其他项目中使用的一些基础类,于是使用“从文件夹中添加现有项”功能,将需要的源文件和头文件成功添加到项目中。但是在编译项目时,由于这些导入的文件没有被添加到Makefile中,没有被编译成目标文件,在连接时会报错:1 build/Debug/GNU-Linux-x86/main.o: In function `main':2 VideoTransmit/main.cpp:17: undefined reference to `CSocketUDP::CSocketUDP()'3 VideoTransmit/main 阅读全文
posted @ 2012-01-10 18:31 楚 阅读(1316) 评论(0) 推荐(0) 编辑
摘要: 今天继续完成视频转发工具,使用udp监听本地的8003端口,接收用户发送的视频转发请求。程序完成了,自己写个小工具模拟数据请求,来测试程序是否正常工作。这时候,出问题了。测试步骤:(1)在虚拟机(Fecdora Core12)里运行程序(2)在主机里使用工具发送模拟请求(3)查看程序是否正常工作但是,结果是:虚拟机Fecord Core12里监听的socket一直无法接收到主机发送的udp数据包,使用lsof -i查看,程序确实打开了监听端口:[root@chu xsock]# lsof -iCOMMAND PID USER FD TYPE DEVICE SIZE/OFF... 阅读全文
posted @ 2012-01-10 18:27 楚 阅读(701) 评论(0) 推荐(0) 编辑
摘要: 在最近的项目中,要求把录制程序移植到嵌入式板卡上,原来的vlc模块无法被支持(板卡上无法安装vlc程序以及相应的库),因此要求编译一个去掉vlc模块的版本。折腾半天弄出来了,由于对makefile不熟,很多地方实现的不够理想,仅仅是能用而已。下面是步骤:(1)首先编译源代码在代码中增加编译开关(宏定义):MODULE_WITHOUT_VLC在源代码中所有涉及到vlc模块的 代码处使用该宏定义重写,确保如果定义了MODULE_WITHOUT_VLC,代码也能正常运行(只是不支持vlc模块而已)注意:宏MODULE_WITHOUT_VLC并不需要在源代码中定义,下面会做说明(2)编辑Makefil 阅读全文
posted @ 2012-01-04 14:49 楚 阅读(625) 评论(0) 推荐(0) 编辑
摘要: 昨天将项目代码放在Fedora Core8上面编译时,g++报错:xxx.c:1: 错误: 程序中有游离的‘\357’xxx:1: 错误: 程序中有游离的‘\273’xxx.c:1: 错误: 程序中有游离的‘\277’ 而之前在Fedora Core12上面编译都没问题, 于是搜索了一下,发现是文件编码的问题:这是由于该文件是以UTF-8 BOM的形式储存的,而所用的编译器不支持这种格式。http://blog.csdn.net/hunhunzi/article/details/6710410于是将相应的文件另存一下,注意不要用使用带BOM的UTF8编码即可。 阅读全文
posted @ 2011-12-31 14:59 楚 阅读(809) 评论(0) 推荐(0) 编辑
摘要: 今天在项目中查看pthread_create()函数的手册时,居然报没有该手册页:1 chu@chu-laptop/monitor-center-cs$ man pthread_create2 没有 pthread_create 的手册页条目搜索了一下,是要安装一个包:“manpages-posix-dev”1 chu@chu-laptop:monitor-center-cs$ sudo apt-get install manpages-posix-dev 安装后果然就有了posix库的相关手册页了。顺便还看到有其他的库:“manpages-zh”,猜想应该是中文手册页,果然安装后,系统命令的 阅读全文
posted @ 2011-12-28 10:12 楚 阅读(1403) 评论(1) 推荐(1) 编辑
摘要: 录制项目中用到了mysql,今天在测试时发现无法远程连接mysql数据库,原来是mysql默认不允许远程连接。搜索了一下,找到了解决办法,记录在此以备日后查用。 (1)一开始我使用root用户和mysql服务器ip远程连接,直接报错:[root@chu Record]# mysql --host=192.168.110.68 --user=root --passwordEnter password: ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.110.68' (111)原来是默认情况下Mys 阅读全文
posted @ 2011-12-28 10:04 楚 阅读(6633) 评论(1) 推荐(0) 编辑
摘要: [且作笔记,日后备查]在virtualbox中安装fedora12,由于仅作编译, 通过ssh从主机中直接登录,就没必要开图形界面来浪费资源了。于是修改配置,默认不启动图形界面:#vi /etc/inittab在一行文本id: 5: initdefault: 改为id: 3: initdefault:#reboot搞定。另外,关于的我开发环境略作叙述:(1)代码是放在我的本地硬盘中,我在host机(Ubuntu)中进行使用NetBeans编辑。(2)在virtualbox中运行Fedora12(目标平台,也是我的程序最终的运行平台),通过virtualbox的“共享数据空间”功能,将代码目录映 阅读全文
posted @ 2011-11-23 10:40 楚 阅读(420) 评论(0) 推荐(0) 编辑
摘要: 受不了Ubuntu 11.10令人崩溃的操作体验,最终还是回到了10.10。重装所有的软件,发现原来经常使用的virtualbox指示器没了,使用apt-get 安装indicator-virtualbox,提示找不到软件包。搜索了一些,原来是要添加一个软件源,具体命令如下:sudo add-apt-repository ppa:michael-astrapi/ppa sudo apt-get update sudo apt-get install indicator-virtualbox搞定了。关于indicator-virtualbox,介绍如下:indicator-virtualbox是 阅读全文
posted @ 2011-11-23 09:47 楚 阅读(276) 评论(0) 推荐(0) 编辑
摘要: 在上周的测试中,录制程序继续崩溃了。废话少说,请出gdb:(1)首先查看调用堆栈,确定是在哪里崩溃的:1 (gdb) bt2 #0 0x080b33ef in COutputTS::run (this=0x9800568) at http://www.cnblogs.com/src/COutputTS.cpp:1303 #1 0x080c3192 in CThread::run (this=0x98005b0) at http://www.cnblogs.com/src/CThread.cpp:824 #2 0x080c3149 in CThread::run1 (this=0x9800... 阅读全文
posted @ 2011-11-08 18:09 楚 阅读(4520) 评论(3) 推荐(1) 编辑
摘要: 录制程序有一功能:将录制的文件信息写入MySQL数据库,供BS系统查询。因此封装了一个MySQL类,进行数据库操作。主要接口为Update():执行SQL语句。现在问题来了:(一)在某个场景下,我们在向table1中insert一条记录后,需要得到得到它的ID,然后update与之匹配的另一张表table2中的记录。由于insert本身并不返回结果集,因此我们无法直接得到插入记录的ID。那该怎么办呢?之前从BS组得到的方法是:在table1中执行insert后,立即执行另一条语句:“select @@IDENTITY;”;该语句会返回最后插入的那条记录的ID,这样问题就解决了。但是,在一次co 阅读全文
posted @ 2011-11-07 17:26 楚 阅读(5905) 评论(0) 推荐(0) 编辑
摘要: 在ubuntu的nautilus窗口(对应的就是windows中的资源管理器)中打开目录,有时候想在当前窗口打开终端进行操作,如果选择菜单-》应用程序-》附件-》终端,然后再cd到该目录下,对于我这样的懒人来说,是一件非常麻烦的事。于是我就想,有没有办法通过快捷键直接在当前窗口启动终端?动手之前,先搜索一番。找到了一个脚本:1#!/bin/bash2#Thisscriptopensagnome-terminalinthedirectoryyouselect.3#DistributedunderthetermsofGNUGPLversion2orlater4#Installin~/.gnome2 阅读全文
posted @ 2011-07-23 16:33 楚 阅读(645) 评论(0) 推荐(0) 编辑
摘要: 经常需要在项目中搜索指定字符串,又不想打开ide,于是自己谢了个简单的搜索工具:搜索指定目录下所有包含指定字符串的文件。很简单:扫描指定目录下的所有文件,依次以文本方式打开所有文件,逐行读取内容进行搜索;如果包含要搜索的字符串,就输出。在输出的时候,使用ascii码对匹配的搜索串做了高亮显示。代码如... 阅读全文
posted @ 2011-05-06 15:59 楚 阅读(1719) 评论(3) 推荐(0) 编辑
摘要: 最近项目中大量使用socket,代码测试时需要模拟各种输入,因此写了个小程序模拟socket输入。因为经常需要测试组播数据,所以加进了udp组播的发送和接收。主要功能:(1)支持发送、接收tcp数据;(2)支持发送、接收udp(以及组播)数据;(3)支持文件输入、输出;(4)支持反复、定时发送;(5)通过不同选项,同一程序既可作为发送端,也可作为接收端。更多详细选项,请看程序说明。代码如下:1#include<stdio.h>2#include<sys/types.h>3#include<sys/socket.h>4#include<netinet/i 阅读全文
posted @ 2011-05-02 16:29 楚 阅读(7965) 评论(3) 推荐(1) 编辑
摘要: 老文一篇-----------------最近玩OpenBSD,由于自己机器不在,只好在别人的机器上用虚拟机来过过瘾了。相比之前的NetBSD,OpenBSD给我的最大感受就是简单,配置Web服务,ftp服务等原来觉得高深莫测的东西在OpenBSD下都觉得不过如此,简单至极:就是配置就是看看配置文件,运行和停止服务是敲个命令就搞定的事(也可能是内功在不知不觉中提高了,以前觉得不可理解的东西现在都慢... 阅读全文
posted @ 2010-07-28 14:33 楚 阅读(865) 评论(7) 推荐(0) 编辑
摘要: 在前一篇文章中初步的实现了验证码的随机生成,觉得很容易被破解,因此加了一些干扰;鹤冲天建议使用表达式作为验证码,即使破解程序识别了验证码,也要计算结果才能通过验证,在一定程度上增加了破解难度。因此我对代码进行了重新整理,通过控制运行时配置选项来达到不同效果。现在主要做到了:(1)字符内容随机(普通字符串或表达式)(2)每个字符的字体随机(3)每个字符大小随机(4)每个字符倾斜角度随机(5)干扰线条... 阅读全文
posted @ 2010-07-22 18:02 楚 阅读(2795) 评论(2) 推荐(1) 编辑
摘要: 最近得闲,学习一下Lua。Lua下有个gd图形库,通过简单的Lua语句就能控制、生成图片。之前在某个项目中要用到验证码,当时对这方面不太了解,就采用最不专业的做法:预先准备好若干验证码图片,把对应的值存入到数据库;使用时随机取出一对“图片-验证码值”供用户验证。这样做的好处是减少编码复杂度和服务器负担,但是问题也显而易见:预先准备的验证码图片数量有限,要是有人恶意攻击的话,... 阅读全文
posted @ 2010-07-21 11:00 楚 阅读(6114) 评论(6) 推荐(0) 编辑
摘要: 最近在学习用ObjectAXR 2002做AutoCAD二次开发,总体感觉还好,主要难点在于理解AutoCAD的数据组织方式。AutoCAD的数据是采用数据库形式进行存储和管理的,表格,记录,游标等概念,在数据库中都已经接触过;图层,图块等和GIS中的概念基本一致。在有了这两方面的基础之后,加上在学校的时候,自己对AutoCAD有过一些了解,用AutoCAD画过一些图,对AutoCAD的命令有一定... 阅读全文
posted @ 2009-03-19 16:20 楚 阅读(2004) 评论(1) 推荐(0) 编辑