obj_* function naming conventions High level (new/destroy): This is the recommended way of creating new objects. pcb_*_new(): Calls pcb_*_alloc(), fills in fields from parameters and calls the post processing (pcb_add_*_on_layer()) function as needed. Makes sanity checks on the parameters and may fail upon that. pcb_*_new_*(): Same as pcb_*_new(), but may do clever things so the object created may not be 1:1 what was requested or may not even be a new object (e.g. overlapping line merging) pcb_element_*_new(): same as pcb_*_new(), parent being an element pcb_*_destroy() free all fields of an object and properly remove it from the parent (including rtree removal) Low level (alloc/free): Use this in some special cases (like loading a file) when the extra checks of a _new may interfere. pcb_*_alloc(): allocate a new objects within a parent (as of now: layer). Allocates the struct of a new objects with all fields clean and links the object in the parent list. Returns a pointer to the object. NOTE: some post processing may be needed after filling in the fields (see also: pcb_add_*_on_layer()) pcb_element_*_alloc(): same, but parent is an element - will be removed once elements are generalized. pcb_*_free(): free the struct memory (but not the fields!) of an object and remove it from the parent list. pcb_add_*_on_layer(): Postprocessing: call this after a new object is allocated and fields are filled in. It mainly updates the rtree. pcb_*_copy(): copy fields of a complex obj to a pre-allocated target obj Accessors: pcb_*_get_*(): Return data that are not directly accessible as object struct fields but require some sort of calculation pcb_*_set_*(): Set object fields that require postprocessing because of side effects. Use these instead of direct writes to the fields to get side effects properly executed. pcb_*_change_*(): Similar to pcb_*_set_*(), but instead of setting a field to a value specified as a parameter, change the field to comply with some global state, e.g. "change side" would move the object to the currently viewed side. Transformations: pcb_*_move(): move the object within its parent (x;y); it's often implemented as a macro pcb_*_mirror(): mirror the object within its parent (x;y) Misc: pcb_*_bbox(): calculate and update the bounding box of an object pcb_*_rotate90() Rotate the object by n*90 degrees