liuhe 发表于 2023-8-17 13:57:09

个人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







有区别吗 发表于 2023-8-21 14:47:12

不是故意挑刺啊.
你把语言学习和二次开发的东西混到一起了,
纯新手小白看你这个感悟会越看越迷糊的.
你讲的这些其实都不是lisp编程语言的学习,
而是二次开发工作的过程.
alisp本身就那点东西,没什么好学的.
编程语言本身都挺简单的,
二次开发其实是限定作文,
更多时候只是在熟练轮子的108种用法而已..
CAD系统的二次开发是一种工作流程,
不同CAD系统的二次开发大体是差不多的,
因为商业CAD软件为了面向尽可能多的用户,
它们互相间主干业务层逻辑都是差不多的.
你会一个就会别的..
我们做二次开发,
本质是因为我们实际上大部分的需求只是对数据的简单批处理.
这些工作在软件工程的层面上层级很低.
本来就是一线工程技术员自己就能搞定的,
这些code内容对职业码农来说是不值一提的.
内容总的来说也撑不起来一个商业市场和职业岗位,
靠二开赚多少钱就别想了..
要不然论坛里这些长老们早就发达了.
只是说各自行业和岗位的业务逻辑不一样.
你需求的实现隔行如隔山,与其跟专业码农三天三夜都讲不明白,
不如自己动手搞了,顺便娱乐自己打发时间罢了




376394482 发表于 2024-7-4 15:23:17

看了楼主申请的软著,我才意识到,lisp这古董玩意也能申请,试试把以前写的包装一下,竟然成了。

飞雪神光 发表于 2023-8-17 14:34:48

《论坛怪风》的三观确实不正 想要得到就要付出 你付出时间学习就得到了知识知识改变命运 加油

水洗可口可乐 发表于 2023-8-17 14:17:55

:D- 好家伙

不一样地设计 发表于 2023-8-17 14:18:51

感谢大师分享经验

4551986 发表于 2023-8-17 14:25:05

lisp与C#比有什么优势没有啊,

liuhe 发表于 2023-8-17 14:34:02

4551986 发表于 2023-8-17 14:25
lisp与C#比有什么优势没有啊,

lisp更加自由,代码量少,自带编译器,调试简单,对于小功能实现非常友好。这是优点,缺点就不说了,到达一定阶段,想要玩的更深,必然要去学习其他语言

e2002 发表于 2023-8-17 15:26:11

写的很好!这确实是我们很多工程设计行业的非专业编程者的典型历程。

mahuan1279 发表于 2023-8-17 15:50:56

开始学lsp,感觉真香。后来……

li_fang_2008 发表于 2023-8-17 15:51:51

多谢,多谢,一个初学者的迷茫

magicheno 发表于 2023-8-17 16:23:12

感谢大师分享经验,我想知道怎么样才能申请著作呢
页: [1] 2 3 4 5 6
查看完整版本: 个人Lisp代码学习一年学习过程总结