https://en.wikipedia.org/wiki/Plane_(geometry)#Point-normal_form_and_general_form_of_the_equation_of_a_planethe values in C4Plane are abcd.
bl_info = { "name": "Face Normal Display", "author": "CoDEmanX", "version": (1, 0), "blender": (2, 68, 0), "location": "Properties Editor > Data > Normals", "description": "Show normal property for active mesh face", "warning": "Edited normal is discarded on mode change!", "wiki_url": "", "tracker_url": "", "category": "Mesh"}import bpyimport bmeshfrom mathutils import Vectordef draw_func(self, context): layout = self.layout wm = context.window_manager me = context.object.data row = layout.row() row.active = me.is_editmode col = row.column() col.scale_y = 3 col.scale_x = 2 col.prop(wm, "face_normal_lock", icon='LOCKED' if wm.face_normal_lock else 'UNLOCKED', text="") sub = row.row() sub.enabled = not wm.face_normal_lock col = sub.column() if me.is_editmode: bm = bmesh.from_edit_mesh(me) if bm.faces.active is not None: col.prop(wm, "face_normal_active", text="", expand=True) sub.prop(wm, "face_normal_active", text="") if wm.face_normal_normalize and wm.face_normal_active != bm.faces.active.normal: wm.face_normal_active = bm.faces.active.normal else: col.label("No active face!") else: p = me.polygons if p.active is not None: col.prop(p[p.active], "normal", text="", expand=True) row.prop(p[p.active], "normal", text="") else: col.label("No active face!") layout.column().prop(wm, "face_normal_normalize")def upd_normal(self, context): bm = bmesh.from_edit_mesh(context.object.data) if context.window_manager.face_normal_normalize: bm.faces.active.normal = self.face_normal_active.normalized() else: bm.faces.active.normal = self.face_normal_activedef upd_normalize(self, context): if self.face_normal_normalize: upd_normal(self, context)def register(): bpy.types.DATA_PT_normals.prepend(draw_func) bpy.types.WindowManager.face_normal_active = bpy.props.FloatVectorProperty(subtype='DIRECTION', min=-1.0, max=1.0, precision=3, update=upd_normal) bpy.types.WindowManager.face_normal_lock = bpy.props.BoolProperty(name="Lock", description="Disable normal editing above") bpy.types.WindowManager.face_normal_normalize = bpy.props.BoolProperty(name="Normalize / Update on selection changes", description="Disable for manual input, then re-enable", update=upd_normalize)def unregister(): bpy.types.DATA_PT_normals.remove(draw_func) del bpy.types.WindowManager.face_normal_active del bpy.types.WindowManager.face_normal_lock del bpy.types.WindowManager.face_normal_normalizeif __name__ == "__main__": register()