文章摘要
作者开发了一个概念验证系统,通过LSP服务器实现现代代码编辑器与图形用户界面之间的实时双向编辑。该系统旨在结合代码和图形界面,使用户可以通过代码或图形界面操作几何形状,并实现两者的自动同步。作者希望在自己的开发环境中使用这种代码驱动的CAD系统,以保持熟悉的编程体验。
文章总结
文章主要内容总结:
项目背景:
- 作者喜欢在家进行小型项目,这些项目受益于CAD(计算机辅助设计)。同时,作者是一名程序员,拥有一个经过多年优化的舒适开发环境。因此,作者一直在寻找一种基于代码的CAD系统,以便在自己的开发环境中使用。
双向编辑的概念:
- 作者受到Kevin Lynagh关于codeCAD工作的启发,特别是双向编辑的概念。双向编辑允许用户通过图形界面或文本代码来操作几何图形,任何一方的修改都会实时反映在另一方。
技术实现:
- 作者构建了一个概念验证系统,该系统通过LSP(语言服务器协议)服务器实现现代代码编辑器与图形界面之间的实时双向编辑。系统使用LSP与文本编辑器通信,使用WebSockets与Web应用通信。
技术挑战:
- 实现双向编辑面临多个技术挑战,包括如何重写源代码、如何处理未保存的更改、如何保持编辑器和图形界面的同步、如何处理注释和空白符等。
现有系统的局限性:
- 作者尝试了多种基于代码的CAD系统,发现它们通常只能实现以下三个特性中的两个:
- 代码修改实时更新到图形界面
- 图形界面修改实时更新到代码
- 与用户偏爱的代码编辑器良好兼容
- 例如,Fusion 360有不错的双向编辑功能,但不是完全基于代码,且不支持用户自己的编辑器。OpenSCAD支持外部编辑器,但只能单向更新。Zoo有双向编辑功能,但仅限于其内置编辑器。
- 作者尝试了多种基于代码的CAD系统,发现它们通常只能实现以下三个特性中的两个:
未来展望:
- 作者不打算进一步开发这个演示项目,但希望它能激发人们对LSP服务器的更多创造性使用。作者认为OpenSCAD + Neovim与OpenSCAD LSP服务器的组合是一个不错的代码-CAD环境,并期待看到Kevin在codeCAD方面的进展。
结论:
- 实现一个功能完善的双向编辑系统将是一项艰巨的任务,涉及冲突解决、增量编辑和复杂的LSP服务器内部机制等。尽管如此,作者对这一概念的可能性感到兴奋,并期待未来的发展。
关键点: - 双向编辑的概念及其在CAD中的应用 - 使用LSP服务器实现实时双向编辑的技术实现 - 现有系统的局限性及技术挑战 - 对未来发展的展望和期待
评论总结
关于LSP(语言服务器协议)的应用:
- 支持观点:多位评论者认为LSP在图形界面和代码编辑之间的双向映射非常有用。例如,necovek提到:“作为一个软件开发人员,我总是在做图形工作时感到沮丧,LSP可以帮助我在代码和GUI之间无缝切换。” (As a software developer, I always get frustrated when I am doing some graphical work and struggle to neatly parametrize whatever I am drawing...)
- 反对观点:jesse__认为LSP引入了不必要的复杂性,指出:“LSP只是在做库的糟糕方式,引入了HTTP,而本可以直接调用DLL/SO中的函数。” (Casey Muratori observed years ago that it's just a way worse way of doing libraries. Like, you're introducing HTTP where there could just be a function call into a DLL/SO.)
关于CAD(计算机辅助设计)工具的讨论:
- 支持观点:rao-v提到Python-based的build123d是目前最好的代码化CAD解决方案,并指出OpenSCAD的局限性:“OpenSCAD无法导出实体几何,只能导出最终网格。” (The problem with OpenSCAD is that it cannot export solid geometry, just a final mesh.)
- 反对观点:rao-v也表达了对跨CAD文件格式的失望,认为现有的格式如STEP无法捕捉设计概念:“STEP文件格式大多只捕捉最终几何,无法捕捉设计概念。” (STEP (the file format) mostly just captures final geometry.)
关于双向编辑和实时编程的讨论:
- 支持观点:jasonjmcghee分享了他关于实时编程的实验,认为这种交互性非常有趣:“我构建了一个小项目,你可以实时编写Love2D代码,程序会实时更新。” (I built a small project where you can live-code Love2D. The running program updates in real time...)
- 支持观点:nico希望看到类似的技术应用于Web开发:“希望在浏览器中做出的更改可以无缝地持久化到代码中。” (Would love to see something like this for web development. Where making changes in the browser could be persisted seamlessly to code.)
关于历史技术的回顾:
- 支持观点:mikewarot回顾了Borland Delphi在1990年代的功能,认为其Pascal语言和GUI工具包的设计非常匹配:“Borland Delphi的功能与此非常接近,Pascal语言和GUI工具包的设计非常匹配。” (This is close to the functionality that Borland Delphi had back in the 1990s. The pascal language and the design of their GUI toolkit were a really good impedance match...)
- 支持观点:pjmlp提到Lisp、Smalltalk等历史技术,感叹这些酷想法在主流中接受速度缓慢:“为什么酷想法在主流中接受得这么慢?因为它们不符合VC的指数增长需求。” (Why do cool ideas take so much time to be embraced in mainstream? Naturally they weren't VC friendly with exponential growth capitalising user acquisition.)
关于未来发展的展望:
- 支持观点:SwiftyBug希望看到基于此技术的Interface Builder,认为这可能会让他重新回到iOS开发:“如果有人在此基础上创建Interface Builder,我可能会重新回到iOS开发。” (If someone created a Interface Builder on top of that, I feel like I might even go back to making iOS apps.)
- 支持观点:pshc表达了对无缝协作编辑器的梦想:“这是我梦想中的东西,不同模式的编辑器可以无缝协作。” (This stuff is a dream of mine, editors in different modes that can collaborate seamlessly.)
总结:评论中主要讨论了LSP在图形界面和代码编辑中的应用、CAD工具的局限性、双向编辑和实时编程的潜力、历史技术的回顾以及未来发展的展望。支持者认为这些技术可以提高开发效率,而反对者则指出其复杂性和局限性。