ZoomLevel_control

/*********************************************************/

//2010年8月11日周三

//ZoomLevel control

/********************************************************/

The ZoomLevel control allows the user to zoom quickly to a particular scale in a Map. The control displays a bar with several cross-tics, each tic representing a scale level in the map. When the user clicks on a tic, the map zooms to the corresponding scale. The user can also click on the plus or minus signs to zoom to the next scale level. The ZoomLevel control buddies to one Map control on the page. You can place the control on the page where you want users to see it. It can be placed within a table or other containing control.
ZoomLevel控件允许用户快速的将地图缩放到一个特殊的比例。ZoomLevel控件显示了一个含有刻度的Bar,每一个刻度都代表地图的一个比例级别。当用户单击一个刻度,地图就会缩放到相应的比例。

用户也可以单击plus或者minus标记将地图缩放到相邻的级别。ZoomLevel控件仅仅和页面中的一个Map地图控件(ˇˍˇ) 相绑定。你可以将控件放置到页面中任何用户想想看到的位置。她可以被放置到一个表格或者其他的容器控件


Assembly: ESRI.ArcGIS.ADF.Web.UI.WebControls.dll
Class: ESRI.ArcGIS.ADF.Web.UI.WebControls.ZoomLevel

 

Using the ZoomLevel control

Add the controls to the page
使用ZoomLevel控件

向页面中添加控件
Open or create a Web site within Visual Studio.NET.   Open a Web form in design mode, select the Toolbox, and expand the ArcGIS Web Controls tab.  Drag and drop a Map control, a ZoomLevel control, and a MapResourceManager control onto the Web form. 
在VS.NET中打开或者创建一个web站点。在设计模式下打开一个表格,选择工具箱然后展开ArcGIS Web 控件Tab。向页面中添加一个Map控件、一个ZoomLevel控件、一个MapResourceManager控件。
Add one or more resources to the MapResourceManager.  See the Add Resources section in the MapResourceManager control topic for information on how to do this. Also set the Map control's MapResourceManager property to Map1. See Map Control for information on setting this property. Your page should resemble the following in Visual Studio.NET:

添加一个或者多个资源到MapResourceManager控件,在MapResourceManager控件的部分查看AddResource章节获取如何操纵的相关信息。

  

Set ZoomLevel properties
设置ZoomLevel的属性
Select the ZoomLevel control.  In the Properties page:

Set the BuddyControl property of the ZoomLevel control to the Map control you added earlier. You should be able to select this Map control from the drop-down list.

Other property settings may be left at their defaults, or may be modified as desired. These include the images displayed to the user and appearance settings common to web controls.   

选中ZoomLevel控件,打开它的属性窗口

设置ZoomLevel控件的BuddyControl属性为你在前面添加的地图控件的属性,你应该从它的drop-down下拉列表里面选择地图控件。

其他的属性也许可能让他们保持默认的值,或者根据需要重新定义新的值。这些包括展示给用户的图片和web控件外表显示的通用设置。

 

Members

Properties
The following table provides a list of properties of interest.  For complete reference information, see the ZoomLevel control in the library reference section.

下面的表格提供了一系列的属性。更全面的引用信息,查看引用库中ZoomLevel控件的章节

Property Name

 Type

Description

BottomImage

string

The image displayed at the lowest zoom level end of the zoom level control.

DefaultImage

string

The image displayed for a non-selected zoom level.

ImagePath

string

The location of the images used by the zoom level control.

Map

string

The Map Control to associate with this ZoomLevel Control.

Orientation

ZoomOrientation

Whether the control is oriented vertically or horizontally.

SelectedImage

string

The image displayed for the selected zoom level.

TopImage

string

The image displayed at the lowest zoom level end of the zoom level control.

private void pictureBox1_Paint(object sender, PaintEventArgs e) { e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; // 计算实际绘制区域 var clientRect = pictureBox1.ClientRectangle; // 自动计算数据边界(需要预先获取points的实际范围) float dataMinX = points.Min(p => p.fiveX); float dataMaxX = points.Max(p => p.fiveX); float dataMinY = points.Min(p => p.sexY); float dataMaxY = points.Max(p => p.sexY); // 计算缩放比例 float scaleX = clientRect.Width / (dataMaxX - dataMinX); float scaleY = clientRect.Height / (dataMaxY - dataMinY); float zoomLevel = Math.Min(scaleX, scaleY) * 0.9f; // 保留10%边距 // 计算偏移量 float offsetX = -dataMinX * zoomLevel + (clientRect.Width - (dataMaxX - dataMinX) * zoomLevel) / 2; float offsetY = -dataMinY * zoomLevel + (clientRect.Height - (dataMaxY - dataMinY) * zoomLevel) / 2; e.Graphics.TranslateTransform(offsetX, offsetY); e.Graphics.ScaleTransform(zoomLevel, zoomLevel); currentTransform = e.Graphics.Transform; // 绘制点(自动适应后的坐标) foreach (var point in points) { float pointSize = 4f / zoomLevel; // 动态调整点大小 e.Graphics.FillEllipse(Brushes.Blue, point.fiveX - pointSize / 2, point.sexY - pointSize / 2, pointSize, pointSize); // 同理处理其他坐标点 e.Graphics.FillEllipse(Brushes.Red, point.eightX - pointSize / 2, point.nineY - pointSize / 2, pointSize, pointSize); } }功能点添加可以在pictureBox1里面放大缩小也可以框选在不修改pictureBox1_Paint的情况下
03-24
root@NVR:~# ubus list -v 'chm_debug' @3bc5bee7 "chm_set_debug_level": { "level": "Integer" } 'chm_dev_manager' @d8112d5a "chm_ubus_set_device_status": { "device_list": "Array" } "chm_dev_manager_simple_mode_config": { "enable": "Integer" } "chm_dev_manager_chn_extend_config": { "enable": "Integer" } "chm_dev_manager_encode_config": { "enable": "Integer" } "chm_dev_manager_smartcodec_config": { "enable": "Integer" } "chm_dev_manager_rsa_decrypt": { "ciphertxt": "String" } "chm_ubus_dev_ver_info_refresh": { "channel": "String" } "chm_dev_manager_get_device_version_info": { } "chm_ubus_device_discovery": { } "chm_ubus_get_added_device_idx": { } "chm_ubus_get_device_num": { } "chm_ubus_get_device_list": { "type": "Integer", "start": "Integer", "num": "Integer" } "chm_ubus_check_fisheye_ipc": { "channel": "Integer" } "chm_ubus_add_device": { "device_list": "Array", "ignore_bw": "Integer" } "chm_ubus_delete_device": { "channel": "String" } "chm_ubus_get_device_url": { "channel": "String" } "chm_ubus_edit_device": { "channel": "Integer", "name": "String", "connect_prot": "String", "port": "Integer", "username": "String", "ciphertext": "String", "passwd_strength": "String", "rtsp_prot": "String" } "chm_ubus_edit_device_list": { "device_list": "Array" } "chm_ubus_edit_device_url": { "channel": "Integer", "name": "String", "username": "String", "ciphertext": "String", "url_main": "String", "url_sub": "String" } "chm_dev_manager_conn_status_report": { "channel": "Integer", "status": "Integer", "audio_support": "Integer" } "chm_ubus_change_password": { "channel": "Integer", "old": "String", "new": "String", "passwd_strength": "String", "reset_pwd_email": "String" } "chm_ubus_change_password_list": { "device_list": "Array" } "chm_ubus_set_sec_question": { "channel": "Integer", "old": "String", "sec_question_1": "String", "sec_answer_1": "String", "sec_question_2": "String", "sec_answer_2": "String", "sec_question_3": "String", "sec_answer_3": "String" } "chm_ubus_get_sec_question": { "channel": "Integer" } "chm_ubus_get_adding_dev_sec_question": { "uuid": "String", "ip": "String", "port": "Integer" } "chm_ubus_check_sec_answer": { "uuid": "String", "ip": "String", "port": "Integer", "sec_answer_1": "String", "sec_answer_2": "String", "sec_answer_3": "String" } "chm_ubus_forget_sec_settings": { "uuid": "String", "ip": "String", "port": "Integer" } "chm_ubus_get_sensor_framerate": { "channel": "Integer" } "chm_ubus_get_expose_and_image_setting": { "channel": "Integer" } "chm_ubus_set_sensor_framerate": { "channel": "Integer", "sensor_framerate": "Integer" } "chm_ubus_set_sensor_framerate_all": { "sensor_framerate": "Integer" } "chm_ubus_get_device_security_code": { "uuid": "String" } "chm_ubus_device_verification_code_check": { "uuid": "String", "code": "String" } "chm_ubus_device_password_reset": { "uuid": "String", "code": "String", "username": "String", "ciphertext": "String" } "chm_ubus_device_password_reset_by_sec_question": { "uuid": "String", "ip": "String", "port": "Integer", "stok": "String", "old": "String", "new": "String" } "chm_ubus_set_factory_device_password": { "uuid": "String", "username": "String", "ciphertext": "String", "reset_pwd_email": "String", "ip": "String", "port": "Integer", "sec_question_1": "String", "sec_answer_1": "String", "sec_question_2": "String", "sec_answer_2": "String", "sec_question_3": "String", "sec_answer_3": "String" } "chm_ubus_alloc_device_ipaddr": { "base_list": "Array", "device_list": "Array" } "chm_ubus_ip_conflict_detect": { "device_list": "Array" } "chm_ubus_set_device_ipaddr": { "device_list": "Array" } "chm_ubus_localnode_change_handler": { } "chm_ubus_set_system_auto_reboot": { "channel": "String" } "chm_ubus_set_system_reset": { "channel": "String" } "chm_ubus_set_system_restore": { "channel": "String" } "chm_ubus_recv_center_task_queue_print": { } "chm_ubus_check_video_configuration_ready": { } "chm_ubus_check_motion_detect_conf_ready": { } "chm_ubus_channel_video_configuration_adapt": { "channel": "String", "type": "Integer" } "chm_ubus_get_notified_event": { } "chm_ubus_activate_hik_device": { "mac": "String", "password": "String" } "chm_ubus_force_chn_iframe": { "targets": "Array" } "chm_ubus_set_source_time_info": { "source_time_priority": "String", "source_mac": "String", "transmit": "Integer" } "chm_ubus_manual_msg_alarm": { "channel": "Integer", "action": "String" } "chm_dev_manager_notify_reconnected": { "source_time_priority": "String", "source_mac": "String", "transmit": "Integer" } "chm_ubus_set_chn_id": { "old_id": "Integer", "chn_id": "Integer" } "chm_ubus_get_smart_analysis_version": { "chn_id": "Integer" } "chm_ubus_get_smart_analysis_version_list": { "chn_list": "String" } "chm_ubus_set_onvif_enable": { "enable": "Integer" } "chm_ubus_lc_debug": { "chnid": "Integer" } "chm_ubus_check_ip_conflict": { "ipaddr_list": "Array" } "chm_ubus_limit_bandwidth": { "enable": "Integer", "mode": "Integer" } 'chm_display' @58f4b44b "chm_display_set_imaging_settings": { "channel": "String", "mode_config": "String" } "chm_display_set_imaging_BLC_area": { "chn_id": "Integer", "mode_config": "Integer", "x_coor": "Integer", "y_coor": "Integer", "width": "Integer", "height": "Integer" } "chm_display_set_OSD_settings": { "channel": "String", "mode_config": "String" } "chm_display_set_cover_settings": { "channel": "String", "mode_config": "String" } "chm_display_get_cover_settings": { "channel": "String", "mode_config": "String" } 'chm_event_detect' @d8227bc4 "chm_event_detect_debug": { } "chm_motion_detect_restart": { "channel": "String" } "chm_tamper_detect_restart": { "channel": "String" } "chm_intrusion_detect_restart": { "channel": "String" } "chm_linecross_detect_restart": { "channel": "String" } "chm_regen_detect_restart": { "channel": "String" } "chm_regex_detect_restart": { "channel": "String" } "chm_at_detect_restart": { "channel": "String" } "chm_vd_detect_restart": { "channel": "String" } "chm_pd_detect_restart": { "channel": "String" } "chm_lt_detect_restart": { "channel": "String" } "chm_sc_detect_restart": { "channel": "String" } "chm_ae_detect_restart": { "channel": "String" } "chm_get_smart_detection_conf": { "chn_id": "Integer", "event_type": "String" } "chm_get_smart_detection_conf_from_local": { "chn_id": "Integer", "event_type": "String" } "chm_get_all_channel_smart_detection_conf": { "event_type": "String" } "chm_get_all_channel_smart_analysis": { "smart_type_list": "Array" } "chm_get_msg_alarm_list": { "chn_id": "Integer" } "chm_set_channel_alarm": { "chn_id": "Integer", "light_onoff": "Integer", "sound_onoff": "Integer", "event_type": "String", "sub_name": "String" } "chm_onvif_notify": { "ip": "String", "info": "String" } "chm_get_ai_enhance_capability": { "chn_id": "Integer" } "chm_get_face_enhance_capability": { "chn_id": "Integer" } "chm_set_motion_detect_arming_schedule": { "channel": "String" } "chm_set_intrusion_detect_arming_schedule": { "channel": "String" } "chm_set_linecross_detect_arming_schedule": { "channel": "String" } "chm_set_regen_detect_arming_schedule": { "channel": "String" } "chm_set_regex_detect_arming_schedule": { "channel": "String" } "chm_set_at_detect_arming_schedule": { "channel": "String" } "chm_set_vd_detect_arming_schedule": { "channel": "String" } "chm_set_pd_detect_arming_schedule": { "channel": "String" } "chm_set_lt_detect_arming_schedule": { "channel": "String" } "chm_set_sc_detect_arming_schedule": { "channel": "String" } "chm_set_ae_detect_arming_schedule": { "channel": "String" } "chm_get_stranger_face": { "channel": "String" } "chm_get_family_face": { "channel": "String" } "chm_add_black_group": { "chn_id": "Integer", "sec_name": "String", "group_name": "String" } "chm_set_face_group": { "chn_id": "Integer", "sec_name": "String", "group_name": "String", "confidence": "Integer", "light_alarm_enabled": "Integer", "sound_alarm_enabled": "Integer" } "chm_delete_face_group": { "chn_id": "Integer", "name": "Array" } "chm_set_face_comparison": { "chn_id": "Integer", "enabled": "Integer", "mode": "String" } "chm_get_group_face": { "chn_id": "Integer", "sec_name": "String", "group_name": "String" } "chm_add_family_face": { "chn_id": "Integer", "face_sec_name": "Array", "group_sec_name": "String" } "chm_add_stranger_face": { "chn_id": "Integer", "stranger_face_id": "Array", "group_sec_name": "String" } "chm_delete_face": { "chn_id": "Integer", "face_name": "Array" } "chm_get_face_group": { "channel": "String" } "chm_face_comparison_restart": { "channel": "String" } "chm_load_motion_config": { "channel": "String" } "chm_set_marker_box_enable": { "channel": "String", "enabled": "String" } "chm_set_motion_detect_enable": { "channel": "String", "enabled": "String" } "chm_set_tamper_detect_enable": { "channel": "String", "enabled": "String" } "chm_set_intrusion_detect_enable": { "channel": "String", "enabled": "String" } "chm_set_linecross_detect_enable": { "channel": "String", "enabled": "String" } "chm_set_smtevt_detect_enable": { "channel": "String", "enabled": "String", "event": "String" } "chm_set_smart_analysis_enable": { "channel": "String", "smart_event_enabled": "String", "face_snapshot_enabled": "String", "object_attr_enabled": "String" } "chm_set_smart_analysis_switch": { "channel": "String", "switch_mode": "String" } "chm_set_face_snapshot_enable": { "channel": "String", "enabled": "String" } "chm_face_snapshot_restart": { "channel": "String" } "chm_load_face_config": { "channel": "String" } "chm_set_face_snapshot_arming_schedule": { "channel": "String" } "chm_set_obj_attr_enable": { "channel": "String", "peopleattr_enable": "String", "vehicleattr_enable": "String" } 'chm_ptz' @32564423 "chm_ubus_ptz_basic_control_opt": { "chn_id": "Integer", "direction": "Integer", "speed": "String" } "chm_ubus_ptz_preset_opt": { "chn_id": "Integer", "preset_id": "Integer", "preset_name": "String", "save_ptz": "Integer", "opt_type": "Integer" } "chm_ubus_ptz_tour_opt": { "chn_id": "Integer", "tour_id": "Integer", "opt_type": "Integer" } "chm_ubus_ptz_pattern_opt": { "chn_id": "Integer", "pattern_id": "Integer", "opt_type": "Integer" } "chm_ubus_ptz_3Dzoom_opt": { "chn_id": "Integer", "start_x": "String", "start_y": "String", "end_x": "String", "end_y": "String" } "chm_ubus_ptz_debug_info": { "chn_id": "Integer", "info_type": "Integer" } "chm_ubus_ptz_lens_mask": { "chn_id": "Integer", "opt_type": "Integer", "enabled": "String" } "chm_ubus_ptz_target_track_info": { "chn_id": "Integer", "opt_type": "Integer", "enabled": "String", "people_enabled": "String" } "chm_ubus_ptz_park_set": { "chn_id": "Integer" } "chm_ubus_ptz_lens_init": { "chn_id": "Integer" } "chm_ubus_ptz_auto_focus": { "chn_id": "Integer" } 'chm_slp' @90d939ff "chm_slp_passthrough": { "device_list": "Array" } 'chm_stream' @9c21aaea "chm_stream_set_video_encoder_settings": { "channel": "String" } "chm_stream_set_ROI_settings": { "channel": "String" } "chm_stream_set_audio_config": { "channel": "String" } "chm_stream_set_advance_settings": { "channel": "String" } 'cloud_brd' @39dae7f3 "cloud_brd_set_debug_level": { "level": "Integer" } "cloud_cycle_dump": { } 'cloud_service' @dba17bfa "set_dbg_level": { "dbg_level": "Integer" } "check_fw_version": { } "request_device_token": { } "get_device_token": { } 'cloudclient' @b4567941 "construct_ssl_path": { "service_type": "Integer", "source": "String" } "cloud_set_level": { "level": "Integer" } "cloud_set_brd_level": { "level": "Integer" } "get_cloud_switch": { } "get_link_status": { } "dump_cloud_brd": { } "user_register": { "user_conf_path": "String" } "user_login": { "user_conf_path": "String" } "user_bind": { "username": "String", "password": "String" } "user_unbind": { "user_conf_path": "String" } "check_fw_version": { "user_conf_path": "String" } "download_fw": { "download_url": "String", "download_type": "Integer" } "cancel_download_fw": { } "get_cloud_account_stat": { "cloud_username": "String" } "reset_cloud_password": { "user_conf_path": "String" } "modify_cloud_password": { "user_conf_path": "String" } "resend_register_email": { "cloud_username": "String" } "get_reg_verify_code": { "user_conf_path": "String" } "get_reset_pwd_verify_code": { "user_conf_path": "String" } "check_reg_verify_code": { "user_conf_path": "String" } "check_reset_pwd_verify_code": { "user_conf_path": "String" } "notify_event": { "params": "Table" } "send_cloud_msg": { "method": "String", "params": "Table", "script": "String" } "knock": { "update_share_info": "Array" } "share_permission_check": { "seqNum": "Integer", "shareId": "String", "subDevice": "String", "action": "String" } "get_device_token": { "service_id": "String" } "send_device_token_request": { "serviceIds": "Array" } "get_device_token_by_serviceid": { "serviceIds": "String" } "get_vms_status": { } "get_vms_device_id": { } "set_vms_info": { } "get_vms_device_token_by_serviceid": { "serviceId": "String", "force_update": "Integer" } "enable_vms": { "enable": "Integer" } "check_device": { "username": "String", "password": "String", "passwdType": "String" } "reset_device_password": { "user_conf_path": "String" } "cloud_config": { "operate_mode": "Integer", "url": "String" } "cloud_log": { "url": "String" } 'genericd' @6898aa93 "internetd_switch": { "switch": "Integer", "period": "Integer" } "get_internetd_status": { } 'msg_push' @6859caa0 "enable_reconfig": { } "plan_reconfig": { } "vms_enable_reconfig": { } "vms_plan_reconfig": { } "update_dev_name": { } "msg_share_reconfig": { } "event_push_enable_reconfig": { } "show_cfg": { } "email_info_reconfig": { } "email_event_reconfig": { } "show_email_alarm_cfg": { } "email_info_test": { } "disarming_reconfig": { } "notify_cloud_connect_status": { "connect_status": "Integer" } "notify_cloud_bind_status": { "bind_status": "Integer" } "notify_vms_connect_status": { "connect_status": "Integer" } "set_dbg_level": { "dbg_level": "Integer" } "vms_device_token": { "type": "String" } "vms_push_iframe": { "channel": "String", "type": "String" } "alarm_info_test": { "ip_or_domain": "String", "port": "String" } "stop_raid_rebuild_buzzing": { } 'msglog_v2' @4aa4a628 "msglog_search": { "client_id": "Integer", "search_id": "Integer", "start_time": "Integer", "end_time": "Integer", "types": "Array", "offset": "Integer", "number": "Integer" } "msglog_export": { "client_id": "Integer", "start_time": "Integer", "end_time": "Integer", "types": "Array", "dev_path": "String", "file_path": "String" } "msglog_sync": { } "msglog_export_progress": { "client_id": "Integer" } "msglog_search_tmp": { "start_time": "Integer", "end_time": "Integer", "main_type": "Integer", "offset": "Integer", "number": "Integer" } "msglog_export_tmp": { "start_time": "Integer", "end_time": "Integer", "main_type": "Integer", "number": "Integer" } "msglog_get_type_offset": { "main": "Integer", "sub": "Integer" } 'netlinkd' @1d10548d "send": { "cmd": "String", "data": "String" } 'network' @de13d900 "restart": { } "reload": { } "add_host_route": { "target": "String", "v6": "Boolean" } "get_proto_handlers": { } 'network.device' @198c9cec "status": { "name": "String" } "set_alias": { "alias": "Array", "device": "String" } "set_state": { "name": "String", "defer": "Boolean" } 'network.interface' @cf8c0649 "up": { } "down": { } "status": { } "prepare": { } "add_device": { "name": "String" } "remove_device": { "name": "String" } "notify_proto": { } "remove": { } "set_data": { } 'network.interface.lan' @0ab6e1d1 "up": { } "down": { } "status": { } "prepare": { } "add_device": { "name": "String" } "remove_device": { "name": "String" } "notify_proto": { } "remove": { } "set_data": { } 'network.interface.loopback' @ffd9ad60 "up": { } "down": { } "status": { } "prepare": { } "add_device": { "name": "String" } "remove_device": { "name": "String" } "notify_proto": { } "remove": { } "set_data": { } 'network.interface.wan' @d4b0b3d2 "up": { } "down": { } "status": { } "prepare": { } "add_device": { "name": "String" } "remove_device": { "name": "String" } "notify_proto": { } "remove": { } "set_data": { } 'nvrgui' @7f6f6230 "get_login_status": { } "nvrgui_get_resolution": { } "nvrgui_notify_permission_change": { } "nvrgui_notify_chn_permission_change": { } "nvrgui_get_last_operateTime": { } "nvrgui_notify_loginout": { "username": "String" } "nvrgui_refresh_status": { "type": "Integer" } "nvrgui_set_debug_level": { "level": "Integer", "win_level": "Integer", "text_level": "Integer" } "nvrgui_set_hdextreme_factor": { "type": "Integer", "level": "Integer" } "nvrgui_get_nvrcore_res": { "client_id": "Integer", "error_code": "Integer" } "nvrgui_get_chn_sel_res": { "error_code": "Integer", "channel_map": "Array" } "nvrgui_set_chn_warning": { "error_code": "Integer", "channel_message": "Array", "layer": "Integer" } "nvrgui_check_new_version": { "check_type": "Integer" } "nvrgui_switch_preview": { "switch_type": "Integer" } "nvrgui_refresh_resolution": { "width": "Integer", "height": "Integer" } "nvrgui_update_nonoper_screen": { "screen": "Integer", "(unknown)" } "nvrgui_refresh_gui_display": { "screen": "Integer", "status": "Integer" } "nvrgui_shutdown_display": { "screen": "Integer", "status": "Integer" } "nvrgui_change_stream_type": { "screen": "Integer", "type": "Integer" } "nvrgui_logparam_init": { "screen": "Integer", "loginterval": "Integer", "loginenable": "Integer" } "nvrgui_logtime_update": { "updatetype": "Integer", "(unknown)", "(unknown)" } "nvrgui_vice_refresh_status": { "screen": "Integer", "status": "Integer" } "nvrgui_set_playback_status": { "screen": "Integer", "status": "Integer" } "nvrgui_update_gui_status": { "screen": "Integer", "status": "Integer" } "nvrgui_vice_update_language": { "language": "Integer" } "nvrgui_vice_update_logdata": { "log_mode": "Integer", "need_refresh": "Boolean", "is_login": "Boolean", "is_login_chn_atuh": "Boolean", "curr_usr": "String", "curr_passwd": "String" } "nvrgui_set_need_menu_timeout": { "need_menu_timeout": "Integer" } "nvrgui_set_blockestPage": { "blockTestPage": "Integer" } "nvrgui_get_login": { } "nvrgui_vice_refresh": { } "nvrgui_vice_exit_safely": { } "nvrgui_vice_shutdown": { } "nvrgui_vice_update_markerbox": { "channel": "Array", "num": "Integer" } "nvrgui_set_talk_error": { "talk_error": "Integer" } "notify_nvrgui_cloud_connect_status": { "connect_status": "Integer" } "nvrgui_notify_del_dev": { "ids": "String" } "nvrgui_notify_chn_video": { "channel": "Integer", "xpos": "Integer", "ypos": "Integer", "width": "Integer", "height": "Integer", "type": "Integer" } "update_menu_timeout": { "enable_gui_session_time": "String", "logout_time": "String" } "string_support_check": { "str_to_check": "String" } "nvrgui_update_warnwin": { } "nvrgui_notify_quit_initialize": { } "nvrgui_notify_upgrade": { } "nvrgui_update_preview_language": { } "nvrgui_update_preview_region": { } "nvrgui_update_markerbox": { "channel": "Array", "num": "Integer" } 'playback' @4ed3bd39 "playback_new_resource": { "client_id": "Integer", "x_coor": "Integer", "y_coor": "Integer", "width": "Integer", "height": "Integer", "dev": "Integer" } "playback_change_chns": { "client_id": "Integer", "action": "Integer", "channel_map": "Array" } "playback_change_chn_attr": { "client_id": "Integer", "action": "Integer", "channel": "Integer", "start_time": "Integer", "end_time": "Integer" } "playback_play_pause": { "client_id": "Integer", "win_id": "Integer", "play_pause": "Integer" } "playback_set_play_speed": { "client_id": "Integer", "play_speed": "Integer", "type": "Integer" } "playback_set_play_type": { "client_id": "Integer", "play_type": "Integer" } "playback_set_play_time": { "client_id": "Integer", "event_id": "Integer", "win_id": "Integer", "start_time": "Integer", "breverse": "Integer" } "playback_fullscreen": { "client_id": "Integer", "x_coor": "Integer", "y_coor": "Integer", "width": "Integer", "height": "Integer", "win_id": "Integer", "screen_mode": "Integer" } "playback_set_multi_play_sync": { "client_id": "Integer", "sync": "Integer" } "playback_set_play_zoom": { "client_id": "Integer", "win_id": "Integer", "x_coor": "Integer", "y_coor": "Integer", "width": "Integer", "height": "Integer" } "playback_set_play_step": { "client_id": "Integer" } "playback_stop": { "client_id": "Integer", "win_id": "Integer" } "playback_set_play_audio_chn": { "client_id": "Integer", "action": "Integer", "win_id": "Integer" } "playback_set_play_audio_volume": { "client_id": "Integer", "volume": "Integer" } "playback_set_play_audio_mute": { "client_id": "Integer", "is_mute": "Integer" } "playback_release_resource": { "client_id": "Integer" } "playback_search_media_res": { "client_id": "Integer", "event_type": "Integer", "search_id": "Integer", "start_time": "Integer", "end_time": "Integer", "file_type": "Integer", "channel_map": "Array", "layer": "Integer" } "playback_smart_search_media_res": { "client_id": "Integer", "smart_search_type": "Integer", "search_id": "Integer", "channel": "Integer", "start_time": "Integer", "end_time": "Integer", "x_coor": "Array", "y_coor": "Array", "direction": "Array", "humanoid": "Integer" } "playback_search_pic_res": { "client_id": "Integer", "event_type": "Integer", "search_id": "Integer", "start_time": "Integer", "end_time": "Integer", "channel_map": "Array" } "playback_search_tag_res": { "client_id": "Integer", "search_id": "Integer", "start_time": "Integer", "end_time": "Integer", "tag_name": "String", "channel_map": "Array" } "playback_search_tagmedia_res": { "client_id": "Integer", "search_id": "Integer", "start_time": "Integer", "end_time": "Integer", "channel": "Integer" } "playback_search_subevent_list_res": { "client_id": "Integer", "event_type_high32": "Integer", "event_type_low32": "Integer", "search_id": "Integer", "start_time": "Integer", "end_time": "Integer", "channel_map": "Array" } "playback_search_subevent_media_res": { "client_id": "Integer", "search_id": "Integer", "start_time": "Integer", "end_time": "Integer", "channel": "Integer" } "playback_search_facegal_res": { "client_id": "Integer", "search_id": "Integer", "face_type": "Integer", "channel_map": "Array" } "playback_search_faceid_res": { "client_id": "Integer", "search_id": "Integer", "start_time": "Integer", "end_time": "Integer", "channel_map": "Array", "id_array": "Array", "disk_id_array": "Array", "version_array": "Array", "num": "Integer", "flag": "Integer" } "playback_search_face_res": { "client_id": "Integer", "search_id": "Integer", "start_time": "Integer", "end_time": "Integer", "channel_map": "Array", "id_array": "Array", "disk_id_array": "Array", "version_array": "Array", "num": "Integer", "flag": "Integer" } "playback_search_same_face_res": { "client_id": "Integer", "search_id": "Integer", "id_array": "Array", "disk_id_array": "Array", "version_array": "Array", "num": "Integer", "src_faceid": "Integer", "src_diskid": "Integer", "src_version": "Integer" } "playback_delete_face": { "disk_id": "Integer", "face_id": "Integer", "version": "Integer" } "playback_search_peopleid_res": { "client_id": "Integer", "search_id": "Integer", "start_time": "Integer", "end_time": "Integer", "channel_map": "Array", "gender": "Integer", "sleeve_len": "Integer", "lower_body": "Integer", "lower_body_color": "Integer", "hair_len": "Integer", "upper_body_color": "Integer", "id_array": "Array", "disk_id_array": "Array", "version_array": "Array", "num": "Integer", "flag": "Integer" } "playback_search_people_res": { "client_id": "Integer", "search_id": "Integer", "start_time": "Integer", "end_time": "Integer", "channel_map": "Array", "gender": "Integer", "sleeve_len": "Integer", "lower_body": "Integer", "lower_body_color": "Integer", "hair_len": "Integer", "upper_body_color": "Integer", "id_array": "Array", "disk_id_array": "Array", "version_array": "Array", "num": "Integer", "flag": "Integer" } "playback_search_carid_res": { "client_id": "Integer", "search_id": "Integer", "start_time": "Integer", "end_time": "Integer", "channel_map": "Array", "car_type": "Integer", "car_color": "Integer", "id_array": "Array", "disk_id_array": "Array", "version_array": "Array", "num": "Integer", "flag": "Integer" } "playback_search_car_res": { "client_id": "Integer", "search_id": "Integer", "start_time": "Integer", "end_time": "Integer", "channel_map": "Array", "car_type": "Integer", "car_color": "Integer", "id_array": "Array", "disk_id_array": "Array", "version_array": "Array", "num": "Integer", "flag": "Integer" } "playback_search_bgimage_res": { "client_id": "Integer", "search_id": "Integer", "disk_id": "Integer", "version": "Integer", "zone_id": "Integer", "offset": "Integer", "snap_len": "Integer", "bg_len": "Integer", "channel": "Integer", "snap_time": "String" } "playback_search_faceevent_res": { "client_id": "Integer", "search_id": "Integer", "faceid": "Integer", "start_time": "Integer", "end_time": "Integer", "channel_map": "Array" } "playback_search_faceevent_media_res": { "client_id": "Integer", "search_id": "Integer", "start_time": "Integer", "end_time": "Integer", "channel": "Integer" } "playback_update_facegal": { "client_id": "Integer", "index_id": "Integer", "disk_id": "Integer", "faceid": "Integer", "type": "Integer", "facegal_new_name": "String" } "playback_search_frame_res": { "client_id": "Integer", "start_time": "Integer", "flag": "Integer", "channel_map": "Array" } "playback_add_tag": { "channel": "Integer", "tag_time": "Integer", "tag_name": "String" } "playback_add_tagdebug": { "channel": "Integer", "tag_time": "Integer", "tag_name": "String" } "playback_del_tag": { "client_id": "Integer", "index_id": "Integer", "channel": "Integer", "tag_time": "Integer", "tag_name": "String" } "playback_update_tag": { "client_id": "Integer", "index_id": "Integer", "channel": "Integer", "tag_time": "Integer", "tag_name": "String", "new_tag_name": "String" } "playback_get_month_bitmap": { "client_id": "Integer", "channel_map": "Array", "start_time": "Integer", "end_time": "Integer" } "playback_get_play_status": { "client_id": "Integer" } "playback_get_playing_evt_idx": { "client_id": "Integer" } "playback_set_cut_start": { "client_id": "Integer", "start_time": "Integer", "channel": "Array" } "playback_set_cut_end": { "client_id": "Integer", "end_time": "Integer", "channel": "Array" } "playback_cut_clip": { "client_id": "Integer", "start_time": "Integer", "end_time": "Integer", "channel": "Integer", "type": "Integer" } "playback_export_file": { "client_id": "Integer", "file_path": "String", "dev_path": "String" } "playback_stop_export": { "client_id": "Integer" } "playback_get_export_process": { "client_id": "Integer" } "playback_cut_slice_clean": { "client_id": "Integer" } "playback_backup_event": { "client_id": "Integer", "event_id": "Integer", "hd_id": "Integer", "channel": "Integer", "file_path": "String", "dev_path": "String", "mode": "Integer" } "playback_set_file_lockstatus": { "hd_id": "Integer", "event_id": "Integer", "status": "Integer" } "playback_export_video_merge": { "client_id": "Integer", "start_time": "Integer", "end_time": "Integer", "export_mode": "Integer", "udisk_type": "Integer", "channel": "Array" } "playback_set_dbg_level": { "level": "Integer" } "playback_set_shm_dbg_level": { "level": "Integer" } "nvrcore_set_dbg_level": { "nvrcore": "Integer", "rtsp": "Integer", "record": "Integer", "preview": "Integer", "playback": "Integer", "msg_push": "Integer", "msg_log": "Integer", "media_server": "Integer", "event_center": "Integer", "cloud_storage": "Integer", "storage": "Integer" } "playback_data_read_msg": { "msg_type": "Integer", "chn_id": "Integer", "evt_id": "Integer", "index_id": "Integer" } "playback_data_read_debug": { "client_id": "Integer", "chn_id": "Integer", "search_type": "Integer", "start_time": "Integer", "end_time": "Integer" } "playback_data_read_info": { } "playback_msg_queue_flush": { } "playback_debug": { "debug_type": "Integer" } "play_audio_file": { "path": "String", "mode": "Integer", "volume": "Integer" } "set_play_audio_file": { "path": "String", "mode": "Integer", "volume": "Integer" } "playback_attach_shareinfo": { "client_id": "Integer" } "playback_dettach_shareinfo": { "client_id": "Integer" } "playback_web_command": { "command": "String" } "get_video_info": { "chn_id": "Integer" } 'preview' @7c8e0e2d "get_hdmi_edid": { } "restart": { "layer": "Integer" } "debug": { "reg_idx": "Integer" } "set_image_quality": { "mode": "String" } "image_quality_debug": { "set": "Integer", "brightness": "Integer", "sharpness": "Integer", "contrast": "Integer", "hue": "Integer", "saturation": "Integer" } "set_real_mode": { "mode": "String" } "set_flag_preview": { "layer": "Integer", "flag_preview": "Integer" } "set_debug_level": { "level": "Integer" } "set_adp_debug_level": { "level": "Integer" } "stop": { "layer": "Integer" } "exit": { "layer": "Integer" } "stop_zoomin": { "layer": "Integer" } "start_zoomin": { "chn": "Integer", "layer": "Integer" } "zoomin": { "chn": "Integer", "x": "Integer", "y": "Integer", "w": "Integer", "h": "Integer", "layer": "Integer" } "vo_remap": { "chn": "Integer", "x": "Integer", "y": "Integer", "width": "Integer", "height": "Integer", "layer": "Integer" } "vo_ori_remap": { "chn": "Integer", "x": "Integer", "y": "Integer", "width": "Integer", "height": "Integer", "layer": "Integer" } "start_turn": { "chn_num": "Integer", "bind_status": "Array", "layer": "Integer" } "get_status": { "layer": "Integer" } "reset_resolution": { "width": "Integer", "height": "Integer", "layer": "Integer" } "vol_num_set": { "chn_num": "Integer", "vol_num": "Integer", "layer": "Integer" } "audio_mute_set": { "chn_num": "Integer", "enable": "Integer" } "stream_type_set": { "chn_num": "Integer", "type": "Integer", "layer": "Integer" } "stream_type_get": { "chn_num": "Integer", "layer": "Integer" } "strategy_set": { "chn_num": "Integer", "strategy": "Integer", "layer": "Integer" } "vol_switch_set": { "chn_num": "Integer", "switch": "Integer", "layer": "Integer" } "adec_switch_set": { "switch": "Integer" } "set_datacontrol": { "interval": "Integer", "layer": "Integer" } "resource_recovery": { "type": "Integer", "layer": "Integer" } "set_operate_screen": { "screen": "Integer" } "down_showframe": { "player": "Integer", "interval": "Integer" } "set_show_original_pic": { "layer": "Integer", "enable": "Integer" } "dump_video": { "player": "Integer", "status": "Integer" } "video_data_get": { "chn_num": "Integer", "layer": "Integer" } "start_talk_mode": { "chn": "Integer", "layer": "Integer" } "stop_talk_mode": { "chn": "Integer", "layer": "Integer" } "set_zerochn_enable": { "on_off": "String" } "set_zerochn_fps": { "zerochn_fps": "Integer" } "set_zerochn_bitrate": { "zerochn_bitrate": "Integer" } "set_zerochn_resolution": { "zerochn_resolution": "String" } "set_zerochn_reset_config": { } "start_talk": { } "stop_talk": { } "refresh_auth": { "chn": "Integer", "auth": "Integer" } "get_video_info": { "chn_id": "Integer", "layer": "Integer" } "set_marker_box_enable": { "enable": "Integer" } "reload_fisheye_capability": { "chn": "Integer", "support": "Integer" } "clear_user_stream": { "channel": "String" } 'record' @49d847cb "memory_pool": { } "rec_plan_reconfig": { } "rec_plan_adv_reconfig": { } "rec_ctrl_reconfig": { } "event_motion_reconfig": { } "event_occlusion_reconfig": { } "event_intrusion_reconfig": { } "event_linecross_reconfig": { } "event_human_reconfig": { } "event_vehicle_reconfig": { } "event_regionenter_reconfig": { } "event_regionexit_reconfig": { } "event_abandonandtaken_reconfig": { } "event_loitering_reconfig": { } "event_scenechange_reconfig": { } "event_audioexception_reconfig": { } "event_face_snapshot_reconfig": { } "event_face_snapshot_reconfig_by_channel": { "channel": "Integer" } "event_motion_reconfig_by_channel": { "channel": "Integer" } "event_occlusion_reconfig_by_channel": { "channel": "Integer" } "event_intrusion_reconfig_by_channel": { "channel": "Integer" } "event_linecross_reconfig_by_channel": { "channel": "Integer" } "event_human_reconfig_by_channel": { "channel": "Integer" } "event_vehicle_reconfig_by_channel": { "channel": "Integer" } "event_regionenter_reconfig_by_channel": { "channel": "Integer" } "event_regionexit_reconfig_by_channel": { "channel": "Integer" } "event_abandonandtaken_reconfig_by_channel": { "channel": "Integer" } "event_loitering_reconfig_by_channel": { "channel": "Integer" } "event_scenechange_reconfig_by_channel": { "channel": "Integer" } "event_audioexception_reconfig_by_channel": { "channel": "Integer" } "event_exception_reconfig": { } "lack_lvm_error_turn_off_buzzer": { } "hd_manage_reconfig": { } "rec_disk_writeback": { } "stg_get_init_status": { } "rec_disk_format": { "hd_id": "Integer" } "get_disk_info": { } "get_quota_info": { } "is_disk_need_format": { } "get_status": { } "get_chn_event": { } "get_exception": { } "get_curr_exception": { } "login_error": { } "stop_record": { } "stop_record_rtc": { } "restart_record": { } "reboot": { } "auto_reboot_reconfig": { } "dump_disk_mgmt_info": { } "debug": { "chn": "Integer" } "event_change": { "chn": "Integer", "type": "Integer", "status": "Integer", "sec_name": "String" } "ip_conflict": { "status": "Integer" } "set_device_on_off_line": { "target": "String", "on_off_line": "String" } "debug_search_smartd": { "chn": "Integer", "start_sec": "Integer", "end_sec": "Integer" } "set_dbg_level": { "dbg_level": "Integer" } "set_stg_dbg_level": { "dbg_level": "Integer" } "set_stg_ai_del_time": { "del_time": "Integer" } "set_stg_dbg_module_status": { "dbg_module": "Integer", "dbg_status": "Integer" } "stg_layout_debug": { "hd_id": "Integer", "chn": "Integer" } "stg_db_debug": { "hd_id": "Integer", "sql_cmd": "String" } "day_event_check": { "date": "String" } "disk_event": { "devname": "String", "event": "String" } "set_disk_status": { "disk_id": "Integer", "enable": "Integer" } "awake_disk": { "hd_id": "Integer", "status": "Integer" } "refresh_hd_password": { } "update_hd_password": { "disk_id": "Integer", "type": "Integer" } "get_hd_password": { "disk_id": "Integer", "type": "Integer" } "stg_migration_get_status": { } "stg_get_usb_disk_info": { } "stg_format_usb_disk": { "ud_id": "Integer" } "stg_migration_start": { "disk_id": "Integer", "ud_id": "Integer", "migration_start_flag": "Integer" } "stg_migration_control": { "ctl_type": "Integer" } "stg_add_ud4rec": { "ud_id": "Integer", "add_ud4rec_flag": "Integer" } "stg_rm_ud4rec": { "ud_id": "Integer" } "stg_get_raid_info": { } "stg_format_raid": { "raid_id": "Integer", "create_raid": "Integer" } "stg_stop_raid": { "raid_id": "Integer" } "stg_create_raid": { "raid_level": "String", "raid_disk_map": "String", "spare_disk_map": "String", "backstage": "String" } "stg_add_raid_disk": { "raid_id": "Integer", "disk_map": "String" } "stg_remove_raid_disk": { "raid_id": "Integer", "disk_map": "String" } "stg_set_raid_single_disk_size": { "raid_single_disk_size": "Integer" } "stg_stop_invalid_raid": { } "stg_stop_all_raid": { } "event_center_reconfig": { "type": "Integer" } "set_event_change": { "type": "Integer", "append": "Integer", "status": "Integer" } "event_center_set_dbg_level": { "dbg_level": "Integer" } "show_cfg": { "type": "Integer" } "event_center_buzzer_onoff_control": { "on_off": "Integer" } "event_center_msgpush_onoff_control": { "on_off": "Integer" } "alarm_output_reconfig": { } "verify_alarm_input_output": { } "init_alarm_input_output": { } "gb28181_record_stop": { "chn": "Integer" } "gb28181_record_start": { "chn": "Integer" } "rec_set_malloc_for_gop_num": { "param": "Integer" } "external_record_union": { "chn_list": "Array", "operation": "String", "event_type": "String" } "set_reading_data_status": { "reading_data_status": "Integer" } "onvif_rec_ctrl_reconfig": { } "get_raid_exception": { } "reload_fisheye_capability": { "chn": "Integer", "support": "Integer" } 'resource' @86ba13c2 "resource_set_dbg_level": { "level": "Integer" } "resource_remain_info": { } 'rtspm' @a973f494 "channel_start": { "channel": "Integer", "username": "String", "password": "String", "main_url": "String", "sub_url": "String", "rtsp_protocol": "String" } "channel_stop": { "channel": "Integer" } "channel_delete": { "channel": "Integer" } "channel_list_delete": { "channel": "String" } "set_debug_level": { "level": "Integer" } "debug": { "channel": "Integer" } "channel_bitrate": { "channel": "Integer" } "channel_framerate": { "channel": "Integer" } "channel_audio_support": { "channel": "Integer" } "bq_debug": { "channel": "Integer" } "rtsp_transport_type_reload": { "channel": "Integer" } "rtsp_transport_type_list_reload": { "channel": "Array" } "bq_dump_switch": { "switch": "Integer" } "notify_streaming_version": { "channel": "Integer", "version": "Integer" } "pal_debug": { } "notify_systime_changed": { } 'tddpServer' @51a45597 "start": { } "cleanTMP": { } "getRadio": { "offset": "Integer", "length": "Integer" } "getInfo": { "infoMask": "Integer", "sep": "String" } "checkDevID": { "status": "Integer" } "setInfo": { "type": "Integer", "data": "String" } "set_dbg_level": { "level": "Integer" } 'vga_to_hdmi' @8895c85d "vth_get_hdmi2_edid": { } 'web_media' @4acbfe0d "get_cal": { "search_year": "Array" } "get_events_extends": { "id": "Integer", "search_video": "String", "dst_type": "Integer" } "get_cal_vms": { "year": "Array", "channel": "Array" } "get_events_extends_vms": { "start_index": "Integer", "end_index": "Integer", "search_time": "String", "channel": "Integer", "dst_type": "Integer" } "get_aes_key": { } "get_cal_util": { "start_date": "String", "end_date": "String", "channel": "Array" } "get_events_util_extends": { "date": "String", "id": "Integer", "channel": "Integer", "start_index": "Integer", "end_index": "Integer", "dst_type": "Integer" } "get_events_app_extends": { "date": "String", "id": "Integer", "channel": "Integer", "start_index": "Integer", "end_index": "Integer", "timestamp": "String" } "set_dbg": { "level": "Integer" } "debug_channel": { "channel": "Integer" } "msg_report": { "media_type": "Integer", "channels": "Array", "file_id": "Integer", "start_time": "Integer" } "get_user_id": { } "bandwidth": { } "dump_bandwidth": { } "preview_ch_status": { } "get_scale_capability": { } "get_media_list": { "channel": "Array", "user_id": "Integer", "start_time": "String", "end_time": "String", "event_type": "Array", "media_type": "Array", "start_index": "Integer", "max_num": "Integer" } "app_get_media_list": { "channel": "Array", "user_id": "Integer", "start_time": "String", "end_time": "String", "event_type": "Array", "media_type": "Array", "start_index": "Integer", "max_num": "Integer" } "show_image_count": { } "listen_gb28181_broadcast": { "enable": "Integer", "audio_type": "Integer" } "gb28181_preview_init": { "trans_type": "String", "ip": "String", "port": "Integer", "channel": "Integer", "stream_type": "Integer", "ssrc": "Integer", "rtpmap": "Integer" } "gb28181_preview_deinit": { "id": "Integer" } "gb28181_preview_start": { "id": "Integer" } "gb28181_preview_stop": { "id": "Integer" } "gb28181_playback_init": { "trans_type": "String", "ip": "String", "port": "Integer", "channel": "Integer", "start_time": "Integer", "end_time": "Integer", "ssrc": "Integer", "rtpmap": "Integer" } "gb28181_playback_deinit": { "id": "Integer" } "gb28181_playback_start": { "id": "Integer" } "gb28181_playback_pause": { "id": "Integer", "pause": "Integer" } "gb28181_playback_set_rate": { "id": "Integer", "deno": "Integer", "nume": "Integer" } "gb28181_playback_set_time": { "id": "Integer", "offset": "Integer" } "gb28181_playback_stop": { "id": "Integer" } "gb28181_download_init": { "trans_type": "String", "ip": "String", "port": "Integer", "channel": "Integer", "start_time": "Integer", "end_time": "Integer", "speed": "Integer", "ssrc": "Integer", "rtpmap": "Integer" } "gb28181_download_deinit": { "id": "Integer" } "gb28181_download_start": { "id": "Integer" } "gb28181_download_stop": { "id": "Integer" } "vms_preview_start": { "session_id": "String", "ip": "String", "port": "Integer", "channel": "Integer", "stream_type": "String" } "vms_preview_stop": { "session_id": "String" } "vms_playback_start": { "session_id": "String", "ip": "String", "port": "Integer", "channel": "Integer", "start_time": "String", "end_time": "String", "video_type": "Integer", "deno": "Integer", "nume": "Integer" } "vms_playback_pause": { "session_id": "String", "suspend": "Integer" } "vms_playback_set_rate": { "session_id": "String", "deno": "Integer", "nume": "Integer" } "vms_playback_set_time": { "session_id": "String", "seconds": "String" } "vms_playback_set_flow_rate": { "session_id": "String", "deno": "Integer", "nume": "Integer" } "vms_playback_stop": { "session_id": "String" } "media_server_user_update": { } "media_encrypt_update": { } "notify_bitrate_changed": { } 'wtd' @8ee02ee9 "vigi_debug_enable": { } "vigi_debug_disable": { } "debug": { } "extend": { } "hw_enable": { } "hw_disable": { } 这些ubus命令如何使用
09-05
VOID af_util_adjust_roi( VOID* af_internal) { af_internal_control_t* af = (af_internal_control_t*) af_internal; af_roi_info_t* roi_info = &af->af_roi; chromatixFaceDetectionTuningType* face_tuning = &(af->tuning_info.pAlgoTuningData->faceDetection); BOOL en_fd_roi_tune = (BOOL) face_tuning->faceDetectionROITuning.FDROITune; FLOAT fd_roi_ratio = (FLOAT) face_tuning->faceDetectionROITuning.FDROIRatio; UINT16 camif_height = af->sensor_input.sensor_res_height; UINT16 camif_width = af->sensor_input.sensor_res_width; UINT16 ctr_x = 0, ctr_y = 0; af_roi_t* roi = NULL; af_roi_t final_roi_primary; FLOAT zoom_factor = 1.0; #ifdef VENDOR_EDIT //pangfeilong@Camera , 2018/09/18 , add for 2PD select defferent roi minimal size UINT16 dual_pd_minimal_pixel_size = 0; //Tyrael@Camera , 2018/09/18 , add for define SPARSE PD roi limit minimal size UINT16 sparse_pd_minimal_pixel_size = 0; #endif roi = &roi_info->roi[0]; // We only handle single ROI in case of AF AF_MSG_HIGH(" Input ROI: type: %d, coord: [%d %d %d %d] weight: %d, camif size: [%d %d]", roi_info->type, roi->x, roi->y, roi->dx, roi->dy, roi_info->weight[0], camif_width, camif_height); if (af_util_check_skip_stats_configure(af)) { AF_MSG_LOW("No need to configure stats, return"); return; } /* Select the stats configuration set */ af_util_select_stats_configure(af); /* config hv_ratio_type when adjust roi*/ af_util_config_hv_ratio_type(af); // The ROI get adjusted only if the weight is 0, otherwise the ROI will be used as is // refer to Android developer document regarding CONTROL_AF_REGIONS if (roi_info->weight[0] == 0) { INT af_roi_face_extension_flag = face_tuning->faceROIExtension.ROIFaceExtensionEnable; FLOAT roi_face_scale_x = face_tuning->faceROIExtension.ROIFaceScaleX; FLOAT roi_face_scale_y = face_tuning->faceROIExtension.ROIFaceScaleY; FLOAT roi_face_symmetric_x = face_tuning->faceROIExtension.ROIFaceSymmetricX; FLOAT roi_face_symmetric_y = face_tuning->faceROIExtension.ROIFaceSymmetricY; UINT face_extend_x = 0, face_extend_y = 0; UINT face_extend_dx = 0, face_extend_dy = 0; Q3A_MEMSET(&final_roi_primary, 0, sizeof(af_roi_t)); //Store previous Zoom Factor af->zoom_ratio_prev = af->zoom_ratio; // get zoom ratio zoom_factor = (af->zoom_ratio <= 0) ? 1.0f : (1.0f / af->zoom_ratio); AF_MSG_HIGH(" Input Zoom factor: %f", zoom_factor); // update roi scaling factor af_util_update_def_roi_ratios(af); // calculate center ROI coordinatet if ((((roi->x + roi->dx) > camif_width) || ((roi->y + roi->dy) >camif_height)) || (!(roi->dx) && !(roi->dy))) { AF_MSG_LOW(" ROI limit check failed. Using Center ROI!"); ctr_x = camif_width / 2; ctr_y = camif_height / 2; } else { ctr_x = roi->x + (roi->dx / 2); ctr_y = roi->y + (roi->dy / 2); } // Remove below function and replace /* if (af->caf.taf_focused == TRUE) { AF_MSG_LOW(" Return from TAF, use center ROI!"); ctr_x = camif_width / 2; ctr_y = camif_height / 2; }*/ // adjust ROI size by type if (roi_info->type == AF_ROI_TYPE_FACE) { Q3A_MEMCPY(&final_roi_primary, roi, sizeof(af_roi_t)); AF_MSG_LOW(" FACE ROI"); af->af_stats_config.roi_type = AF_ROI_TYPE_FACE; AF_MSG_LOW("en_fd_roi_tune %d fd_roi_ratio %f af_roi_face_extension_flag %d gravity ready %d", en_fd_roi_tune, fd_roi_ratio, af_roi_face_extension_flag, af->gravity_input.is_ready); #ifdef VENDOR_EDIT //pangfeilong@Camera , 2018/05/08 , add for shrink face roi if (fd_roi_ratio < 1.0f && final_roi_primary.dy > 80) { /* Scale Roi Size */ final_roi_primary.dx = (uint16)((float)roi->dx * fd_roi_ratio); final_roi_primary.dy = (uint16)((float)roi->dy * fd_roi_ratio); /* calculate start index */ final_roi_primary.x = (ctr_x > (final_roi_primary.dx >> 1)) ? (ctr_x - (final_roi_primary.dx >> 1)) : 0; final_roi_primary.y = (ctr_y > (final_roi_primary.dy >> 1)) ? (ctr_y - (final_roi_primary.dy >> 1)) : 0; /* Sanity Boundary Checking */ if ((final_roi_primary.x + final_roi_primary.dx) > camif_width) final_roi_primary.dx = camif_width - final_roi_primary.x; if ((final_roi_primary.y + final_roi_primary.dy) > camif_height) final_roi_primary.dy = camif_height - final_roi_primary.y; AF_MSG_LOW("new x,y,dx,dy = %d,%d,%d,%d input x,y,dx,dy = %d,%d,%d,%d", final_roi_primary.x, final_roi_primary.y, final_roi_primary.dx, final_roi_primary.dy, roi->x, roi->y, roi->dx, roi->dy); } #endif if (en_fd_roi_tune) { if (af_roi_face_extension_flag == TRUE && af->gravity_input.is_ready) { FLOAT x = 0.0f, y = 0.0f; x = af->gravity_input.g_vector[0]; y = af->gravity_input.g_vector[1]; AF_MSG_LOW("change face roi, org:x:%d y :%d, dy:%d, dy: %d, roi_face_scale_x: %f," " roi_face_scale_y %f af_roi_face_offset_x:%f,af_roi_face_offset_y:%f" " gravity x:%f y:%f", final_roi_primary.x, final_roi_primary.y, final_roi_primary.dx, final_roi_primary.dy, roi_face_scale_x, roi_face_scale_y, roi_face_symmetric_x, roi_face_symmetric_y, x, y); if (x > GRAVITY_THRESHOLD_X && GRAVITY_THRESHOLD_Y >= ABS(y)) { face_extend_dx = final_roi_primary.dx + (INT)(roi_face_scale_x * final_roi_primary.dx); face_extend_x = final_roi_primary.x - (INT)(roi_face_symmetric_x * roi_face_scale_x * final_roi_primary.dx); face_extend_dy = final_roi_primary.dy + (INT)(roi_face_scale_y * final_roi_primary.dy); face_extend_y = final_roi_primary.y - (INT)(roi_face_symmetric_y * roi_face_scale_y * final_roi_primary.dy); } else if (x < -GRAVITY_THRESHOLD_X && GRAVITY_THRESHOLD_Y >= ABS(y)) { face_extend_dx = final_roi_primary.dx + (INT)(roi_face_scale_x * final_roi_primary.dx); face_extend_x = final_roi_primary.x - (INT)((1.0f - roi_face_symmetric_x) * roi_face_scale_x * final_roi_primary.dx); face_extend_dy = final_roi_primary.dy + (INT)(roi_face_scale_y * final_roi_primary.dy); face_extend_y = final_roi_primary.y - (INT)((1.0f - roi_face_symmetric_y) * roi_face_scale_y * final_roi_primary.dy); } else if (y > GRAVITY_THRESHOLD_X && GRAVITY_THRESHOLD_Y >= ABS(x)) { face_extend_dx = final_roi_primary.dx + (INT)(roi_face_scale_y * final_roi_primary.dx); face_extend_x = final_roi_primary.x - (INT)(roi_face_symmetric_y * roi_face_scale_y * final_roi_primary.dx); face_extend_dy = final_roi_primary.dy + (INT)(roi_face_scale_x * final_roi_primary.dy); face_extend_y = final_roi_primary.y - (INT)(roi_face_symmetric_x * roi_face_scale_x * final_roi_primary.dy); } else if (y < -GRAVITY_THRESHOLD_X && GRAVITY_THRESHOLD_Y >= ABS(x)) { face_extend_dx = final_roi_primary.dx + (INT)(roi_face_scale_y * final_roi_primary.dx); face_extend_x = final_roi_primary.x - (INT)((1.0f - roi_face_symmetric_y) * roi_face_scale_y * final_roi_primary.dx); face_extend_dy = final_roi_primary.dy + (INT)(roi_face_scale_x * final_roi_primary.dy); face_extend_y = final_roi_primary.y - (INT)((1.0f - roi_face_symmetric_x) * roi_face_scale_x * final_roi_primary.dy); } else { face_extend_dx = final_roi_primary.dx; face_extend_x = final_roi_primary.x; face_extend_dy = final_roi_primary.dy; face_extend_y = final_roi_primary.y; } if (face_extend_x > 0 && (face_extend_x + face_extend_dx) <= camif_width) { final_roi_primary.x = (UINT16) face_extend_x; final_roi_primary.dx = (UINT16) face_extend_dx; } if (face_extend_y > 0 && (face_extend_y + face_extend_dy) <= camif_height) { final_roi_primary.y = (UINT16) face_extend_y; final_roi_primary.dy = (UINT16) face_extend_dy; } AF_MSG_LOW("change face roi, adj:x:%d, y :%d,dx:%d, dy: %d ", final_roi_primary.x, final_roi_primary.y, final_roi_primary.dx, final_roi_primary.dy); } else { /* Check whether fd_roi_tuning is enabled, * if yes then resize fd_roi from fd_roi_ratio. */ final_roi_primary.dx = static_cast<UINT16>((FLOAT) roi->dx * fd_roi_ratio); final_roi_primary.dy = static_cast<UINT16>((FLOAT) roi->dy * fd_roi_ratio); AF_MSG_LOW("new dx,dy = %d,%d, input dx,dy = %d,%d", final_roi_primary.dx, final_roi_primary.dy, roi->dx, roi->dy); final_roi_primary.x = static_cast<UINT16>( (ctr_x < (final_roi_primary.dx / 2)) ? 0 : (ctr_x - (final_roi_primary.dx / 2))); final_roi_primary.y = static_cast<UINT16>( (ctr_y < (final_roi_primary.dy / 2)) ? 0 : (ctr_y - (final_roi_primary.dy / 2))); AF_MSG_LOW("new x,y = %d,%d, input x,y = %d,%d", final_roi_primary.x, final_roi_primary.y, roi->x, roi->y); } } else { /* If no need to resize FD roi, * then just copy input fd roi ti final AF roi */ Q3A_MEMCPY(&final_roi_primary, roi, sizeof(af_roi_t)); } } else if (af_util_check_if_input_is_default_roi(af, ctr_x, ctr_y)) { AF_MSG_LOW(" Default ROI"); af->af_stats_config.roi_type = AF_ROI_TYPE_GENERAL; // If multi-window is enabled, read window configuraiton from chromatix // TODO - break down this long function INTo separate functions if (af_util_check_if_in_multi_window_mode(af)) { AF_MSG_LOW("PD MW is enabled!"); af_util_get_roi_mw(af, &final_roi_primary); } else { af_util_get_roi_default(af, &final_roi_primary); } } else { chromatixTouchROISettingsType* pTouchSetting = &af->tuning_info.pBAFTuningData->sets.elements.touchROI; chromatixBAFROIParamsType *pROIConfig = &af->tuning_info.pBAFTuningData->sets.elements.ROIConfig[af->bayer_stats_config.set_id]; FLOAT touchScalingFactor = af->in_low_light ? pTouchSetting->touchScalingFactorLowLight : pTouchSetting->touchScalingFactorNormalLight; af->af_stats_config.roi_type = AF_ROI_TYPE_TOUCH; final_roi_primary.dx = static_cast<UINT16>(zoom_factor * touchScalingFactor * pROIConfig->widthRatio * camif_width); #ifndef VENDOR_EDIT //pangfeilong@Camera , 2018/09/18 , modify touch roi size final_roi_primary.dy = static_cast<UINT16>(zoom_factor * touchScalingFactor * pROIConfig->heightRatio * camif_height); #else final_roi_primary.dy = static_cast<UINT16>(zoom_factor * touchScalingFactor * pROIConfig->widthRatio * camif_width); #endif // Since we use the width to calculate the height, add protection. if (final_roi_primary.dy > camif_height) { final_roi_primary.dy = camif_height; } final_roi_primary.x = static_cast<UINT16>( (ctr_x < (final_roi_primary.dx / 2)) ? 0 : (ctr_x - (final_roi_primary.dx / 2))); final_roi_primary.y = static_cast<UINT16>( (ctr_y < (final_roi_primary.dy / 2)) ? 0 : (ctr_y - (final_roi_primary.dy / 2))); AF_MSG_HIGH("TOUCH Calculated new ROI: (%d, %d, %d %d)", final_roi_primary.x, final_roi_primary.y, final_roi_primary.dx, final_roi_primary.dy); } /* Minimum ROI check: For 2PD: Minimum ROI is 200 x 200 pixels For Sparse: Minimum ROI is 400 x 400 pixels */ #ifdef VENDOR_EDIT //pangfeilong@Camera , 2018/05/14 , add for fix face extension bug ctr_x = final_roi_primary.x + (final_roi_primary.dx >> 1); ctr_y = final_roi_primary.y + (final_roi_primary.dy >> 1); #endif #ifndef VENDOR_EDIT //pangfeilong@Camera , 2018/09/18 , add for 2PD select defferent roi minimal size //Tyrael@Camera , 2019/02/19 , add for define SPARSE PD roi limit minimal size if (af->haf->ctrl.is_2PD_enable && (final_roi_primary.dx < DPD_MINIMAL_PIXEL_SIZE || final_roi_primary.dy < DPD_MINIMAL_PIXEL_SIZE)) { // Clip 2PD minimum ROI final_roi_primary.dx = (final_roi_primary.dx < DPD_MINIMAL_PIXEL_SIZE) ? DPD_MINIMAL_PIXEL_SIZE : final_roi_primary.dx; final_roi_primary.dy = (final_roi_primary.dy < DPD_MINIMAL_PIXEL_SIZE) ? DPD_MINIMAL_PIXEL_SIZE : final_roi_primary.dy; final_roi_primary.x = (uint16)((ctr_x < (final_roi_primary.dx / 2)) ? 0 : (ctr_x - (final_roi_primary.dx / 2))); final_roi_primary.y = (uint16)((ctr_y < (final_roi_primary.dy / 2)) ? 0 : (ctr_y - (final_roi_primary.dy / 2))); AF_MSG_HIGH("2PD minimal ROI clip: Calculated new ROI: (%d, %d, %d %d)", final_roi_primary.x, final_roi_primary.y, final_roi_primary.dx, final_roi_primary.dy); } else if (!af->haf->ctrl.is_2PD_enable && (final_roi_primary.dx < SPARSE_PD_MINIMAL_PIXEL_SIZE || final_roi_primary.dy < SPARSE_PD_MINIMAL_PIXEL_SIZE)) { // Clip Sparse PD minimum ROI final_roi_primary.dx = (final_roi_primary.dx < SPARSE_PD_MINIMAL_PIXEL_SIZE) ? SPARSE_PD_MINIMAL_PIXEL_SIZE : final_roi_primary.dx; final_roi_primary.dy = (final_roi_primary.dy < SPARSE_PD_MINIMAL_PIXEL_SIZE) ? SPARSE_PD_MINIMAL_PIXEL_SIZE : final_roi_primary.dy; final_roi_primary.x = (uint16)((ctr_x < (final_roi_primary.dx / 2)) ? 0 : (ctr_x - (final_roi_primary.dx / 2))); final_roi_primary.y = (uint16)((ctr_y < (final_roi_primary.dy / 2)) ? 0 : (ctr_y - (final_roi_primary.dy / 2))); AF_MSG_HIGH("MainCamera = %d SparsePD minimal ROI clip: Calculated new ROI: (%d, %d, %d %d)",af->role_switch.master, final_roi_primary.x, final_roi_primary.y, final_roi_primary.dx, final_roi_primary.dy); } #else if(af->af_stats_config.roi_type == AF_ROI_TYPE_TOUCH){ dual_pd_minimal_pixel_size = DPD_MINIMAL_PIXEL_SIZE_TOUCH; sparse_pd_minimal_pixel_size = SPARSE_PD_MINIMAL_PIXEL_TOUCH; }else if(af->af_stats_config.roi_type == AF_ROI_TYPE_FACE){ dual_pd_minimal_pixel_size = DPD_MINIMAL_PIXEL_SIZE_FACE; sparse_pd_minimal_pixel_size = SPARSE_PD_MINIMAL_PIXEL_FACE; }else{ dual_pd_minimal_pixel_size = DPD_MINIMAL_PIXEL_SIZE; sparse_pd_minimal_pixel_size = SPARSE_PD_MINIMAL_PIXEL_SIZE; } if (af->haf->ctrl.is_2PD_enable && (final_roi_primary.dx < dual_pd_minimal_pixel_size || final_roi_primary.dy < dual_pd_minimal_pixel_size)) { // Clip 2PD minimum ROI final_roi_primary.dx = (final_roi_primary.dx < dual_pd_minimal_pixel_size) ? dual_pd_minimal_pixel_size : final_roi_primary.dx; final_roi_primary.dy = (final_roi_primary.dy < dual_pd_minimal_pixel_size) ? dual_pd_minimal_pixel_size : final_roi_primary.dy; final_roi_primary.x = (uint16)((ctr_x < (final_roi_primary.dx / 2)) ? 0 : (ctr_x - (final_roi_primary.dx / 2))); final_roi_primary.y = (uint16)((ctr_y < (final_roi_primary.dy / 2)) ? 0 : (ctr_y - (final_roi_primary.dy / 2))); AF_MSG_HIGH("2PD minimal ROI clip: Calculated new ROI: (%d, %d, %d %d)", final_roi_primary.x, final_roi_primary.y, final_roi_primary.dx, final_roi_primary.dy); } else if (!af->haf->ctrl.is_2PD_enable && (final_roi_primary.dx < sparse_pd_minimal_pixel_size || final_roi_primary.dy < sparse_pd_minimal_pixel_size)) { // Clip Sparse PD minimum ROI final_roi_primary.dx = (final_roi_primary.dx < sparse_pd_minimal_pixel_size) ? sparse_pd_minimal_pixel_size : final_roi_primary.dx; final_roi_primary.dy = (final_roi_primary.dy < sparse_pd_minimal_pixel_size) ? sparse_pd_minimal_pixel_size : final_roi_primary.dy; final_roi_primary.x = (uint16)((ctr_x < (final_roi_primary.dx / 2)) ? 0 : (ctr_x - (final_roi_primary.dx / 2))); final_roi_primary.y = (uint16)((ctr_y < (final_roi_primary.dy / 2)) ? 0 : (ctr_y - (final_roi_primary.dy / 2))); AF_MSG_HIGH("SparsePD minimal ROI clip: Calculated new ROI: (%d, %d, %d %d)", final_roi_primary.x, final_roi_primary.y, final_roi_primary.dx, final_roi_primary.dy); } #endif } else // weight none zero. Copy ROI without change to final ROI { if (roi_info->roi_updated == FALSE) { AF_MSG_LOW("ROI need not be updated!"); return; } Q3A_MEMCPY(&final_roi_primary, roi, sizeof(af_roi_t)); } // Make them even final_roi_primary.x &= ~0x1; final_roi_primary.y &= ~0x1; final_roi_primary.dx &= ~0x1; final_roi_primary.dy &= ~0x1; AF_MSG_HIGH(" Calculated new ROI: (%d, %d, %d %d)", final_roi_primary.x, final_roi_primary.y, final_roi_primary.dx, final_roi_primary.dy); Q3A_MEMCPY(&af->af_stats_config.region, &final_roi_primary, sizeof(af_roi_t)); if (roi_info->weight[0] == 0 && roi_info->num_roi == 0) { /* Single ROI so set num_roi to 1 */ roi_info->num_roi = 1; } af_util_stats_config_info(af); af_util_sw_stats_config_select_hpf(af); roi_info->roi_updated = FALSE; /*copy current roi info to prev roi*/ Q3A_MEMCPY_S(&af->af_roi_prev, sizeof (af_roi_info_t), &af->af_roi, sizeof (af_roi_info_t)); af_debug_data_config_update(af); } // af_util_adjust_roi 分析上面代码
09-10
import os import tkinter as tk from tkinter import filedialog, ttk, messagebox, simpledialog import fitz # PyMuPDF import pandas as pd from PIL import Image, ImageTk import io class PDFExtractorApp: def __init__(self, root): self.root = root self.root.title("PDF文本提取器") self.root.geometry("1200x800") self.pdf_document = None self.current_page = 0 self.total_pages = 0 self.thumbnails = [] self.selection_start = None self.selection_end = None self.extracted_data = [] self.table_data = None # 用于存储表格数据 self.all_pages_table_data = None # 用于存储所有页面的表格数据 # 滚动和拖拽相关变量 self.is_dragging = False self.drag_start_x = 0 self.drag_start_y = 0 # 缩放和显示相关变量 self.zoom_factor = 1.0 self.zoom_step = 0.1 # 减小缩放步长,使缩放更平滑 self.min_zoom = 0.2 # 最小缩放比例 self.max_zoom = 5.0 # 最大缩放比例 self.auto_fit_mode = "page" # "page", "width", "none" # Ctrl键状态跟踪 self.ctrl_pressed = False # 选区相关变量 self.is_selecting = False self.selection_rect = None self.page_bbox = None # 页面边界框 # 选区坐标显示变量 self.coord_display = None self.coord_text_id = None # 选区辅助线条 self.helper_lines = [] # 表格识别参数 self.column_tolerance = 10 # 列容差,用于确定文本是否在同一列 self.row_tolerance = 10 # 行容差,用于确定文本是否在同一行 self.setup_ui() def setup_ui(self): # 创建主框架 main_frame = ttk.Frame(self.root) main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) # 左侧缩略图区域 left_frame = ttk.LabelFrame(main_frame, text="页面预览") left_frame.pack(side=tk.LEFT, fill=tk.Y, padx=5, pady=5) # 页码跳转区域 nav_frame = ttk.Frame(left_frame) nav_frame.pack(fill=tk.X, padx=5, pady=5) ttk.Label(nav_frame, text="跳转至:").pack(side=tk.LEFT, padx=2) self.page_entry = ttk.Entry(nav_frame, width=6) self.page_entry.pack(side=tk.LEFT, padx=2) ttk.Button(nav_frame, text="跳转", command=self.jump_to_page).pack(side=tk.LEFT, padx=2) # 缩略图滚动区域 scrollbar = ttk.Scrollbar(left_frame) scrollbar.pack(side=tk.RIGHT, fill=tk.Y) self.thumbnail_canvas = tk.Canvas(left_frame, width=150, yscrollcommand=scrollbar.set) self.thumbnail_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) scrollbar.config(command=self.thumbnail_canvas.yview) # 创建缩略图框架,用于容纳所有缩略图 self.thumbnails_frame = ttk.Frame(self.thumbnail_canvas) self.thumbnail_window = self.thumbnail_canvas.create_window((0, 0), window=self.thumbnails_frame, anchor=tk.NW) # 中间PDF预览区域 center_frame = ttk.LabelFrame(main_frame, text="PDF预览") center_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=5, pady=5) # 创建一个框架用于放置滚动条 canvas_frame = ttk.Frame(center_frame) canvas_frame.pack(fill=tk.BOTH, expand=True) # 创建水平和垂直滚动条 self.xscrollbar = ttk.Scrollbar(canvas_frame, orient=tk.HORIZONTAL) self.xscrollbar.pack(side=tk.BOTTOM, fill=tk.X) self.yscrollbar = ttk.Scrollbar(canvas_frame, orient=tk.VERTICAL) self.yscrollbar.pack(side=tk.RIGHT, fill=tk.Y) # 创建PDF画布 self.pdf_canvas = tk.Canvas(canvas_frame, bg="white", xscrollcommand=self.xscrollbar.set, yscrollcommand=self.yscrollbar.set) self.pdf_canvas.pack(fill=tk.BOTH, expand=True) # 配置滚动条 self.xscrollbar.config(command=self.pdf_canvas.xview) self.yscrollbar.config(command=self.pdf_canvas.yview) # 绑定鼠标事件用于选区 self.pdf_canvas.bind("<ButtonPress-1>", self.on_mouse_down) self.pdf_canvas.bind("<B1-Motion>", self.on_mouse_drag) self.pdf_canvas.bind("<ButtonRelease-1>", self.on_mouse_up) # 绑定鼠标滚轮和右键拖拽事件 self.pdf_canvas.bind("<MouseWheel>", self.on_mouse_wheel) self.pdf_canvas.bind("<ButtonPress-3>", self.on_right_mouse_down) self.pdf_canvas.bind("<B3-Motion>", self.on_right_mouse_drag) self.pdf_canvas.bind("<ButtonRelease-3>", self.on_right_mouse_up) # Ctrl键状态监听 self.root.bind("<Control-KeyPress>", self.on_ctrl_press) self.root.bind("<Control-KeyRelease>", self.on_ctrl_release) # 右侧控制区域 right_frame = ttk.LabelFrame(main_frame, text="控制区") right_frame.pack(side=tk.RIGHT, fill=tk.Y, padx=5, pady=5) # 文件选择 ttk.Button(right_frame, text="打开PDF", command=self.open_pdf).pack(fill=tk.X, padx=5, pady=5) # 页面导航 nav_frame = ttk.Frame(right_frame) nav_frame.pack(fill=tk.X, padx=5, pady=5) ttk.Button(nav_frame, text="上一页", command=self.prev_page).pack(side=tk.LEFT, padx=2) self.page_label = ttk.Label(nav_frame, text="0/0") self.page_label.pack(side=tk.LEFT, padx=5) ttk.Button(nav_frame, text="下一页", command=self.next_page).pack(side=tk.LEFT, padx=2) # 缩放控制 zoom_frame = ttk.Frame(right_frame) zoom_frame.pack(fill=tk.X, padx=5, pady=5) ttk.Button(zoom_frame, text="放大", command=self.zoom_in).pack(side=tk.LEFT, padx=2) ttk.Button(zoom_frame, text="缩小", command=self.zoom_out).pack(side=tk.LEFT, padx=2) ttk.Button(zoom_frame, text="重置视图", command=self.reset_view).pack(side=tk.LEFT, padx=2) # 自适应模式选择 fit_frame = ttk.Frame(right_frame) fit_frame.pack(fill=tk.X, padx=5, pady=5) ttk.Label(fit_frame, text="自适应:").pack(side=tk.LEFT, padx=2) self.fit_mode = tk.StringVar(value="page") ttk.Radiobutton(fit_frame, text="整页", variable=self.fit_mode, value="page", command=self.update_fit_mode).pack(side=tk.LEFT, padx=2) ttk.Radiobutton(fit_frame, text="宽度", variable=self.fit_mode, value="width", command=self.update_fit_mode).pack(side=tk.LEFT, padx=2) ttk.Radiobutton(fit_frame, text="实际大小", variable=self.fit_mode, value="none", command=self.update_fit_mode).pack(side=tk.LEFT, padx=2) # 提取选项 ttk.Label(right_frame, text="提取选项").pack(fill=tk.X, padx=5, pady=5) self.extract_type = tk.StringVar(value="selection") ttk.Radiobutton(right_frame, text="选区提取", variable=self.extract_type, value="selection").pack(anchor=tk.W, padx=20) ttk.Radiobutton(right_frame, text="整页提取", variable=self.extract_type, value="full_page").pack(anchor=tk.W, padx=20) # 表格识别选项 table_frame = ttk.LabelFrame(right_frame, text="表格识别选项") table_frame.pack(fill=tk.X, padx=5, pady=5) ttk.Label(table_frame, text="列容差:").grid(row=0, column=0, padx=5, pady=2, sticky=tk.W) self.column_tolerance_var = tk.StringVar(value=str(self.column_tolerance)) ttk.Entry(table_frame, textvariable=self.column_tolerance_var, width=5).grid(row=0, column=1, padx=2, pady=2) ttk.Label(table_frame, text="行容差:").grid(row=1, column=0, padx=5, pady=2, sticky=tk.W) self.row_tolerance_var = tk.StringVar(value=str(self.row_tolerance)) ttk.Entry(table_frame, textvariable=self.row_tolerance_var, width=5).grid(row=1, column=1, padx=2, pady=2) ttk.Button(table_frame, text="应用设置", command=self.apply_table_settings).grid(row=0, column=2, rowspan=2, padx=5, pady=2) # 选区坐标显示 selection_frame = ttk.LabelFrame(right_frame, text="选区坐标") selection_frame.pack(fill=tk.X, padx=5, pady=5) # 左上角坐标 ttk.Label(selection_frame, text="左上角:").grid(row=0, column=0, padx=5, pady=2, sticky=tk.W) self.selection_x1_var = tk.StringVar(value="0") self.selection_y1_var = tk.StringVar(value="0") ttk.Entry(selection_frame, textvariable=self.selection_x1_var, width=8, state="readonly").grid(row=0, column=1, padx=2, pady=2) ttk.Label(selection_frame, text=",").grid(row=0, column=2, padx=0, pady=2) ttk.Entry(selection_frame, textvariable=self.selection_y1_var, width=8, state="readonly").grid(row=0, column=3, padx=2, pady=2) # 右下角坐标 ttk.Label(selection_frame, text="右下角:").grid(row=1, column=0, padx=5, pady=2, sticky=tk.W) self.selection_x2_var = tk.StringVar(value="0") self.selection_y2_var = tk.StringVar(value="0") ttk.Entry(selection_frame, textvariable=self.selection_x2_var, width=8, state="readonly").grid(row=1, column=1, padx=2, pady=2) ttk.Label(selection_frame, text=",").grid(row=1, column=2, padx=0, pady=2) ttk.Entry(selection_frame, textvariable=self.selection_y2_var, width=8, state="readonly").grid(row=1, column=3, padx=2, pady=2) # 选区尺寸 ttk.Label(selection_frame, text="尺寸:").grid(row=2, column=0, padx=5, pady=2, sticky=tk.W) self.selection_width_var = tk.StringVar(value="0") self.selection_height_var = tk.StringVar(value="0") ttk.Entry(selection_frame, textvariable=self.selection_width_var, width=8, state="readonly").grid(row=2, column=1, padx=2, pady=2) ttk.Label(selection_frame, text="×").grid(row=2, column=2, padx=0, pady=2) ttk.Entry(selection_frame, textvariable=self.selection_height_var, width=8, state="readonly").grid(row=2, column=3, padx=2, pady=2) # 选区重置按钮 ttk.Button(right_frame, text="重置选区", command=self.reset_selection).pack(fill=tk.X, padx=5, pady=5) # 提取按钮 ttk.Button(right_frame, text="提取文本", command=self.extract_text).pack(fill=tk.X, padx=5, pady=5) # 提取所有页面相同区域按钮 ttk.Button(right_frame, text="提取所有页面相同区域", command=self.extract_all_pages_same_region).pack(fill=tk.X, padx=5, pady=5) # 导出按钮 ttk.Button(right_frame, text="导出到Excel", command=self.export_to_excel).pack(fill=tk.X, padx=5, pady=5) # 提取结果显示 result_frame = ttk.LabelFrame(right_frame, text="提取结果") result_frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5) self.result_text = tk.Text(result_frame, height=10) self.result_text.pack(fill=tk.BOTH, expand=True, padx=5, pady=5) # 状态栏 self.status_var = tk.StringVar(value="就绪") self.status_bar = ttk.Label(self.root, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W) self.status_bar.pack(side=tk.BOTTOM, fill=tk.X) # 绑定回车键到页码跳转 self.page_entry.bind("<Return>", lambda event: self.jump_to_page()) # 绑定缩略图画布配置事件 self.thumbnails_frame.bind("<Configure>", self.on_thumbnails_configure) def apply_table_settings(self): """应用表格识别设置""" try: self.column_tolerance = float(self.column_tolerance_var.get()) self.row_tolerance = float(self.row_tolerance_var.get()) self.status_var.set(f"已应用表格识别设置: 列容差={self.column_tolerance}, 行容差={self.row_tolerance}") except ValueError: messagebox.showerror("输入错误", "请输入有效的数值") def on_thumbnails_configure(self, event): """更新缩略图画布的滚动区域""" self.thumbnail_canvas.configure(scrollregion=self.thumbnail_canvas.bbox("all")) def open_pdf(self): file_path = filedialog.askopenfilename(filetypes=[("PDF文件", "*.pdf")]) if file_path: try: self.pdf_document = fitz.open(file_path) self.total_pages = len(self.pdf_document) self.current_page = 0 self.extracted_data = [] self.table_data = None self.all_pages_table_data = None self.result_text.delete(1.0, tk.END) # 更新页面标签 self.page_label.config(text=f"{self.current_page + 1}/{self.total_pages}") # 生成缩略图 self.generate_thumbnails() # 显示当前页面 self.display_current_page() self.status_var.set(f"已打开文件: {os.path.basename(file_path)}") except Exception as e: messagebox.showerror("错误", f"无法打开PDF文件: {str(e)}") def generate_thumbnails(self): """生成PDF页面缩略图""" # 清除现有缩略图 self.thumbnails = [] for widget in self.thumbnails_frame.winfo_children(): widget.destroy() y_offset = 5 for page_num in range(self.total_pages): # 创建缩略图容器 thumbnail_frame = ttk.Frame(self.thumbnails_frame) thumbnail_frame.pack(fill=tk.X, padx=5, pady=2) # 生成缩略图 page = self.pdf_document[page_num] pix = page.get_pixmap(matrix=fitz.Matrix(0.2, 0.2)) img = Image.open(io.BytesIO(pix.tobytes("ppm"))) photo = ImageTk.PhotoImage(img) # 存储引用以防止垃圾回收 self.thumbnails.append(photo) # 创建缩略图按钮 thumbnail_btn = tk.Button(thumbnail_frame, image=photo, command=lambda p=page_num: self.go_to_page(p), relief=tk.FLAT) thumbnail_btn.pack(side=tk.LEFT, padx=5, pady=5) # 添加页码标签 page_label = ttk.Label(thumbnail_frame, text=f"页面 {page_num + 1}") page_label.pack(side=tk.LEFT, padx=5) # 高亮显示当前页面 if page_num == self.current_page: thumbnail_frame.config(style="ActiveThumbnail.TFrame") page_label.config(style="ActiveThumbnail.TLabel") else: # 鼠标悬停效果 thumbnail_frame.bind("<Enter>", lambda e, f=thumbnail_frame: f.config(style="HoverThumbnail.TFrame")) thumbnail_frame.bind("<Leave>", lambda e, f=thumbnail_frame: f.config(style="")) page_label.bind("<Enter>", lambda e, l=page_label: l.config(style="HoverThumbnail.TLabel")) page_label.bind("<Leave>", lambda e, l=page_label: l.config(style="")) def display_current_page(self): if not self.pdf_document: return self.pdf_canvas.delete("all") self.selection_start = None self.selection_end = None self.is_selecting = False # 重置选区坐标显示 self.update_selection_coordinates(0, 0, 0, 0) page = self.pdf_document[self.current_page] # 根据自适应模式计算缩放比例 if self.auto_fit_mode == "page": # 自适应整页 self.adjust_zoom_to_fit_page() elif self.auto_fit_mode == "width": # 自适应宽度 self.adjust_zoom_to_fit_width() else: # 实际大小 pass # 使用当前zoom_factor # 使用计算的缩放比例渲染页面 matrix = fitz.Matrix(self.zoom_factor, self.zoom_factor) pix = page.get_pixmap(matrix=matrix) img = Image.open(io.BytesIO(pix.tobytes("ppm"))) photo = ImageTk.PhotoImage(img) # 存储引用以防止垃圾回收 self.current_image = photo # 显示图像 self.image_id = self.pdf_canvas.create_image(0, 0, anchor=tk.NW, image=photo) # 获取页面边界框(用于限制选区) self.page_bbox = self.pdf_canvas.bbox(self.image_id) # 设置画布滚动区域 self.pdf_canvas.config(scrollregion=self.pdf_canvas.bbox(tk.ALL)) # 居中显示 self.center_view() # 状态栏显示页面信息 self.status_var.set(f"页面 {self.current_page + 1}/{self.total_pages}, 缩放比例: {self.zoom_factor:.1f}x") # 更新缩略图高亮 self.generate_thumbnails() def adjust_zoom_to_fit_page(self): """调整缩放比例以适应整个页面""" if not self.pdf_document: return # 获取当前页面和画布尺寸 page = self.pdf_document[self.current_page] canvas_width = self.pdf_canvas.winfo_width() canvas_height = self.pdf_canvas.winfo_height() # 考虑滚动条宽度 scrollbar_width = 15 canvas_width -= scrollbar_width canvas_height -= scrollbar_width # 计算页面宽高 page_width = page.rect.width page_height = page.rect.height # 计算适应画布的缩放比例 width_factor = canvas_width / page_width height_factor = canvas_height / page_height # 取较小的缩放比例以确保整个页面可见 self.zoom_factor = min(width_factor, height_factor) def adjust_zoom_to_fit_width(self): """调整缩放比例以适应页面宽度""" if not self.pdf_document: return # 获取当前页面和画布宽度 page = self.pdf_document[self.current_page] canvas_width = self.pdf_canvas.winfo_width() # 考虑滚动条宽度 scrollbar_width = 15 canvas_width -= scrollbar_width # 计算页面宽度 page_width = page.rect.width # 计算适应画布宽度的缩放比例 self.zoom_factor = canvas_width / page_width def center_view(self): """居中显示PDF页面""" if not self.pdf_document: return # 获取画布和页面尺寸 canvas_width = self.pdf_canvas.winfo_width() canvas_height = self.pdf_canvas.winfo_height() page_width = self.pdf_canvas.bbox(tk.ALL)[2] page_height = self.pdf_canvas.bbox(tk.ALL)[3] # 计算居中位置 if page_width > canvas_width: # 页面宽度大于画布,使用滚动条 xview = 0 else: # 页面宽度小于画布,居中显示 xview = (canvas_width - page_width) / 2 / canvas_width if page_height > canvas_height: # 页面高度大于画布,使用滚动条 yview = 0 else: # 页面高度小于画布,居中显示 yview = (canvas_height - page_height) / 2 / canvas_height # 设置视图位置 self.pdf_canvas.xview_moveto(xview) self.pdf_canvas.yview_moveto(yview) def go_to_page(self, page_num): """跳转到指定页面""" if 0 <= page_num < self.total_pages: self.current_page = page_num self.page_label.config(text=f"{self.current_page + 1}/{self.total_pages}") self.display_current_page() self.page_entry.delete(0, tk.END) self.page_entry.insert(0, str(page_num + 1)) def jump_to_page(self): """根据输入的页码跳转到指定页面""" if not self.pdf_document: return try: page_num = int(self.page_entry.get()) - 1 if 0 <= page_num < self.total_pages: self.go_to_page(page_num) else: messagebox.showwarning("页码错误", f"请输入1到{self.total_pages}之间的页码") self.page_entry.delete(0, tk.END) self.page_entry.insert(0, str(self.current_page + 1)) except ValueError: messagebox.showwarning("输入错误", "请输入有效的页码") self.page_entry.delete(0, tk.END) self.page_entry.insert(0, str(self.current_page + 1)) def prev_page(self): if self.current_page > 0: self.current_page -= 1 self.page_label.config(text=f"{self.current_page + 1}/{self.total_pages}") self.display_current_page() self.page_entry.delete(0, tk.END) self.page_entry.insert(0, str(self.current_page + 1)) def next_page(self): if self.current_page < self.total_pages - 1: self.current_page += 1 self.page_label.config(text=f"{self.current_page + 1}/{self.total_pages}") self.display_current_page() self.page_entry.delete(0, tk.END) self.page_entry.insert(0, str(self.current_page + 1)) def on_mouse_down(self, event): # 检查是否点击在页面内 if self.page_bbox and self.is_point_in_page(event.x, event.y): self.is_selecting = True self.selection_start = (event.x, event.y) # 限制起点在页面内 self.selection_start = self.clamp_point_to_page(self.selection_start[0], self.selection_start[1]) # 创建选区矩形 self.selection_rect = self.pdf_canvas.create_rectangle( self.selection_start[0], self.selection_start[1], self.selection_start[0], self.selection_start[1], outline="red", width=2, stipple="gray25", fill="#FF000033") # 更新选区坐标显示 self.update_selection_coordinates( int(self.selection_start[0]), int(self.selection_start[1]), int(self.selection_start[0]), int(self.selection_start[1]) ) # 状态栏显示选区信息 self.status_var.set(f"选区起点: ({int(self.selection_start[0])}, {int(self.selection_start[1])})") # 清除之前的辅助线条 for line in self.helper_lines: self.pdf_canvas.delete(line) self.helper_lines = [] def on_mouse_drag(self, event): if self.is_selecting and hasattr(self, 'selection_rect'): # 限制终点在页面内 end_x, end_y = self.clamp_point_to_page(event.x, event.y) # 更新选区矩形 self.pdf_canvas.coords(self.selection_rect, self.selection_start[0], self.selection_start[1], end_x, end_y) # 计算选区坐标 x1, y1 = self.selection_start x2, y2 = end_x, end_y # 确保坐标按左上右下排序 if x1 > x2: x1, x2 = x2, x1 if y1 > y2: y1, y2 = y2, y1 # 更新选区坐标显示 self.update_selection_coordinates(int(x1), int(y1), int(x2), int(y2)) # 计算选区尺寸 width = x2 - x1 height = y2 - y1 # 显示选区坐标和尺寸 coord_text = f"选区: ({int(x1)}, {int(y1)}) - ({int(x2)}, {int(y2)}) | 尺寸: {int(width)}×{int(height)} 像素" self.status_var.set(coord_text) # 更新辅助线条 for line in self.helper_lines: self.pdf_canvas.delete(line) self.helper_lines = [] # 绘制水平辅助线 h_line1 = self.pdf_canvas.create_line(x1, y1, x2, y1, fill="blue", dash=(4, 4)) h_line2 = self.pdf_canvas.create_line(x1, y2, x2, y2, fill="blue", dash=(4, 4)) # 绘制垂直辅助线 v_line1 = self.pdf_canvas.create_line(x1, y1, x1, y2, fill="blue", dash=(4, 4)) v_line2 = self.pdf_canvas.create_line(x2, y1, x2, y2, fill="blue", dash=(4, 4)) self.helper_lines.extend([h_line1, h_line2, v_line1, v_line2]) def on_mouse_up(self, event): if self.is_selecting: self.is_selecting = False # 限制终点在页面内 end_x, end_y = self.clamp_point_to_page(event.x, event.y) self.selection_end = (end_x, end_y) # 检查选区是否太小 width = abs(self.selection_end[0] - self.selection_start[0]) height = abs(self.selection_end[1] - self.selection_start[1]) if width < 10 or height < 10: # 选区太小,删除选区 self.pdf_canvas.delete(self.selection_rect) self.selection_start = None self.selection_end = None # 重置选区坐标显示 self.update_selection_coordinates(0, 0, 0, 0) self.status_var.set("选区太小,已重置") else: # 更新选区矩形 self.pdf_canvas.coords(self.selection_rect, self.selection_start[0], self.selection_start[1], self.selection_end[0], self.selection_end[1]) # 计算最终选区坐标 x1, y1 = self.selection_start x2, y2 = self.selection_end # 确保坐标按左上右下排序 if x1 > x2: x1, x2 = x2, x1 if y1 > y2: y1, y2 = y2, y1 # 更新选区坐标显示 self.update_selection_coordinates(int(x1), int(y1), int(x2), int(y2)) # 计算选区尺寸 width = x2 - x1 height = y2 - y1 # 显示最终选区坐标和尺寸 coord_text = f"选区已完成: ({int(x1)}, {int(y1)}) - ({int(x2)}, {int(y2)}) | 尺寸: {int(width)}×{int(height)} 像素" self.status_var.set(coord_text) # 清除辅助线条 for line in self.helper_lines: self.pdf_canvas.delete(line) self.helper_lines = [] def update_selection_coordinates(self, x1, y1, x2, y2): """更新选区坐标显示""" # 确保坐标按左上右下排序 if x1 > x2: x1, x2 = x2, x1 if y1 > y2: y1, y2 = y2, y1 # 更新坐标显示 self.selection_x1_var.set(str(x1)) self.selection_y1_var.set(str(y1)) self.selection_x2_var.set(str(x2)) self.selection_y2_var.set(str(y2)) # 计算并更新尺寸 width = x2 - x1 height = y2 - y1 self.selection_width_var.set(str(width)) self.selection_height_var.set(str(height)) def is_point_in_page(self, x, y): """检查点是否在页面内""" if not self.page_bbox: return False x1, y1, x2, y2 = self.page_bbox return x1 <= x <= x2 and y1 <= y <= y2 def clamp_point_to_page(self, x, y): """将点限制在页面范围内""" if not self.page_bbox: return (x, y) x1, y1, x2, y2 = self.page_bbox clamped_x = max(x1, min(x, x2)) clamped_y = max(y1, min(y, y2)) return (clamped_x, clamped_y) def extract_text(self): if not self.pdf_document: messagebox.showinfo("提示", "请先打开PDF文件") return if self.extract_type.get() == "selection": if not self.selection_start or not self.selection_end: messagebox.showinfo("提示", "请先选择文本区域") return # 确保选区坐标正确排序 x0, y0 = min(self.selection_start[0], self.selection_end[0]), min(self.selection_start[1], self.selection_end[1]) x1, y1 = max(self.selection_start[0], self.selection_end[0]), max(self.selection_start[1], self.selection_end[1]) # 计算选区在原始PDF中的比例 page = self.pdf_document[self.current_page] # 调整选区坐标为PDF坐标 pdf_x0 = x0 / self.zoom_factor pdf_y0 = y0 / self.zoom_factor pdf_x1 = x1 / self.zoom_factor pdf_y1 = y1 / self.zoom_factor # 创建选区矩形 rect = fitz.Rect(pdf_x0, pdf_y0, pdf_x1, pdf_y1) # 使用dict模式提取文本,获取更详细的布局信息 text_data = page.get_text("dict", clip=rect) else: # 整页提取 page = self.pdf_document[self.current_page] text_data = page.get_text("dict") if text_data and 'blocks' in text_data: # 分析文本块,识别表格结构 table_data = self.analyze_table_structure(text_data) # 添加页码到表格数据 if table_data: self.table_data = [[f"页面 {self.current_page + 1}"] + row for row in table_data] else: self.table_data = None # 更新结果显示 self.result_text.delete(1.0, tk.END) if self.table_data and len(self.table_data) > 0: # 显示表格预览 self.result_text.insert(tk.END, "已识别表格结构:\n\n") for row in self.table_data: row_text = " | ".join([cell if cell else " " for cell in row]) self.result_text.insert(tk.END, f"{row_text}\n") self.status_var.set(f
06-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值