ualib package

Submodules

ualib.core module

TODO: UserArea Drag

Node 对象继承关系:
Node (BaseHierarchy)
| Node2D (BaseFrame)
| AreaNode
| BaseGraphicsItem
| BoxContainer
| HBoxContainer
| VBoxContainer
| SimpelTextItem
| ClipMapTextItem
| RectItem
| BitmapItem
| BaseBezierItem
| RoundRectItem
class ualib.core.AdvanceUserArea

Bases: Node2D

_draw(ua)

绘制覆写方法,在这里一般只需绘制当前对象本身

Parameters:

ua (CoreGeUserArea) -- core 模块中的 CoreGeUserArea 对象

convert_colorid_to_vector(colorid: int)
get_scroll_area_value(scroll_group_id)
set_min_size(size)
set_redraw(layout_changed=False)

想要手动重绘制ua时调用该方法

Warning

注意:刷新方法尽量使用该函数,如果是高级开发者,想要直接使用 AUA.ua.Redraw() 或者 AUA.ua.LayoutChanged() 方法的, 请勿在 DrawMsg 函数调用过程中使用,否则会导致C4D陷入死循环而崩溃。比如 Node._update方法默认在 DrawMsg 过程调用。

Parameters:

layout_changed (bool, optional) -- 界面尺寸发生改变时设置为True, defaults to False

class ualib.core.AreaNode

Bases: Node2D

基础区域对象, 事件只有在区域内部发生才会向下传递, 绘制也可以限制在区域内部

Parameters:
  • mouse_entered (Signal) -- 鼠标进入区域时发送信号

  • mouse_leave (Signal) -- 鼠标退出区域时发送信号

  • clip_to_frame (bool) -- <prop> True 裁剪对象绘制范围到自己的 baseframe 范围内, False 关闭裁剪. 细节可以查看 draw_event

  • clip_children -- <prop> True 裁剪子对象绘制范围到当前对象的 baseframe 范围内, False 关闭裁剪. 细节可以查看 draw_event

  • clip_optimize -- <prop> 用于高效渲染, 建议设为True, 会将 baseframe 超出视图区域的对象跳过绘制(draw). 细节可以查看 draw_event

其他参数:mouse_inside 鼠标在区域内部时为True

_event(event: BaseEvent)

只有当鼠标在区域内部时向下传递事件

_mouse_enter_event(event: BaseEvent)

鼠标进入事件在这里执行

_mouse_leave_event(event: BaseEvent)

鼠标离开事件在这里执行

extend_shapes(shapes=[])

扩展当前对象内部判定区域, 在 _check_inside 函数中使用

Parameters:

shapes (list, optional) -- BaseFrame对象组成的列表. Defaults to [].

class ualib.core.BaseBezierItem(position=<c4d.Vector object>, size=<c4d.Vector object>)

Bases: BaseGraphicsItem

LINESTYLE_DASHED = 2
LINESTYLE_DASHED_BIG = 4
LINESTYLE_DASHED_INV = 3
LINESTYLE_DOTTED = 1
LINESTYLE_NORMAL = 0
_draw(ua)

绘制覆写方法,在这里一般只需绘制当前对象本身

Parameters:

ua (CoreGeUserArea) -- core 模块中的 CoreGeUserArea 对象

_update()

刷新绘制数据

Note

_update 方法会在 _draw_event 中自动调用,当执行具体的数据刷新时可以利用 dirty flag 来判断刷新时机避免无效的反复刷新(可以极大的提升效率)

def _update(self):
    if self.dirty_flag.has_flag(self.DIRTYFLAGS_CHANGES):
        # 内部数据更新代码写这里
    elif self.dirty_flag.has_flag(self.DIRTYFLAGS_MATRIX):
        # 位置变换数据更新代码写这里

Warning

_update() 本质上是在DrawMsg() 函数中调用的, 所以注意避免直接调用 CoreGeUserArea 的 LayoutChanged() 方法 , 否则可能会因陷入死循环而导致的C4D崩溃

add_bezier_object(start=<c4d.Vector object>, end=<c4d.Vector object>, start_hand_offset=<c4d.Vector object>, end_hand_offset=<c4d.Vector object>, update=False)
change_object(index, part, value, update=True)
clean_all_objects()
get_bezier_object(index=0)
update_list(innder_update=False)

将分散的bezier_objects合并为一个对象 并获取全局点位

Parameters:

innder_update -- 完全刷新所有对象的点位 (若已经刷新过,设置为False可以提升效率)

class ualib.core.BaseEvent(CORE)

Bases: object

基础事件对象,会在每一个事件循环周期由 GeUserArea.InputEvent() 和 GeUserArea.Timer() 创建,并通过 GeUserArea.root._event() 方法传递到节点子级

Note

一个事件循环周期是指:
输入事件发生 -> 事件传遍整个节点树 -> 数据刷新 -> 节点绘制
BaseEvent对象主要有以下几种事件:
  • is_down_event() -> EVENT_TYPE_DOWN 按下事件 由InputEvent发起

  • is_hold_event() -> EVENT_TYPE_HOLD 拖拽事件 由is_down_event发起

  • is_up_event() -> EVENT_TYPE_UP 松开事件 由is_down_event发起

  • is_timer_event() -> EVENT_TYPE_TIMER 计时器事件 由Timer发起

可获取的事件数据包括 :
  • mouse_event_position :列表[x,y] 对应事件按键点击时鼠标的位置

  • mouse_down_position : 列表[x,y] 按键点击时鼠标的位置

  • mouse_hold_position : 列表[x,y] 按键点击并拖动时鼠标的位置

  • mouse_up_position : 列表[x,y] 按键松开时鼠标的位置

  • qualifier : 辅助键位事件 如: ctrl/shift等, 对应 self.QUALIFIERS_CTRL/self.QUALIFIERS_SHIFT ...

  • device : 输入设备: 鼠标 self.DEVICE_MOUSE, 键盘 self.DEVICE_KEYBOARD

  • channel : 输入按键: 鼠标左键中间右键 self.CHANNEL_MOUSELEFT/ self.CHANNEL_MOUSERIGHT/ self.CHANNEL_MOUSEMIDDLE 等等

  • value : 输入按键对应数据, 比如滚轮事件的数据

  • doubleclick : 是否是双击

Note

基础的事件数据(_event_data)可以通过 __getitem__ 方法获取
def _event(self, event: BaseEvent):
    x, y = event["mouse_down_position"]
    ...
在一个事件周期内希望重新绘制时,需要调用 event.set_redraw() 方法
该方法不会立即绘制而是等待所有输入事件结束后调用 root._draw_event()
需要取消事件时,调用 event.set_cancel() 方法, 这样c4d 其他界面控件就可以捕获到这个事件并作出反馈。
CHANNEL_MOUSELEFT = 1
CHANNEL_MOUSEMIDDLE = 3
CHANNEL_MOUSEMOVE = 101
CHANNEL_MOUSERIGHT = 2
CHANNEL_MOUSEWHEEL = 100
DEVICE_KEYBOARD = 1801812322
DEVICE_MOUSE = 1836021107
EVENT_TYPE_DOWN = 1
EVENT_TYPE_HOLD = 2
EVENT_TYPE_NONE = 0
EVENT_TYPE_TIMER = 4
EVENT_TYPE_UP = 3
QUALIFIERS_ALT = 4
QUALIFIERS_CTRL = 2
QUALIFIERS_NONE = 0
QUALIFIERS_SHIFT = 1
clone()
get_key_value()
get_mouse_pos()

获取当前事件中的鼠标位置,down hold up timer都可以返回

Note

除了通过这个方法,也可以通过 event[key]的方式(如event["mouse_down_position"])在不同事件中获取其他事件的鼠标位置。

  • mouse_event_position :列表[x,y] 对应事件按键点击时鼠标的位置。

  • mouse_down_position : 列表[x,y] 按键点击时鼠标的位置。

  • mouse_hold_position : 列表[x,y] 按键点击并拖动时鼠标的位置。

  • mouse_up_position : 列表[x,y] 按键松开时鼠标的位置。

def _event(self, event: BaseEvent):
    # 等于 x, y = event["mouse_event_position"]
    x, y = event.get_mouse_pos()
    ...

See also

__getitem__ 中有所有可获取的 event 数据

Return type:

list

Returns:

[x,y] 鼠标相对画布的位置

get_wheel_value()

获取滚轮每次滚动的数值

Return type:

bool int: 每次滚轮滚动的量

init()
init_event_data(msg)
is_alt_pressed()

alt点击

Return type:

bool

Returns:

alt点击时返回True

is_cancel()

事件是否取消

Return type:

bool

Returns:

返回True 如果事件已取消

is_ctrl_pressed()

ctrl点击

Return type:

bool

Returns:

ctrl点击时返回True

is_double_click()

是否是双击

Return type:

bool

Returns:

双击时返回True

is_down_event()

按下事件

Return type:

bool

Returns:

除了鼠标悬停外的所有事件都会返回True

is_handled()

事件是否已处理

Return type:

bool

Returns:

返回True 如果事件已处理

is_hold_event()

拖拽事件

Return type:

bool

Returns:

当发生拖拽时,除了鼠标悬停外的所有事件都会返回True

is_key_pressed()

是否是键盘输入事件

Return type:

bool

Returns:

当键盘输入时返回True

is_mouse_left_pressed()

鼠标左键点击

Return type:

bool

Returns:

左键点击时为True

is_mouse_middle_pressed()

滚轮点击(又称为中键)

Return type:

bool

Returns:

中键点击时返回True

is_mouse_pressed()

输入事件为鼠标事件

Return type:

bool

Returns:

鼠标事件返回True

is_mouse_right_pressed()

鼠标右键点击

Return type:

bool

Returns:

右键点击时返回True

is_mouse_wheel_scrolled()

滚轮滚动

Return type:

bool

Returns:

滚轮滚动时返回True

is_redraw()

绘制是否被调用

Return type:

bool

Returns:

返回True 如果需要绘制

is_shift_pressed()

shift点击

Return type:

bool

Returns:

shift点击时返回True

is_special_key_pressed(key=61856)

KEY_MLEFT KEY_MRIGHT KEY_MMIDDLE KEY_MX1 KEY_MX2 KEY_SHIFT KEY_CONTROL KEY_ALT KEY_CAPSLOCK KEY_MODIFIERS KEY_COMMAND KEY_BACKSPACE KEY_TAB KEY_ENTER KEY_ESC KEY_SPACE KEY_DELETE KEY_UP KEY_DOWN KEY_LEFT KEY_RIGHT KEY_PGUP KEY_PGDOWN KEY_HOME KEY_END KEY_INSERT KEY_F1 KEY_F2 KEY_F3 KEY_F4 KEY_F5 KEY_F6 KEY_F7 KEY_F8 KEY_F9 KEY_F10 KEY_F11 KEY_F12 KEY_F13 KEY_F14 KEY_F15 KEY_F16 KEY_F17 KEY_F18 KEY_F19 KEY_F20 KEY_F21 KEY_F22 KEY_F23 KEY_F24 KEY_F25 KEY_F26 KEY_F27 KEY_F28 KEY_F29 KEY_F30 KEY_F31 KEY_F32

is_timer_event()

计时器事件

Return type:

bool

Returns:

主要是鼠标悬停事件时返回True

is_up_event()

松开事件

Return type:

bool

Returns:

除了鼠标悬停外的所有事件都会返回True

set_cancel()

设置事件为取消,事件会继续向下传递但不会有任何效果 此方法可以用于取消特定事件占用 c4d 界面其他控件的事件输入,

Note

设置时, 在 GeUserArea.InputEvent() 中返回 False 比如:滚轮事件如果不使用 set_cancel() 来取消, 则用户就无法通过滚轮来让 ScrollGroup 滚动

set_handled(handled_message=None)

设置事件为已处理,这里的处理只是个布尔值,实际上并不会发生任何事情 需要用户自己通过 is_handled() 来判定事件是否在传入前已经被其他对象处理过

Note

已处理的事件在AreaNode中将不再向下传递

如果你想要覆写 _event 方法,可以如下使用:

def _event(self, event):
    super()._event(event)
    if not event.is_handled:
        # 执行你想要执行的功能
        pass
Parameters:

handled_message (any) -- 可以向上层对象返回处理事件的对象, 默认为 None

set_redraw()

延迟调用绘制,在一个事件循环周期结束后调用 GeUserArea.Redraw() 方法

class ualib.core.BaseGraphicsItem

Bases: AreaNode

基础图形对象, 事件只有在区域内部发生才会向下传递, 绘制也可以限制在区域内部

Parameters:
  • moveable (bool) -- <prop> True 前对象可以被拖拽

  • focus (bool) -- <prop> 当前对象被聚焦时返回 True

  • selectable (bool) -- <prop> True 对象可被选择

  • selected (bool) -- <prop> 当前对象被选择时返回 True

  • color (c4d.Vector) -- <prop> 绘制时使用的默认颜色

  • opacity (float) -- <prop> 绘制时使用的默认透明度 (0-1)

BFH_CENTER = 0
BFH_FIT = 24
BFH_LEFT = 8
BFH_RIGHT = 16
BFH_SCALE = 32
BFH_SCALEFIT = 56
BFV_BOTTOM = 2
BFV_CENTER = 0
BFV_FIT = 3
BFV_SCALE = 4
BFV_SCALEFIT = 7
BFV_TOP = 1
DEFUALT_COLOR = <c4d.Vector object>
_mouse_drag_process_event(event: BaseEvent)

覆写方法

鼠标拖拽事件,通过 start_drag_event() 激活。

Parameters:

event (BaseEvent) -- 基础事件

_mouse_drag_start_event(event: BaseEvent)

覆写方法

鼠标拖拽事件,通过 start_drag_event() 激活。

Note

只会在拖拽开始时调用一次。

Parameters:

event (BaseEvent) -- 基础事件

_mouse_press_event(event: BaseEvent)

覆写方法

鼠标点击事件 可以通过 event.get_mouse_pos() 方法获取当前事件中的鼠标位置 可以通过 event.is_mouse_left_pressed() 方法获取是否是左击 可以通过 event.is_mouse_right_pressed() 方法获取是否是右击

Parameters:

event (BaseEvent) -- 基础事件

set_drag_mouse_follow(value=0.35)

拖拽时的对象跟随鼠标延迟,通常保持默认即可。

Parameters:

value (float, optional) -- 0 到 1 之间。设置为 1 时完全没有延迟。, defaults to 0.35

class ualib.core.BitmapItem(bmp=None, position=<c4d.Vector object>, size=<c4d.Vector object>)

Bases: BaseGraphicsItem

FIT_TYPE_FIT = 1
FIT_TYPE_FULL = 2
FIT_TYPE_HEIGHT = 3
FIT_TYPE_NONE = 0
FIT_TYPE_WIDTH = 4
_draw(ua)

绘制覆写方法,在这里一般只需绘制当前对象本身

Parameters:

ua (CoreGeUserArea) -- core 模块中的 CoreGeUserArea 对象

_update()

刷新绘制数据

Note

_update 方法会在 _draw_event 中自动调用,当执行具体的数据刷新时可以利用 dirty flag 来判断刷新时机避免无效的反复刷新(可以极大的提升效率)

def _update(self):
    if self.dirty_flag.has_flag(self.DIRTYFLAGS_CHANGES):
        # 内部数据更新代码写这里
    elif self.dirty_flag.has_flag(self.DIRTYFLAGS_MATRIX):
        # 位置变换数据更新代码写这里

Warning

_update() 本质上是在DrawMsg() 函数中调用的, 所以注意避免直接调用 CoreGeUserArea 的 LayoutChanged() 方法 , 否则可能会因陷入死循环而导致的C4D崩溃

change_bmp(bmp)
change_fit_type(fit_type=0)
change_size(size)
class ualib.core.BoxContainer(position=<c4d.Vector object>, size=<c4d.Vector object>, gap=10, border=[10, 10, 10, 10])

Bases: BaseGraphicsItem

LINESTYLE_DASHED = 2
LINESTYLE_DASHED_BIG = 4
LINESTYLE_DASHED_INV = 3
LINESTYLE_DOTTED = 1
LINESTYLE_NORMAL = 0
_update()

刷新绘制数据

Note

_update 方法会在 _draw_event 中自动调用,当执行具体的数据刷新时可以利用 dirty flag 来判断刷新时机避免无效的反复刷新(可以极大的提升效率)

def _update(self):
    if self.dirty_flag.has_flag(self.DIRTYFLAGS_CHANGES):
        # 内部数据更新代码写这里
    elif self.dirty_flag.has_flag(self.DIRTYFLAGS_MATRIX):
        # 位置变换数据更新代码写这里

Warning

_update() 本质上是在DrawMsg() 函数中调用的, 所以注意避免直接调用 CoreGeUserArea 的 LayoutChanged() 方法 , 否则可能会因陷入死循环而导致的C4D崩溃

add_child(item, align_flag=0, minsize=<c4d.Vector object>)
class ualib.core.ClipMapTextItem(text='Defualt', font_size=72, position=<c4d.Vector object>, size=<c4d.Vector object>)

Bases: BaseGraphicsItem

支持缩放的Text对象

_draw(ua)

绘制覆写方法,在这里一般只需绘制当前对象本身

Parameters:

ua (CoreGeUserArea) -- core 模块中的 CoreGeUserArea 对象

_update()

刷新绘制数据

Note

_update 方法会在 _draw_event 中自动调用,当执行具体的数据刷新时可以利用 dirty flag 来判断刷新时机避免无效的反复刷新(可以极大的提升效率)

def _update(self):
    if self.dirty_flag.has_flag(self.DIRTYFLAGS_CHANGES):
        # 内部数据更新代码写这里
    elif self.dirty_flag.has_flag(self.DIRTYFLAGS_MATRIX):
        # 位置变换数据更新代码写这里

Warning

_update() 本质上是在DrawMsg() 函数中调用的, 所以注意避免直接调用 CoreGeUserArea 的 LayoutChanged() 方法 , 否则可能会因陷入死循环而导致的C4D崩溃

get_text_clipmap_size()
set_change(text=None, font_size=None, color=None, color_text_bg=None)
class ualib.core.CoreGeUserArea(root)

Bases: GeUserArea

DrawMsg(x1, y1, x2, y2, msg)
Called when Cinema 4D wants you to draw your userarea.
Use the drawing functions to update your user area in the region specified by the rectangle from (x1,y1) to (x2,y2).
Parameters:
  • x1 (int) -- The upper left x coordinate.

  • y1 (int) -- The upper left y coordinate.

  • x2 (int) -- The lower right x coordinate.

  • y2 (int) -- The lower right y coordinate.

  • msg (c4d.BaseContainer) -- A mesage container.

GetMinSize()

Override this function to specify a minimum size for the user area.

def GetMinSize(self):
    #do a calculation here
    return self.width, self.height
Return type:

Tuple[int, int]

Returns:

A tuple with two elements just like this.

Init()
Called once when the user area is initialized by the GUI, before the layout is calculated.
Override this function if you need to initialize anything.

Note

Return True if successful, or False to signalize an error.

Return type:

bool

Returns:

True if successful, or False to signalize an error.

InitValues()
Called after the layout is calculated, before the user area is drawn.
Override this function if you need to initialize anything.

Note

Return True if successful, or False to signalize an error.

Return type:

bool

Returns:

True if successful, or False to signalize an error.

InputEvent(msg)
Called when an input event is received.
The information about the input event is stored in the msg container.

See also

Input Events.

Parameters:

msg (c4d.BaseContainer) -- The event container.

Return type:

bool

Returns:

True if the event was handled, otherwise False.

Message(msg, result)

Override this function to react to more messages than covered by the other functions. Normally this is not necessary.

Note

If overridden, include a call to the base version of this function, GeUserArea.Message():

def Message(self, msg, result):
    if msg.GetId():
        #Do something
        return True

    return c4d.gui.GeUserArea.Message(self, msg, result)

See also

/consts/MSG_C4DATOM_PLUGINS for information on the messages type, data and input/output.

Parameters:
  • msg (c4d.BaseContainer) -- The message container.

  • result (c4d.BaseContainer) -- A container to store results in.

Return type:

int

Returns:

The return value depends on the message.

Sized(w, h)

Called when the user area is resized.

Note

Override if you need to update anything.

Parameters:
  • w (int) -- The new width in pixels.

  • h (int) -- The new height in pixels.

Timer(msg)
If you subscribe to timer events using SetTimer() (x), this function is called every x th millisecond.
The raw timer message is stored in msg.
Parameters:

msg (c4d.BaseContainer) -- The timer message container.

new_event(event_type, msg, data=None)
set_clipping_region_with(x1, y1, x2, y2)
set_mouse_cursor(cursor=None)
这样用 set_mouse_cursor("MOUSE_HIDE")
MOUSE_HIDE #Hide cursor.
MOUSE_SHOW #Show cursor.
MOUSE_NORMAL #Normal cursor.
MOUSE_BUSY #Busy cursor.
MOUSE_CROSS #Cross cursor.
MOUSE_QUESTION #Question cursor
MOUSE_ZOOM_IN #Zoom in cursor.
MOUSE_ZOOM_OUT #Zoom out cursor.
MOUSE_FORBIDDEN #Forbidden cursor.
MOUSE_DELETE #Delete cursor.
MOUSE_COPY #Copy cursor.
MOUSE_INSERTCOPY #Insert copy cursor.
MOUSE_INSERTCOPYDOWN #Insert copy down cursor.
MOUSE_MOVE #Move cursor.
MOUSE_INSERTMOVE #Insert move cursor.
MOUSE_INSERTMOVEDOWN #Insert move cursor.
MOUSE_ARROW_H #Horizontal cursor.
MOUSE_ARROW_V #Vertical cursor.
MOUSE_ARROW_HV #Horizontal and vertical arrow cursor.
MOUSE_POINT_HAND #Point hand cursor.
MOUSE_MOVE_HAND #Move hand cursor.
MOUSE_IBEAM #I-beam cursor.
MOUSE_SELECT_LIVE #Live selection cursor.
MOUSE_SELECT_FREE #Free selection cursor.
MOUSE_SELECT_RECT #Rectangle selection cursor.
MOUSE_SELECT_POLY #Polygon selection cursor.
MOUSE_SPLINETOOLS #Spline tools cursor.
MOUSE_EXTRUDE #Extrude cursor.
MOUSE_NORMALMOVE #Normal move cursor.
MOUSE_ADDPOINTS #Add points cursor.
MOUSE_ADDPOLYGONS #Add polygons cursor.
MOUSE_BRIDGE #Bridge cursor.
MOUSE_MIRROR #Mirror cursor.
MOUSE_PAINTMOVE #Paint move cursor.
MOUSE_PAINTSELECTRECT #Paint select rectangle cursor.
MOUSE_PAINTSELECTCIRCLE #Paint select circle cursor.
MOUSE_PAINTSELECTPOLY #Paint select polygon cursor.
MOUSE_PAINTSELECTFREE #Paint select free cursor.
MOUSE_PAINTMAGICWAND #Paint magic wand cursor.
MOUSE_PAINTCOLORRANGE #Paint color range cursor.
MOUSE_PAINTFILL #Paint fill cursor.
MOUSE_PAINTPICK #Paint pick cursor.
MOUSE_PAINTBRUSH #Paint brush cursor.
MOUSE_PAINTCLONE #Paint clone cursor.
MOUSE_PAINTTEXT #Paint text cursor.
MOUSE_PAINTCROP #Paint crop cursor.
MOUSE_PAINTLINE #Paint line cursor.
MOUSE_PAINTPOLYSHAPE #Paint polygon shape cursor
class ualib.core.HBoxContainer(position=<c4d.Vector object>, size=<c4d.Vector object>, gap=10, border=[10, 10, 10, 10])

Bases: BoxContainer

class ualib.core.Node

Bases: BaseHierarchy

最基础的抽象对象 继承自 BaseHierarchy类 所以可以实现不同Node对象间的父子级关系

Parameters:
  • prop (dict) -- 用于管理Node对象所有的常规属性 (后续prop属性会用 <prop> 表示)

  • dirty_flag (SimpleFlag) -- 用于内部刷新使用的标志位对象

  • user_flag (SimpleFlag) -- 用户可以自由使用的标志位对象

DIRTYFLAGS_CHANGES = 'changes'
DIRTYFLAGS_MATRIX = 'matrix'
_draw(ua)

绘制覆写方法,在这里一般只需绘制当前对象本身

Parameters:

ua (CoreGeUserArea) -- core 模块中的 CoreGeUserArea 对象

_draw_child(ua, parent_region: list)

子对象绘制覆写方法,在这里一般绘制所有子对象,从后向前绘制,列表首位的子对象会显示在视图最上层

Note

insert_under方法会将子对象添加到 _children 列表的首位 insert_underlast 会添加到末尾 注意两种不同方式添加子对象绘制出来的前后顺序会不一样 其他添加方法查看 BaseHierarchy

Parameters:

ua (CoreGeUserArea) -- core 模块中的 CoreGeUserArea 对象

_draw_event(ua, parent_region: list)

绘制事件

Note

如果覆写该方法需要注意:内部刷新事件需要在绘制前调用并尽量遵循以下原则:

  • 1.先调用 _update() 进行数据刷新

  • 2.调用 _draw() 绘制当前对象

  • 3.调用 _draw_child() 绘制子对象

  • 4.调用 dirty_flag.clear_all_flags() 清理本次事件循环产生的 dirty flag

  • 5.调用 user_flag.clear_all_flags() 清理本次事件循环产生的 user flag

Parameters:
  • ua (CoreGeUserArea) -- core 模块中的 CoreGeUserArea 对象

  • parent_region (list) -- [x1,y1,x2,y2]

_event(event: BaseEvent)

事件处理,会将事件自动向下传递

采用事件冒泡的规则,优先处理子对象的事件再处理父对象,当 event.is_handled() 为True 事件停止转递, 覆写方法时应该先调用 super()._event(event) 再根据 event.is_handled() 的状态执行相应代码。

Parameters:

event (BaseEvent) -- 基础事件对象

_update()

刷新绘制数据

Note

_update 方法会在 _draw_event 中自动调用,当执行具体的数据刷新时可以利用 dirty flag 来判断刷新时机避免无效的反复刷新(可以极大的提升效率)

def _update(self):
    if self.dirty_flag.has_flag(self.DIRTYFLAGS_CHANGES):
        # 内部数据更新代码写这里
    elif self.dirty_flag.has_flag(self.DIRTYFLAGS_MATRIX):
        # 位置变换数据更新代码写这里

Warning

_update() 本质上是在DrawMsg() 函数中调用的, 所以注意避免直接调用 CoreGeUserArea 的 LayoutChanged() 方法 , 否则可能会因陷入死循环而导致的C4D崩溃

change_prop(key, value)
class ualib.core.Node2D

Bases: Node, BaseFrame

最基础的2D对象, 所有对象应该基于这个类创建

除了继承 Node类, 最重要的是Node2D继承了 BaseFrame类, 可以设置位置大小等参数 也可以通过 get_global_position() 在嵌套的父子级关系中获取全局坐标,方便用来最终绘制

常用的输入事件覆写以下方法使用:

  • _mouse_move_event 鼠标悬停

  • _doubleclick_event 双击

  • _mouse_press_event 鼠标点击

  • _key_press_event 键盘点击

  • _wheel_event 鼠标滚轮

  • _mouse_drag_start_event 鼠标拖拽开始

  • _mouse_drag_process_event 鼠标拖拽

  • _mouse_drag_release_event 鼠标拖拽结束

Parameters:

global_frame_changed (Signal) -- 当对象的位置发送改变时发射信号,并将所有下级的 DIRTYFLAGS_MATRIX 设置为 True

_debug_draw_frame(ua)

此方法用于 debug, 用户只需将 AUA.ua.draw_debug_frames 设为True 则所有 Node2D 都会绘制用于debug的红色虚线外轮廓

_doubleclick_event(event: BaseEvent)

覆写方法

鼠标双击事件 可以通过 event.is_mouse_left_pressed() 方法获取是否是左键双击

Parameters:

event (BaseEvent) -- 基础事件

_key_press_event(event: BaseEvent)

覆写方法

键盘点击事件 可以通过 event.get_key_value() 方法获取当前输入的字符

Parameters:

event (BaseEvent) -- 基础事件

_mouse_drag_process_event(event: BaseEvent)

覆写方法

鼠标拖拽事件,通过 start_drag_event() 激活。

Parameters:

event (BaseEvent) -- 基础事件

_mouse_drag_release_event(event: BaseEvent)

覆写方法

鼠标拖拽事件,通过 start_drag_event() 激活。

Note

只会在拖拽结束时调用一次。

Parameters:

event (BaseEvent) -- 基础事件

_mouse_drag_start_event(event: BaseEvent)

覆写方法

鼠标拖拽事件,通过 start_drag_event() 激活。

Note

只会在拖拽开始时调用一次。

Parameters:

event (BaseEvent) -- 基础事件

_mouse_move_event(event: BaseEvent)

覆写方法

鼠标悬停移动事件 可以通过 event.get_mouse_pos() 方法获取当前事件中的鼠标位置

Parameters:

event (BaseEvent) -- 基础事件

_mouse_press_event(event: BaseEvent)

覆写方法

鼠标点击事件 可以通过 event.get_mouse_pos() 方法获取当前事件中的鼠标位置 可以通过 event.is_mouse_left_pressed() 方法获取是否是左击 可以通过 event.is_mouse_right_pressed() 方法获取是否是右击

Parameters:

event (BaseEvent) -- 基础事件

_on_global_frame_changed()

当对象的全局位置发生改变时自动调用该方法,将自己以及所有的子对象(包括曾子孙)的 dirty_flag 设立 DIRTYFLAGS_MATRIX 标志位 用于在后续的刷新中使用

_wheel_event(event: BaseEvent)

覆写方法

鼠标滚轮事件 可以通过 event.get_wheel_value() 方法获取当前输入的滚动量

Note

注意:此事件默认调用 event.set_cancel() (可以防止拦截 ScrollGroup 的滚轮事件)

Parameters:

event (BaseEvent) -- 基础事件

start_drag_event(event: BaseEvent)

开始拖拽事件。在 _mouse_press_event 中调用该方法可以激活 _mouse_drag_start_event,_mouse_drag_process_event,_mouse_drag_release_event 事件

def _mouse_press_event(event):
    print("press called")

    # 可以先在上方执行鼠标按压命令,再调用拖拽。
    self.start_drag_event(event)

def _mouse_drag_start_event(self, event: BaseEvent):
    print("drag_start called")

def _mouse_drag_process_event(self, event: BaseEvent):
    print("drag_process called")

def _mouse_drag_release_event(self, event: BaseEvent):
    print("drag_release called")

# >>> "press called"
# >>> "drag_start called"
# >>> "drag_process called"
# >>> "drag_release called"
Parameters:

event (BaseEvent) -- 基础事件

Raises:

TypeError -- 此事件必须要在 _mouse_press_event 函数中调用

class ualib.core.RectItem(position=<c4d.Vector object>, size=<c4d.Vector object>, fill=False, line_width=1, line_style=0)

Bases: BaseGraphicsItem

LINESTYLE_DASHED = 2
LINESTYLE_DASHED_BIG = 4
LINESTYLE_DASHED_INV = 3
LINESTYLE_DOTTED = 1
LINESTYLE_NORMAL = 0
_draw(ua)

绘制覆写方法,在这里一般只需绘制当前对象本身

Parameters:

ua (CoreGeUserArea) -- core 模块中的 CoreGeUserArea 对象

class ualib.core.RoundRectItem(position=<c4d.Vector object>, size=<c4d.Vector object>, radius=15, round_offset=0.43, fill=False, line_width=2, line_style=0)

Bases: BaseBezierItem

LINESTYLE_DASHED = 2
LINESTYLE_DASHED_BIG = 4
LINESTYLE_DASHED_INV = 3
LINESTYLE_DOTTED = 1
LINESTYLE_NORMAL = 0
_update()

刷新绘制数据

Note

_update 方法会在 _draw_event 中自动调用,当执行具体的数据刷新时可以利用 dirty flag 来判断刷新时机避免无效的反复刷新(可以极大的提升效率)

def _update(self):
    if self.dirty_flag.has_flag(self.DIRTYFLAGS_CHANGES):
        # 内部数据更新代码写这里
    elif self.dirty_flag.has_flag(self.DIRTYFLAGS_MATRIX):
        # 位置变换数据更新代码写这里

Warning

_update() 本质上是在DrawMsg() 函数中调用的, 所以注意避免直接调用 CoreGeUserArea 的 LayoutChanged() 方法 , 否则可能会因陷入死循环而导致的C4D崩溃

change_size(size)
get_rect()

获取由bezier_object组成的倒角矩形

set_radius(radius)
set_seperate_radius(lt=None, rt=None, rb=None, lb=None)
class ualib.core.SimpelTextItem(text='Defualt', position=<c4d.Vector object>)

Bases: BaseGraphicsItem

COLOR_TRANS = 999
FONT_BIG = 4
FONT_BIG_BOLD = 5
FONT_BOLD = 2
FONT_DEFAULT = 0
FONT_ITALIC = 6
FONT_MONOSPACED = 3
FONT_STANDARD = 1
_draw(ua)

绘制覆写方法,在这里一般只需绘制当前对象本身

Parameters:

ua (CoreGeUserArea) -- core 模块中的 CoreGeUserArea 对象

class ualib.core.VBoxContainer(position=<c4d.Vector object>, size=<c4d.Vector object>, gap=10, border=[10, 10, 10, 10])

Bases: BoxContainer

ualib.utils module

class ualib.utils.BaseFrame(position=<c4d.Vector object>, size=<c4d.Vector object>)

Bases: BaseHierarchy

基础区域对象,可以通过位置和尺寸来返回全局bbox属性 即: x1, y1, x2, y2
可以通过set_alignment()方法或者offset, 设置中心点位置(默认在左上角)
除此之外支持一些常用判定方法:
1 (x,y)点是否在该区域
2 是否与区域 [x1, y1, x2, y2] 相交
3 获取与区域 [x1, y1, x2, y2] 相交的区域 [ox1, oy1, ox2, oy2]
...
ALIGNMENT_CENTER = <c4d.Vector object>
ALIGNMENT_LEFT_BOTTOM = <c4d.Vector object>
ALIGNMENT_LEFT_MID = <c4d.Vector object>
ALIGNMENT_LEFT_TOP = <c4d.Vector object>
ALIGNMENT_MID_BOTTOM = <c4d.Vector object>
ALIGNMENT_MID_TOP = <c4d.Vector object>
ALIGNMENT_RIGHT_BOTTOM = <c4d.Vector object>
ALIGNMENT_RIGHT_MID = <c4d.Vector object>
ALIGNMENT_RIGHT_TOP = <c4d.Vector object>
get_box_offset(offset=<c4d.Vector object>)

获取相对的偏移位置, 可以用于获取中心点等特殊位置

get_global_bbox()
get_global_position()
get_overlap_rect_with(x1, y1, x2, y2)
is_intersect_with(x1, y1, x2, y2)
is_point_inside(x, y)
property offset
property position
static rect_overlap(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2)
property size
class ualib.utils.BaseHierarchy

Bases: object

一个用于管理父子级关系的基类。

get_children()

获取该节点的子节点列表。

get_down()

获取第一个子节点。

get_downlast()

获取最后一个子节点。

get_next()

获取下一个兄弟节点。

get_pred()

获取前一个兄弟节点。

get_up()

获取父节点。

insert_after(obj)

在指定节点之后插入该节点。

insert_before(obj)

在指定节点之前插入该节点。

insert_under(obj)

将该节点添加为指定节点的第一个子节点。

insert_underlast(obj)

将该节点添加为指定节点的最后一个子节点。

iter_all_children()

获取该节点的所有子孙节点的生成器。

remove()

从父节点的子节点列表中移除该节点。

remove_all_children()

移除该节点的所有子节点。

set_children(children)

设置子节点列表。

set_parent(parent)

设置父节点。

class ualib.utils.Signal(*args_types, **kwargs_types)

Bases: object

用于模仿pyqt中的Signal类。

connect(slot: Callable)

将槽函数连接到信号上。

disconnect(slot)

将槽函数从信号上断开连接。

emit(*args, **kwargs)

发送信号,调用所有连接的槽函数。

class ualib.utils.SimpleFlag(flag_names: List[str] = [])

Bases: object

标志位类,用于管理和操作多个二进制标志位。

flags

所有标志位的值。

Type:

int

flag_names

所有标志位的名称。

Type:

List[str]

clear_all_flags() None

清除所有标志位。

clear_flag(flag: str | int) None

清除指定的标志位。

Parameters:

flag -- 标志位的名称或位置。

get_flag_by_position(position: int) str

通过位置获取标志位的名称。

Parameters:

position -- 标志位的位置。

Returns:

标志位的名称。

Return type:

str

get_flag_names() List[str]

获取所有标志位的名称。

Returns:

所有标志位的名称列表。

Return type:

List[str]

get_flag_positions() List[int]

获取所有标志位的位置。

Returns:

所有标志位的位置列表。

Return type:

List[int]

has_flag(flag: str | int) bool

检查是否存在指定的标志位。

Parameters:

flag -- 标志位的名称或位置。

Returns:

True表示存在该标志位,False表示不存在。

Return type:

bool

init_flag(flag_names: List[str])
set_flag(flag: str | int) None

设置指定的标志位。

Parameters:

flag -- 标志位的名称或位置。

toggle_flag(flag: str | int) None

切换指定的标志位。

Parameters:

flag -- 标志位的名称或位置。

class ualib.utils.SingleBezierObject(start=<c4d.Vector object>, end=<c4d.Vector object>, start_hand_offset=<c4d.Vector object>, end_hand_offset=<c4d.Vector object>)

Bases: object

贝塞尔曲线对象

attach_bezier(bezier_object, attach_type='end')

连接上下游 bezier_object

Parameters:
  • bezier_object (SingleBezierObject) -- SingleBezierObject

  • attach_type (str, optional) -- "start" 或者 "end"

change(part, value, update=True)

修改BezierObject的参数

Parameters:
  • part (str) -- "start", "end","start_hand_offset","end_hand_offset", 中的一个

  • value (Vector) -- 位置数据

  • update (bool) -- 当 update 为 True时才会更新 start_list 和 points_list 属性, 若连续修改同一对象的不同part可以最后一次修改时设置True, 可以提升效率

static get_all_points(bezier_object_list, offset=<c4d.Vector object>, innder_update=False)

将独立的bezier_objects作为一个对象获取全局点位

Parameters:
  • bezier_object_list (list) -- SingleBezierObject 对象组成的列表

  • offset (Vector, list) -- 偏移量

  • innder_update (bool) -- 完全刷新所有对象的点位 (若已经刷新过,设置为False可以提升效率)

Returns:

[start x, start y] points_list (list) : [other points]

Return type:

start_list (list)

get_part(part)

获取BezierObject的参数

Parameters:

part (str) -- "start", "end","start_hand_offset","end_hand_offset", 中的一个

Returns:

四个控制点中对应part的位置

Return type:

part (Vector)

get_points(update=False)

获取当前对象绘制贝塞尔曲线所需的所有点

Parameters:

update (bool, optional) -- 是否刷新,若无刷新必要设为False可以提升效率

Returns:

[start x, start y] points_list (list) : [other points]

Return type:

start_list (list)

update_list()

更新当前对象绘制贝塞尔曲线所需的所有点

ualib.utils.get_bitmap_from(source) BaseBitmap

通过输入图片路径或者c4d icon id来返回对应的 bitmap对象

Parameters:

source (int or str) -- 对应参数

Return type:

c4d.bitmaps.BaseBitmap

ualib.utils.set_mouse_pointer(name)
这样用 set_mouse_pointer("MOUSE_HIDE")
MOUSE_HIDE #Hide cursor.
MOUSE_SHOW #Show cursor.
MOUSE_NORMAL #Normal cursor.
MOUSE_BUSY #Busy cursor.
MOUSE_CROSS #Cross cursor.
MOUSE_QUESTION #Question cursor
MOUSE_ZOOM_IN #Zoom in cursor.
MOUSE_ZOOM_OUT #Zoom out cursor.
MOUSE_FORBIDDEN #Forbidden cursor.
MOUSE_DELETE #Delete cursor.
MOUSE_COPY #Copy cursor.
MOUSE_INSERTCOPY #Insert copy cursor.
MOUSE_INSERTCOPYDOWN #Insert copy down cursor.
MOUSE_MOVE #Move cursor.
MOUSE_INSERTMOVE #Insert move cursor.
MOUSE_INSERTMOVEDOWN #Insert move cursor.
MOUSE_ARROW_H #Horizontal cursor.
MOUSE_ARROW_V #Vertical cursor.
MOUSE_ARROW_HV #Horizontal and vertical arrow cursor.
MOUSE_POINT_HAND #Point hand cursor.
MOUSE_MOVE_HAND #Move hand cursor.
MOUSE_IBEAM #I-beam cursor.
MOUSE_SELECT_LIVE #Live selection cursor.
MOUSE_SELECT_FREE #Free selection cursor.
MOUSE_SELECT_RECT #Rectangle selection cursor.
MOUSE_SELECT_POLY #Polygon selection cursor.
MOUSE_SPLINETOOLS #Spline tools cursor.
MOUSE_EXTRUDE #Extrude cursor.
MOUSE_NORMALMOVE #Normal move cursor.
MOUSE_ADDPOINTS #Add points cursor.
MOUSE_ADDPOLYGONS #Add polygons cursor.
MOUSE_BRIDGE #Bridge cursor.
MOUSE_MIRROR #Mirror cursor.
MOUSE_PAINTMOVE #Paint move cursor.
MOUSE_PAINTSELECTRECT #Paint select rectangle cursor.
MOUSE_PAINTSELECTCIRCLE #Paint select circle cursor.
MOUSE_PAINTSELECTPOLY #Paint select polygon cursor.
MOUSE_PAINTSELECTFREE #Paint select free cursor.
MOUSE_PAINTMAGICWAND #Paint magic wand cursor.
MOUSE_PAINTCOLORRANGE #Paint color range cursor.
MOUSE_PAINTFILL #Paint fill cursor.
MOUSE_PAINTPICK #Paint pick cursor.
MOUSE_PAINTBRUSH #Paint brush cursor.
MOUSE_PAINTCLONE #Paint clone cursor.
MOUSE_PAINTTEXT #Paint text cursor.
MOUSE_PAINTCROP #Paint crop cursor.
MOUSE_PAINTLINE #Paint line cursor.
MOUSE_PAINTPOLYSHAPE #Paint polygon shape cursor

Module contents

author: jackadux version: 1.0.0