We have moved to https://dokuwiki.librecad.org/
Lots of content was already moved to the new wiki, but there is still work to do. If you want to contribute, please register a new account at https://dokuwiki.librecad.org/
This wiki will be kept for a while to keep search engine results valid. Moved sites may be deleted here in future.
API & Development
Contents
Qt
LibreCAD is a widget-based user interface.
The following has many useful links if you are new to Qt: http://doc.qt.io/qt-5/qtwidgets-index.html
Factories
- QG_ActionHandler
- Responsible for starting CAD actions
- RS_EventHandler
- Responsible for routing UI events
- QG_ActionFactory
- Generate GUI actions and connection to CAD actions
- QG_DialogFactory
- Access to GUI interface: Qt widgets
Drawing
- RS_PainterQt
- Responsible for the actual drawing of objects (onto a QPaintDevice)
Undo/Redo
- RS_Undoable
- Base class for all RS_Entity
- This class simply wraps a single flag.
- When false, the entity is valid.
- When true, the entity is undone.
- To undo/redo the entity, the flag has to be toggled.
- RS_UndoCycle
- This is a list of entities (RS_Undoable) modified in one transaction (cycle)
- RS_Undo
- This is one of RS_Document's base classes
- It keeps a list of RS_UndoCycle, the undo/redo stack
- Each creation/modification is added to the current undo cycle, which is pushed to the list then
- Undo/Redo actions walk up or down the undo cycle list and toggles all entities in one cycle
- On modification entities are not modified immediately, the entity is cloned, the original undone and the clone modified
- With undo, the clone is undone and the original entity redone
CAD Entities
- RS_Entity
- Base class for all CAD entity types
RS_GraphicView
Cleanup mode
There are some segfaults by action( rs_action* methods) destructors caused by actions when closing the main window. These segfault can be fixed by detecting RS_GraphicView cleanup in action destructors.
A method to detect cleanup is added:
bool RS_GraphicView::isCleanUp() const;
whenever isCleanUp() returns true, action destructors should not try to cleanup, as entities may be deleted already.
TODO: We need a better solution probably by smart pointers.
RS_Debug
The --debug switch
The LibreCAD binary supports the command line switch --debug. To use this feature, start LC from a terminal appending the --debug parameter.
LibreCAD will start as usual, but in the terminal window a whole lot of debugging messages will appear.
To save these messages into a file use librecad --debug 2>debugging.txt.
![]() |
Warning: This does not apply to Windows! On Windows use the Qt Creator debug console. |
The enhanced --debug switch
With commit de0f48f (somewhere after version 2.0.0rc2; Sep 11, 2013), this switch was enhanced.
When debugging a special issue, you can control the debugging level, thus the quantity of messages printed to the terminal will be reduced.
Using only --debug is working as always.
Appending a digit from 0 to 6 to the switch, e.g. --debug3, will set the corresponding debugging level.
For a list of all debugging levels use the switch --debug?, then a list of all debugging levels is printed and LibreCAD will not start.
The higher the level number, the more messages will be printed.
The supported debug levels are:
level | name | use in print() | printing |
---|---|---|---|
0 | Nothing | RS_Debug:D_NOTHING | nothing |
1 | Critical | RS_Debug:D_CRITICAL | only critical |
2 | Error | RS_Debug:D_ERROR | critical and errors |
3 | Warning | RS_Debug:D_WARNING | critical, errors and warnings |
4 | Notice | RS_Debug:D_NOTICE | critical, errors, warnings and notices |
5 | Informational | RS_Debug:D_INFORMATIONAL | critical, errors, warnings, notices and informational |
6 | Debugging | RS_Debug:D_DEBUGGING | all, same as --debug |
Using the enhanced --debug switch
Use the RS_DEBUG->print( level, "format", ...); method to print the messages you need.
There is an overloaded method RS_DEBUG->print( "format", ...); which is the same as RS_DEBUG->print( RS_Debug:D_DEBUGGING, "format", ...);.
"format" is a standard printf-format string, followed by the variables to be set in the format string.
When you're working on a new feature or investigating an issue, add e.g. RS_DEBUG->print( RS_Debug:D_INFORMATIONAL, ...); commands to your code. Start LibreCAD from a terminal with --debug5.
Then you will have much lesser output to search for the information you need.
If the messages will be useful for further debugging sessions, you may leave some of them in the code, but consider to raise their level befor committing, to keep the lower levels clean.
If messages are useless after finishing the feature or fixing an issue, please remove them before committing.