个人Lisp代码学习一年学习过程总结
本帖最后由 liuhe 于 2023-8-17 14:23 编辑看到一些网友发出学习困扰,本人是感同身受,我也曾经发帖子迷茫过,不过只剩下了标题。
曾经一个网友,发了《论坛怪风》的帖子,那个资本的奴隶就是我,我不是巨人,也没有受到前辈大佬耳提面命谆谆教导,只是在论坛一直白嫖大佬的经验分享。
对我来说编程自学其实孤独的,但是不寂寞,发帖的初衷希望那些跟我一样的萌新能够坚持下去,在这个画图狗内卷的时代求得提高效率后发呆的几分钟。
先说一下背景,本人只是垃圾二本学校,双非研究生的工科男,以此供网友定位智商的尺度,毕竟高考是最好的智商检测器。
0.学习lisp代码的契机:
本人在此以前从未用过其他插件,包括天正、管立得等绘制管道的插件,还包括只听说过的贱人工具箱,但是实际不会用的贱人工具箱。因为我以前的工作不需要大量画图工作,也就没有圈子和机会去接触插件。
本人跳槽到一家新公司,需要大量管道画图工作,画图一个月直接鼠标手和腰直不起来。那种双线管道的工作,都是我用直线或pl线直接手工绘制的,所以工作量巨大。这次工作要求时间短,我都没时间去学习用天正之类的管道绘制插件。等我画完所有的施工图,了解到公司内部的一个专门的管道绘制插件,学习成本还低,那时候真是又爱又恨,因为我图都画完了,如果用插件我起码节省三分之一的时间。
我意识到插件的效率是恐怖的,开始百度各种资料,发现资料都是散的,让人一头雾水。于是去淘宝买了lisp学习的资料,价值是30元。那天是2022.06.26号,但是拿到资料后,面对各种资料更是无从下手,很茫然。
此前我没有任何编程经验,上学的VB和C++课早已忘记了,因此学习编程对我而言是一个全新领域。然后,对于经过毕业后考证的经历,我对于陌生的领域如何学习有了一定经验积累,这可能是我比部分网友的一个“优势”。
1.学习一定要有目的性和计划性
未知的东西之所以可怕,是因为我们无法对整个事件进行全程的把握。
为了消除对于编程的未知:初步的计划是:看完所有的教学视频。在这样就能对编程这件事有了粗略概念。目的是:写一套自己管道绘制插件。因为天正对我来说太多用不到的功能,公司的管道插件有bug,功能达不到我想要的效果。
于是就边看李小科的视频,边浏览所有的资料包括pdf、chm的资料,其中好夹杂了很多lsp文件的源码,这样就会资料有了大概的印象,知道这些资料大概讲了什么。这个过程啥也记不住,只是知道李小科大佬是如何写代码,如何查资料,如何调试的过程。
这个学习过程,知道了明经论坛这个网站,一开始对注册网站还要花钱挺抵触(偷笑),毕竟白嫖是我的本能,但是还是“咬牙”买了帐号,这可能是我投资回报率最高的理财了。
我的目的性很简单,画管道,于是开始在论坛搜索管道相关帖子,但是有的帖子还要花费买,我看了看仅有的5个币,不舍得买。
但是白嫖党永远不亏啊,我发现了这个帖子风管水管倒圆角,弯头- AutoLISP/Visual LISP 编程技术- AutoCAD论坛 - 明经CAD社区 - 双线倒圆角,风管导圆角,弯头 -Powered by Discuz! (mjtd.com)有免费的源码可以看,在此非常感谢“Flamingo”,就是因为这个插件让我有了玩下去的希望。
这个源码没有用到多复杂的函数,而且反反复复出现大量类似的代码,作者还对源码进行了详细的注解,简直就是对我这种菜鸟量身定做。有兴趣的可以去看看这个源码,它基本包含了所有初级学习应该掌握所有的知识点,包括图层新建、DXF码的概念、最基本的所有的lisp函数、command的调用等等。
对于初学者,强烈建议去研究这个源码,如果对这个源码的出现的所有代码,你都能学会了,个人认为已经可以挺过了初级学习过程。
而我在源码上,开始进行不停的魔改,延伸了40多个版本文件,如下图
这个时间持续了一个多月,这个过程很痛苦,全新的知识冲击着大脑,经常研究到晚上一两点才能睡觉,而且大概率无法实现自己的目的。我把中间的成功展示给同事看,他们都嘲笑我,觉得没有意义,因为天正就有的功能你为啥还要重复造轮子,我也只能笑笑,毕竟这的确是没有任何意义。
2.思想不改变,一切都枉然:
我也在自我怀疑中一天天的去实现自己的想法,直到有一天,我看b站lisp相关视频,有人可以搞破解软件,哈哈,当时我想把公司的软件破解了,拿到源码在那个基础上去完善不是事倍功半,从头造轮子太辛苦了。
于是花钱破击了公司的插件,幸好这个插件就没有复杂加密,我看着几千行的源码,陷入了懵逼之中,然后去加载调试,根本不能运行,大佬们应该知道反编译后的代码都要重新整理的,不然根本没办法运行。
既然没办法运行,我只能硬着头皮去理解里面的代码。很遗憾,那个插件是公司专业的码农自学lisp,花费一个星期编写的文件,里面用了大量重复调用的函数,根本不是我一个月还没有入门的菜鸟看的懂的,但是重点来了,此代码是一个典型中大型软件结构。
它把管道绘制的功能进行了拆分,每一个函数代表一个功能,比如有专门的数据库函数、有专门的开头和结尾函数、有专门的块函数。我虽然看不懂每一个具体函数如何实现的,但是我看懂了整个插件是代码结构,这对我去理解函数的概念、理解局部变量和全局变量、理解函数的输入和输出、理解函数的调用有了巨大帮助(代码结构这种概念是后续学习WPF,区分前端和后端才了解到的)。
这种概念性的转变,驱使我需要把插件的功能进行分解成每个独立函数,等写好了独立的函数,再把整个程序窜连起来,这对于编程来说是非常重要的思维,编程变成成了乐高搭积木。想实现某个功能,第一步是把功能分解成某几个独立的小功能,比如坐标排序、循环复制等等,这些独立的小功能就是乐高成品积木。也许某个小功能还可以进一步细分更小的独立功能,如此,把任务进行分解了成了独立函数,最小的任何函数就是lisp提供给的最基本的函数,比如entget等等。
此时,我对编程完成了思想概念的转变,这种概念性的转变就像拨开了珠穆朗玛峰的白云,窥见了顶峰到山脚的全貌,编程不再是茫然的未知,而是有一定清晰的未知。更加清晰的知道自己是一个菜鸟,更加知道不死猫、G大、高飞鸟、院长、leemac等等大佬牛逼之处。
我之所以去强调思想的改变,是因为我们并不是科班出身,对编程的基本概念甚至基础逻辑都没有清晰认知,为什么程序需要区分变量类型?字符串、整数、双精度等等。为什么lisp会后来加vlisp、vlax函数?前者和后两者对比,是lisp从链表表达式到面向对象的重大编程思维改变;vlax更是弥补了lisp曲线函数方面的弱点。
如果我们是科班出身,就知道这些编程思想的变化,也就知道面对葵花宝典众多函数不会这么茫然,也就知道为什么lisp为什么在当今的主流编程届中找不到位置,但是编程从来都有一个定律:码农是沉默的大多数群体,实用主义总是至上的。
3.小功能欢乐多,大功能头发少
3.1初期:要做“键盘侠”,要多敲代码
管道插件对于我来说是一个太过庞大工作量,虽然把工作量进行了懵懂的划分,但是也只能走一步看一步。因此,管道插件是长期目标,这种延迟的满足感很难支撑我走下去。
于是,在画图工作中,我开始把一些不紧急的工作,开始尝试用代码实现。
比如说,在画管道箭头的时候,只需要粘贴复制旋转就可以完成,这些操作当然可以手动完成,甚至在菜鸟阶段编程的时间花费比手动操作还多,编程反而会拖慢效率。但是,我有不同的感受,正因为这个工作量小,才能有时间编程练习,如果编程失败了,起码还可以手动完成工作,这样保证了不耽搁工作,降低了编程难度,还很容易实现编程的满足感。
因此,我是建议新手期的菜鸟,要在工作中寻找那些不难,但是稍微有点复杂的操作进行编程练习,不断积累小功能的代码,获得短期目标的满足感;如果一上来就是几百行,甚至几千行的代码量,根本把握不住的。
从我目前的编程能力来看,我认为lisp虽然是链表的函数,但是我们可以用面向对象的概念去学习。
把lisp分为:对象(实体和非实体)、方法、属性。
对象可以从实体练习,比如LINE、LWPOLYLINE、ARC、CIRCLE等等。方法可以从移动、复制、删除、旋转练习。属性可以是修改颜色、图层、线宽、长度等等。
如何创建这些实体,这些实体的DXF码是什么。当然lisp本身是没有这些方法,lisp都是通过修改DXF吗从而实现这些功能。等掌握了这些DXF码去实现基本的功能,也就掌握了lisp的本质是链表,DXF本质是一个链表,我们只是去修改这个表的表达式而已。用的最多的函数就是entget、assoc、subst、entmod这种积累的过程就是小功能欢乐多,但是仔细看没啥大用的东西,但是只有积累这些小的代码量,才能去真正的实现繁琐的操作。
在此,我是不建议一上来就去研究复杂的实体和非实体,比如块、dcl界面、填充、组、扩展数据等等,这些东西很容易有挫败感。
这个积累过程,你会自然而然是去整理自己的代码,没事就去论坛搜帖子和代码。你会逐渐知道很多大神,开始专门看他们的帖子并且收藏(这里吐槽论坛收藏的帖子不能分类,实在是不够人性化);开始对《葵花宝典》看来看去,尤其是《葵花宝典》最后的那个一页,大佬整理了很多论坛优秀的代码,不夸张的说,那个几百个函数,我看了很多遍,虽然菜鸟期我看不懂,但是我可以尝试看看大佬写代码用了哪些函数,这个函数是干嘛的。
这个过程持续了3个月,我从懵懵懂懂,开始了菜鸟到不断求知的过程,对知识的渴望开始增加,开始不断尝试更加复杂的功能,期间开始尝试去接网友的一些订单赚点外快,增加学习的满足感维持不断的学习动力。
我记得在群里,有人发了一个阵列的图形,需要进行修改,我拿到之后没有自信解决,就尝试用阵列重新生成,目标图形是一样的,但是不符合别人的要求。我当时很茫然,觉得lisp是无法实现这个功能啊,因为lisp的交点函数只有直线交点,没有其它实体的交点,于是我去论坛搜索,发开始去尝试理解vlisp函数。
Vlisp的学习资料是很少的,不管是李小科还是猫老师的视频还有PDF教材,能够完整体系的学习是很难的。这个主要是因为vlisp的编程思维从链表转向了面向对象编程。Vlisp的学习必须要把《葵花宝典》和《ActiveX 和 VBA 参考》结合起来看,而且学习中你会发现大量重复功能的函数,比如说创建直线、创建圆、移动、复制、删除等等,这些函数逻辑更加符合我们的直觉,编程思维上反而更加简单了,再也不用去研究逻辑性差DXF码。这种思维的转变当然很伟大,但是并不是意味着lisp不需要学习,DXF码不需要学习,因为vlisp的lisp的重要补充,而不是而为了取代它。即使用vba、NET二次开发,DXF码的那个PDF文件,仍然是必须需查阅的资料。
CAD创建了DWG文件格式,这个矢量图图形文件并不是其他软件通用格式;CAD创建的DXF文件格式,才是更通用的格式(我目前认知是这样)。
帮助文件中说:ASCII DXF 文件格式是 ASCII 文字格式的 AutoCAD 图形的完整表示,这种格式易于被其他程序处理。此外,AutoCAD 可以生成或读取二进制格式的完整 DXF 文件,并接收其他二进制文件格式的有限输入。
如果以后研究的更深就会理解上面图片的意思。简单来说,想做CAD二次开发,学习DXF码是必须的,只是深度要求不一样。甚至,我看浩辰、中望的安装好的文件中,也有大量lsp文件。学习lisp编程,并不是对后面学习其他语言毫无用处。
还是那句话,基础不牢地动山摇。
3.2中期:掌握编程工具,事倍功半写代码
随着学习加深,扩展数据、块表、DCL编程、读写TXT等等开始作为编程的需求。中期阶段,我有几个建议:A. 建议看猫老师的视频,这个阶段我是一直把这个视频当作查阅资料来看的。B. 尝试中型插件,大概代码量几百行。C. 熟练掌握论坛搜索技巧,包括明经论坛、晓东论坛以及国外论坛D. 整理自己的代码,并且尝试对这些代码进行封装分类。学习大佬的函数命名技巧,避免重复。
E. 熟练掌握编程,提高编程效率。图片是编程常用的工具。
这个阶段的进步会非常快,以前看不懂的代码,现在能看懂了,然后感叹大佬就是大佬,代码如此精妙简洁。
这个时候写代码开始“偷懒了”,写代码前,都是去论坛找找类似,然后自己改改能跑就行。我在这个阶段,积累了很多“屎山”代码,那真是又臭又长,于是想学习大佬整理自己的函数,但是很遗憾失败了。因为我无法写出比大佬更加精妙的函数,只能把大佬的函数整理一下,用的时候直接粘贴复制。
到达这个阶段用接近8个月时间,能够看懂大部分代码,并且能够知道怎么改,当然仅限于cad本身的对象,如果是其他excel,脚本,还是懵懵懂懂。 3.3后期:会当凌绝顶,一览纵山小
对不起,我也不知道,哈哈,我还在中期玩。
4.关于瓶颈期
经过一年的时间,我现在的阶段是处于瓶颈期,因为已经完成长期目标:管道插件。当然从我现在的角度,代码结构更像是一个缝合怪,称不上“屎山”,但是能改进的地方太多。
我通过这个插件,申请了三个软件著作,哈哈强烈建议大家搞这个,我为了评职称申请的,不花钱还速度快,可以很好的平替专利要求。
我看大佬编程感受是:编程的本质思维,代码只是思维的呈现方式。编程语言的不同,会提高编程效率。编程最后都是掌握算法和API。对于我们来说是计算几何算法。
我自学了一段时间net和VBA,写了一些小程序,更加体会到自己只不过是编程界更大的菜鸟而已。我想学习的有很多,比如说服务器、数据库、WPF、计算几何库(这玩意都是C编写多,很痛苦看不懂),但是我却没有了更加强大的动力去学习。
因为我学习编程的目的是为了提高工作效率,现在的编程能力,已经解决了工作中大部分需求。画图工作想做到一键出图是不可能,因为那些工作不是lisp能解决的,最好是放弃lisp和二维CAD软件,去尝试三维软件的工作。但是很遗憾,我的工作目前没有这些需求。
曾经想过,不在画图里面继续内卷,而是转行去两者结合公司,但是很遗憾,这些公司对编程的要求比重很大,不是科班出身很难符合。
以后大概率编程能力只能是这样了。靠这个翻身太难了,能提高工作效率,节省出时间用于发呆,是最大的收货吧。
另外,发个广告吧,本人提供LISP插件定制,有需要的朋友可以联系我QQ:859779429 我的管道插件试用版http://bbs.mjtd.com/thread-187281-1-1.html
不是故意挑刺啊.
你把语言学习和二次开发的东西混到一起了,
纯新手小白看你这个感悟会越看越迷糊的.
你讲的这些其实都不是lisp编程语言的学习,
而是二次开发工作的过程.
alisp本身就那点东西,没什么好学的.
编程语言本身都挺简单的,
二次开发其实是限定作文,
更多时候只是在熟练轮子的108种用法而已..
CAD系统的二次开发是一种工作流程,
不同CAD系统的二次开发大体是差不多的,
因为商业CAD软件为了面向尽可能多的用户,
它们互相间主干业务层逻辑都是差不多的.
你会一个就会别的..
我们做二次开发,
本质是因为我们实际上大部分的需求只是对数据的简单批处理.
这些工作在软件工程的层面上层级很低.
本来就是一线工程技术员自己就能搞定的,
这些code内容对职业码农来说是不值一提的.
内容总的来说也撑不起来一个商业市场和职业岗位,
靠二开赚多少钱就别想了..
要不然论坛里这些长老们早就发达了.
只是说各自行业和岗位的业务逻辑不一样.
你需求的实现隔行如隔山,与其跟专业码农三天三夜都讲不明白,
不如自己动手搞了,顺便娱乐自己打发时间罢了
看了楼主申请的软著,我才意识到,lisp这古董玩意也能申请,试试把以前写的包装一下,竟然成了。 《论坛怪风》的三观确实不正 想要得到就要付出 你付出时间学习就得到了知识知识改变命运 加油 :D- 好家伙 感谢大师分享经验 lisp与C#比有什么优势没有啊, 4551986 发表于 2023-8-17 14:25
lisp与C#比有什么优势没有啊,
lisp更加自由,代码量少,自带编译器,调试简单,对于小功能实现非常友好。这是优点,缺点就不说了,到达一定阶段,想要玩的更深,必然要去学习其他语言 写的很好!这确实是我们很多工程设计行业的非专业编程者的典型历程。 开始学lsp,感觉真香。后来…… 多谢,多谢,一个初学者的迷茫 感谢大师分享经验,我想知道怎么样才能申请著作呢