MTK-event-事件機制總結(jié)_第1頁
MTK-event-事件機制總結(jié)_第2頁
MTK-event-事件機制總結(jié)_第3頁
MTK-event-事件機制總結(jié)_第4頁
MTK-event-事件機制總結(jié)_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

MTKMMIevent小結(jié)1MTK都有相應的處理方式,跟交互相關的按鍵(KeyBrd.c)和觸摸屏(TouchScreen.c)各有各種其他事件,它主要分為普通事件和interruptevent,interruptevent主要用于需要MTKMMIevent小結(jié)2t池電量,信號量等等都是通過這個函數(shù)來注冊消息。當L4層處理完封裝事件后,就會把這kMMItask過這個event機制,找到相應的處理函數(shù),進行處理。實現(xiàn)這種機制,也是考慮到靈活性和擴性。如果都在MMItask里面,用switchcase來處理,那就很瘋狂了,長度不說,寫個應用,定義個消息,都要去改MMItask,所以這個機制實現(xiàn)雖然比較簡單,但是還是處理這個消息,還有些應用需要在這個事件處理完畢后處理。還是看代碼吧ent里被#define到mmi_frm_execute_current_protocol_handler)//MsgStruct是具體事件的消息體voidmmi_frm_execute_current_protocol_handler(U16eventID,void*MsgStruct,intmod_src,void*peerBuf){U16count=0;PsExtPeerFuncPtrcurrFuncPtr=NULL;MMI_BOOLquery_result=MMI_FALSE,execute_result=MMI_FALSE;interrupt_event_hdlrint_func=NULL,post_int_func=NULL;mmi_frm_int_event_typecurrent_frm_int_event;idx=mmi_frm_search_event();{//遍歷protocolEventHandler查找是否有event注冊了回調(diào)函數(shù)//雖然這個方法感覺比較笨,就一個數(shù)組,實際上對速度沒有什么影響for(count=0;count<maxProtocolEvent;count++){if(protocolEventHandler[count].eventID==eventID){//找到處理函數(shù)currFuncPtr=(PsExtPeerFuncPtr)protocolEventHandler[count].entryFuncPtr;//這個地方時,一個優(yōu)化//處理的事情就是把剛才現(xiàn)在處理的eventid往前移動一個單位這個優(yōu)化還是很有必要的if(count>0){protocolEventHandler[count].eventID=protocolEventHandler[count-1].eventID;protocolEventHandler[count].entryFuncPtr=protocolEventHandler[count-1].entryFuncPtr;protocolEventHandler[count-1].eventID=eventID;protocolEventHandler[count-1].entryFuncPtr=(PsFuncPtr)currFuncPtr;}break;}}}//這個就是查找是否是中斷事件current_frm_int_event=mmi_frm_interrupt_event_converter(eventID,MsgStruct);if(current_frm_int_event>0){//查看該中斷事件是否有注冊提前處理函數(shù)query_result=mmi_frm_query_interrupt_event_information(current_frm_int_event,&int_func,&post_int_func);}//如果有調(diào)用該函數(shù)if(query_result&&int_func){/*Newinterruptionmechanism*/execute_result=(*int_func)(current_frm_int_event);}//根據(jù)event相應的回調(diào)函數(shù)以及前面處理的結(jié)果,來決定是否處理該事件//要注意的是,如果interrput提前處理函數(shù)返回true,那么這里就不會執(zhí)行if((currFuncPtr)&&(!interrup_result)&&(!execute_result)){(*currFuncPtr)(MsgStruct,mod_src,peerBuf);}{MMI_TRACE(MMI_FW_TRC_G1_FRM,MMI_FRM_INFO_EVENT_EXECURPTO_NO_HDLR,eventID);}//interruptevent最后處理函數(shù)if(query_result&&post_int_func){execute_result=(*post_int_func)(current_frm_int_event);}}看完這個,其實覺得挺簡單的,對吧。就是一個數(shù)組,數(shù)組里關聯(lián)了eventid和對應的還有就是增加了一種intrruptevent??梢宰赃@種event的pre_handlerandpost_handler。這樣如果需要,可以提前做處理或者不響應該事件。MTKMMIevent小結(jié)3昨天大概的說了下,普通event的執(zhí)行過程。中間還有幾個函數(shù)沒有介紹,這里簡單介紹staticmmi_frm_int_event_typemmi_frm_interrupt_event_converter(U16event_id,void*msg){mmi_frm_int_event_typefrm_interrupt_event=0;switch(event_id){//GPIO消息casePRT_EQ_GPIO_DETECT_IND:{mmi_eq_gpio_detect_ind_struct*gpio_detect_ind=(mmi_eq_gpio_detect_ind_struct*)msg;switch(gpio_detect_ind->gpio_device){//翻蓋關閉caseEXT_DEV_CLAM_CLOSE:{frm_interrupt_event=MMI_FRM_INT_CLAM_CLOSE;break;}//翻蓋打開caseEXT_DEV_CLAM_OPEN:{frm_interrupt_event=MMI_FRM_INT_CLAM_OPEN;break;}//耳機插入拔出caseEXT_DEV_EARPHONE:{if(gpio_detect_ind->on_off==1){frm_interrupt_event=MMI_FRM_INT_EARPHONE_PLUG_IN;}{frm_interrupt_event=MMI_FRM_INT_EARPHONE_PLUG_OUT;}break;}}break;}casePRT_BATTERY_STATUS_IND:{mmi_eq_battery_status_ind_struct*battery_status_ind=(mmi_eq_battery_status_ind_struct*)msg;frm_interrupt_event=mmi_frm_get_frm_int_event_macro(battery_status_ind->battery_status,mmi_frm_int_event_battery_table,sizeof(mmi_frm_int_event_battery_table)/sizeof(mmi_frm_int_event_battery_table[0]));/*Forlowbatteryindication*/if(battery_status_ind->battery_status==PMIC_VBAT_STATUS){if(battery_status_ind->battery_voltage==BATTERY_LOW_WARNING){frm_interrupt_event=MMI_FRM_INT_BATTERY_LOW_WARNING;}elseif(battery_status_ind->battery_voltage==BATTERY_LOW_TX_PROHIBIT){frm_interrupt_event=MMI_FRM_INT_BATTERY_LOW_TX_PROHIBIT;}}break;}caseMSG_ID_TIMER_EXPIRY:caseMSG_ID_MMI_EQ_POWER_ON_IND:caseMSG_ID_MMI_EQ_KEYPAD_DETECT_IND:{break;}default:{//其他interruptevent,主要是彈出框相關,短信報告等等frm_interrupt_event=mmi_frm_get_frm_int_event_macro(event_id,mmi_frm_int_event_convert_table,sizeof(mmi_frm_int_event_convert_table)/sizeof(mmi_frm_int_event_convert_table[0]));break;}}returnfrm_interrupt_event;}這個函數(shù)就是把L4C的消息轉(zhuǎn)換到MMI的消息,然后通過n函數(shù)比較簡單,就是數(shù)組里去比較。也沒有什么可說的,無非就是循環(huán)查找是否有這個event。1,如果有,看func是否為空,為空表示去掉這個event的注冊,不為空,就直接修改這個event的func(定時器到時時所要實現(xiàn)的功能函數(shù))效,那么減少總注冊event的個數(shù)。這個樣可以減少循環(huán)查詢的次數(shù)。MTKMMIevent小結(jié)4key事件產(chǎn)生時,該機制就去找到相應的回調(diào)函數(shù),進行回調(diào)。1keydown按鍵按下KEY_EVENT_DOWN2keyup按鍵彈起KEY_EVENT_UP3keylongpress按鍵長按KEY_LONG_PRESS。默認好像是長按1.5記不清楚了,可以自己設置,函數(shù)Kbd_SetLongPressTime,不過除非必不得已,不要去隨便修改,可能會引起其他應用出問題,要修改,也要先獲得當前值,退出應用時設置回原來的值。也就是按住鍵0.5s之后,每隔0.5s,就會發(fā)送一個repeat消息。設置函數(shù)是說的2step可以。先講一下按鍵的處理流程。統(tǒng)初始化的時候,已經(jīng)注冊了這個消息的處理函數(shù)mmi_frm_key_handle。也就是說mmi_frm_key_handle是處理按鍵過程的函數(shù)。這個函數(shù)mmi_frm_key_handle收到這個消息后,會通過該消息帶的函數(shù),去取當前發(fā)生的按鍵事件(實際這個函數(shù)就是一個按鍵緩MMI層,驅(qū)動產(chǎn)生按鍵事件很快而MMI有可能比較慢,可以簡單的理解為生產(chǎn)者和消費者的MTKMMIevent小結(jié)5昨天說了一下keyevent的基本情況,今天直接從代碼開始吧先看執(zhí)行keyevent函數(shù)mmi_frm_key_handlevoidmmi_frm_key_handle(void*paraBuff){kbd_datak;U32msg_count;mmi_eq_keypad_detect_ind_struct*p;//判斷參數(shù)是否為空//在初始化時,系統(tǒng)就注冊了MSG_ID_MMI_EQ_KEYPAD_DETECT_IND的回調(diào)函數(shù)為mmi_frm_key_handle//當收到這個消息時,表示有按鍵事件要處理,//這個paraBuff是keyTask傳過來的參數(shù),里面的容是獲取按鍵信息的函數(shù)指針if(paraBuff!=NULL){drv_get_key_funcnew_key_ptr;p=(mmi_eq_keypad_detect_ind_struct*)paraBuff;new_key_ptr=(drv_get_key_func)(p->func);//判斷是否是新的函數(shù)指針,如果是的話,需要進行一些清理工作if(new_key_ptr!=keypad_ptr){//新的函數(shù)指針,則進行清理,并且判斷是否有按鍵需要處理if(!mmi_kbd_process_keyptr_change((void*)new_key_ptr)){return;}ClearKeyEvents();keypad_ptr=new_key_ptr;}}//通過while(1)來不停的從按鍵緩存里獲取按鍵信息//當然這里不會無限死循環(huán),后面會進行相應處理while(1){==MMI_TRUE)){if(k.Keydata[0]!=KEY_INVALID){#ifdefined(__MMI_TOUCH_SCREEN__)||defined(__MMI_HANDWRITING_PAD__)kal_boolis_pen_enabled,is_pen_down;//獲得觸摸屏狀態(tài)mmi_pen_get_state(&is_pen_enabled,&is_pen_down);#endif/*defined(__MMI_TOUCH_SCREEN__)||defined(__MMI_HANDWRITING_PAD__)*/#ifdefined(__MMI_TOUCH_SCREEN__)||defined(__MMI_HANDWRITING_PAD__)//如果觸摸屏按下,那么保存狀態(tài)if(is_pen_down&&(k.Keyevent==WM_KEYPRESS)){U16KeyMapIndex;//不允許按鍵處理is_allow_key_action=MMI_FALSE;把驅(qū)動的按鍵和MMI按鍵進行轉(zhuǎn)換KeyMapIndex=mmi_frm_get_idx_from_device_key_code(k.Keydata[0]);if(nKeyPadStatus[KeyMapIndex]==KEY_EVENT_UP){KEYBRD_MESSAGEKeyBrdMsg;KeyBrdMsg.nKeyCode=nKeyPadMap[KeyMapIndex].nMMIKeyCode;if(mmi_frm_is_2step_keyCode(KeyBrdMsg.nKeyCode)){nKeyPadStatus[KeyMapIndex]=KEY_HALF_PRESS_DOWN;pressKey=HALF_DOWN_STATUS;key_is_pressing_count++;}{nKeyPadStatus[KeyMapIndex]=KEY_EVENT_DOWN;pressKey=FULL_DOWN_STATUS;key_is_pressing_count++;}}}#endif/*defined(__MMI_TOUCH_SCREEN__)||defined(__MMI_HANDWRITING_PAD__)*///如果按鍵是彈起,那么還原原來按鍵狀態(tài),也就是彈起狀態(tài)if((k.Keyevent==WM_KEYRELEASE)&&(is_allow_key_action==MMI_FALSE)){#ifdefined(__MMI_TOUCH_SCREEN__)||defined(__MMI_HANDWRITING_PAD__)/*ResetallowkeyflagandUpdatekeystatusevenifpenisdown*/U16KeyMapIndex;KeyMapIndex=mmi_frm_get_idx_from_device_key_code(k.Keydata[0]);if((nKeyPadStatus[KeyMapIndex]==KEY_EVENT_DOWN)||(nKeyPadStatus[KeyMapIndex]==KEY_HALF_PRESS_DOWN)||(nKeyPadStatus[KeyMapIndex]==KEY_LONG_PRESS)||(nKeyPadStatus[KeyMapIndex]==KEY_REPEAT)){nKeyPadStatus[KeyMapIndex]=KEY_EVENT_UP;key_is_pressing_count--;}prevKeyMapIndex=prevKeyMapIndex;#endif/*defined(__MMI_TOUCH_SCREEN__)||defined(__MMI_HANDWRITING_PAD__)*/is_allow_key_action=MMI_TRUE;}//按鍵是否可以處理if(is_allow_key_action==MMI_TRUE){if(((k.Keyevent==WM_KEYPRESS)&&(mmi_kbd_get_key_is_pressing_count()==0))||k.Keyevent==DRV_WM_KEYLONGPRESS||k.Keyevent==DRV_WM_KEYREPEATED||k.Keyevent==DRV_WM_KEYFULLPRESS){#ifdefined(__MMI_TOUCH_SCREEN__)||defined(__MMI_HANDWRITING_PAD__)//關閉觸摸屏mmi_pen_disable();#endif}//真正處理按鍵事件mmi_frm_convert_process_key_event(k.Keyevent,k.Keydata[0]);if((k.Keyevent==WM_KEYRELEASE)&&(mmi_kbd_get_key_is_pressing_count()==0)){#ifdefined(__MMI_TOUCH_SCREEN__)||defined(__MMI_HANDWRITING_PAD__)//重新打開觸摸屏mmi_pen_enable();#endif}}}獲得MMItask消息隊列消息個數(shù)msg_get_ext_queue_info(mmi_ext_qid,&msg_count);//如果外部有消息或者部消息,則跳出該循環(huán)if(msg_count>0||OslNumOfCircularQMsgs()>0){//表示還有key需要處理,在MMItask里會直接調(diào)用這個函數(shù)進行再處理g_keypad_flag=MMI_TRUE;break;}}{g_keypad_flag=MMI_FALSE;break;}}/*while(1)*/MMI_TRACE(MMI_FW_TRC_G1_FRM,MMI_FRM_KEY_HDLR_END);}這么做可以防止task中不停的發(fā)送消息,可以理解為共享存。同樣當有其他消息來時,需要跳出來處理其他消息,處理完畢后還需要再來處理。2)這里跟觸摸屏的事件進行了沖突處理,也就是按鍵和觸摸屏不能同時工作,這兩者也沒3)實際真正處理按鍵是在mmi_frm_convert_process_key_event里面,下次在分析MTKMMIevent小結(jié)6在MTKMMIevent小結(jié)5中,提到了event處理函數(shù)mmi_frm_key_handle,這個函數(shù)主要作用是判斷是否需要處理按鍵,從按鍵緩存里面持續(xù)的讀取按鍵信息,然后調(diào)用旋轉(zhuǎn)的情況下,把導航鍵轉(zhuǎn)換一下,接著它調(diào)用了ProcessKeyEvent,這個函數(shù)主要是voidProcessKeyEvent(U32MsgType,U16DeviceKeyCode){MMI_BOOLisKeyPaired;U16KeyMapIndex;/*----------------------------------------------------------------*//*CodeBody*//*----------------------------------------------------------------*///按鍵影射,把驅(qū)動的按鍵碼,轉(zhuǎn)換成MMI的按鍵消息KeyMapIndex=mmi_frm_get_idx_from_device_key_code(DeviceKeyCode);if(KeyMapIndex>=MAX_KEYS){return;}//處理各種按鍵事件,沒有什么可以多說的,//1判斷狀態(tài)是否正常KeyEventHandler忽略該事件if(MsgType==WM_KEYPRESS){//這里處理多按鍵同時按下的情況。這里需要硬件支持if((KeyMapIndex!=prevKeyMapIndex)&&(g_kbd_concurrent_key_mode==CONCURRENT_KEY_MODE_1_KEY)){isKeyPaired=(nKeyPadStatus[prevKeyMapIndex]==KEY_EVENT_UP);prevKeyMapIndex=KeyMapIndex;}//判斷按鍵狀態(tài)是否正常,防止不匹配if(nKeyPadStatus[KeyMapIndex]==KEY_EVENT_UP){KEYBRD_MESSAGEKeyBrdMsg;KeyBrdMsg.nKeyCode=nKeyPadMap[KeyMapIndex].nMMIKeyCode;if(mmi_frm_is_2step_keyCode(KeyBrdMsg.nKeyCode)){nKeyPadStatus[KeyMapIndex]=KEY_HALF_PRESS_DOWN;key_is_pressing_count++;KeyBrdMsg.nMsgType=KEY_HALF_PRESS_DOWN;}{nKeyPadStatus[KeyMapIndex]=KEY_EVENT_DOWN;/*samewithKEY_FULL_PRESS_DOWN*/key_is_pressing_count++;KeyBrdMsg.nMsgType=KEY_EVENT_DOWN;}//處理按鍵事件KeyEventHandler((KEYBRD_MESSAGE*)&KeyBrdMsg);}{/*Ignoretheevent*/}}elseif(MsgType==WM_KEYRELEASE){if((nKeyPadStatus[KeyMapIndex]==KEY_EVENT_DOWN)||(nKeyPadStatus[KeyMapIndex]==KEY_LONG_PRESS)||(nKeyPadStatus[KeyMapIndex]==KEY_REPEAT)||(nKeyPadStatus[KeyMapIndex]==KEY_HALF_PRESS_DOWN)){KEYBRD_MESSAGEKeyBrdMsg;nKeyPadStatus[KeyMapIndex]=KEY_EVENT_UP;key_is_pressing_count--;KeyBrdMsg.nMsgType=KEY_EVENT_UP;KeyBrdMsg.nKeyCode=nKeyPadMap[KeyMapIndex].nMMIKeyCode;KeyEventHandler((KEYBRD_MESSAGE*)&KeyBrdMsg);}{/*Ignoretheevent*/}}/*++Robin,modifiedbyMaxChen*/elseif(MsgType==DRV_WM_KEYLONGPRESS){if(nKeyPadStatus[KeyMapIndex]==KEY_EVENT_DOWN){KEYBRD_MESSAGEKeyBrdMsg;nKeyPadStatus[KeyMapIndex]=KEY_LONG_PRESS;KeyBrdMsg.nMsgType=KEY_LONG_PRESS;KeyBrdMsg.nKeyCode=nKeyPadMap[KeyMapIndex].nMMIKeyCode;KeyEventHandler((KEYBRD_MESSAGE*)&KeyBrdMsg);}{/*Ignoretheevent*/}}elseif(MsgType==DRV_WM_KEYREPEATED){if((nKeyPadStatus[KeyMapIndex]==KEY_LONG_PRESS)||(nKeyPadStatus[KeyMapIndex]==KEY_REPEAT)){KEYBRD_MESSAGEKeyBrdMsg;nKeyPadStatus[KeyMapIndex]=KEY_REPEAT;KeyBrdMsg.nMsgType=KEY_REPEAT;KeyBrdMsg.nKeyCode=nKeyPadMap[KeyMapIndex].nMMIKeyCode;KeyEventHandler((KEYBRD_MESSAGE*)&KeyBrdMsg);}{/*Ignoretheevent*/}}elseif(MsgType==DRV_WM_KEYFULLPRESS){*Onlyintwo-stagekeywillhaveKEY_FULL_PRESS_DOWN,anditfollowedafterKEY_HALF_PRESS_DOWNif(nKeyPadStatus[KeyMapIndex]==KEY_HALF_PRESS_DOWN){KEYBRD_MESSAGEKeyBrdMsg;nKeyPadStatus[KeyMapIndex]=KEY_EVENT_DOWN;KeyBrdMsg.nMsgType=KEY_EVENT_DOWN;KeyBrdMsg.nKeyCode=nKeyPadMap[KeyMapIndex].nMMIKeyCode;KeyEventHandler((structKEYBRD_MESSAGE*)&KeyBrdMsg);}{/*Ignoretheevent*/}}elseif((MsgType==DRV_WM_ENABLE_TWOKEY_DETECTION)||(MsgType==DRV_WM_ENABLE_THREEKEY_DETECTION)||(MsgType==DRV_WM_DISABLE_MULTIKEY_DETECTION)){/*Ignoretheevent*/}{MMI_TRACE(MMI_FW_TRC_G6_FRM_DETAIL,MMI_FRM_ERROR_PROC_KEYEVENT_HDLR);MMI_ASSERT(0);}}KeyEventHandler函數(shù)主要判斷是否要真的處理該事件,可以看成是一個按鍵事件的攔截,比如應用切換過程中,需要一個切換動畫,而這個動畫工程中,需要處理忽略這些按鍵。就staticvoidKeyEventHandler(KEYBRD_MESSAGE*eventKey){MMI_BOOLis_hdlr_enabled=MMI_TRUE;//主要處理一些特殊響應:屏幕背光,屏幕鎖定,按鍵聲音mmi_kbd_app_key_hdlr(eventKey);//判斷是否有前置處理函數(shù)if(g_mmi_frm_cntx.kbd_pre_func){is_hdlr_enabled=g_mmi_frm_cntx.kbd_pre_func(eventKey);}//根據(jù)前置處理函數(shù)結(jié)果,判斷是否要處理該keyeventif(is_hdlr_enabled){//處理案件事件ExecuteCurrKeyHandler((S16)eventKey->nKeyCode,(S16)eventKey->nMsgType);}//是否有后置處理函數(shù),可以進行一些監(jiān)視if(g_mmi_frm_cntx.kbd_post_func){g_mmi_frm_cntx.kbd_post_func(eventKey);}}voidExecuteCurrKeyHandler(S16keyCode,S16keyType){FuncPtrcurrFuncPtr=NULL;鍵盤鎖和屏保timermmi_idle_restart_keypad_lock_timer();mmi_idle_restart_screensaver_timer();frm_p->currKeyCode=keyCode;frm_p->currKeyType=keyType;//對狀態(tài)下,掛鍵的特殊處理.if(frm_p->currKeyType==KEY_EVENT_DOWN&&isInCall()&&!GetWapCallPresent()&&IsBitReset(g_mmi_frm_cntx.end_key_flag,frm_p->currKeyType)){RegisterEndKeyHandlerInCall();}//獲得按鍵處理函數(shù)currFuncPtr=currKeyFuncPtrs[keyCode][keyType];//導航的選擇鍵,默認和左功能鍵的效果一樣。if(keyCode==KEY_ENTER&&currFuncPtr==NULL){if(currKeyFuncPtrs[KEY_ENTER][KEY_EVENT_UP]==NULL&&currKeyFuncPtrs[KEY_ENTER][KEY_EVENT_DOWN]==NULL&&currKeyFuncPtrs[KEY_ENTER][KEY_HALF_PRESS_DOWN]==NULL&&currKeyFuncPtrs[KEY_ENTER][KEY_REPEAT]==NULL&&currKeyFuncPtrs[KEY_ENTER][KEY_LONG_PRESS]==NULL){currFuncPtr=currKeyFuncPtrs[KEY_LSK][keyType];}}//處理按鍵消息if(currFuncPtr){rFuncPtr}}//重置狀態(tài)if(keyType==KEY_EVENT_UP){frm_p->currKeyCode=KEY_INVALID;frm_p->currKeyType=MAX_KEY_TYPE;}}個消息后,在MMItask調(diào)用mmi_frm_key_handle繼續(xù)處理剩下的按鍵事件。這里無非多層一層函數(shù),每一層函數(shù)的功能還是比較獨立的,所以也不是很難看懂。MTKMMIevent小結(jié)7到這,keyevent的處理基本上就算完成了。其他幾個常用的函數(shù)注冊key處理函數(shù)了。相應key和event的數(shù)組里放入一個回調(diào)函數(shù)的指針。比如voidSetKeyHandler(FuncPt

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論