请输入您要查询的百科知识:

 

词条 arx
释义

AcApDocManager对象是所有文件对象的容器(对于每一个打开的且正在编辑的图形文件都有一个文件对象)。使用宏名为acDocManager的宏可以取得唯一的实例。

AcAp类

AcApDocManager

继承自

AcRxObject

Include 文件

Acdocman.h

参见

AcApDocument, AcApDocManagerReactor, AcApDocumentIterator

成员

AcApDocManager 函数

AcApDocManager::activateDocument函数

virtual Acad::ErrorStatus

activateDocument(

AcApDocument* pAcTargetDocument,

bool bPassScript = false) = 0;

pAcTargetDocument 指向要转移至的目标文件的输入指针

bPassScript 输入布尔值,表示在转移至另一文件时是否要继续执行脚本这个函数作用是从当前的 文件中转移至另一文件中。这个函数不会挂起在应用程序下执行的代码。如果是一个正常或空闲的状态则调用者被挂起。如果bPassScript值为Adesk::kTrue,则已经调用了执行改变文件的命令的脚本将继续执行。这个参数允许一个脚本跨文件运行。

AcApDocManager::addReactor函数

virtual void

addReactor(

AcApDocManagerReactor* unnamed) = 0;

unnamed 输入增加的AcApDocManagerReactor对象这个函数向文件管理器中增加一个AcApDocManagerReactor对象。

AcApDocManager::appContextNewDocument函数

virtual Acad::ErrorStatus

appContextNewDocument(

const char * pszTemplateName) = 0;

pszTemplateName 输入新建图形文件时要使用的图形模板名称或URL地址这个函数允许同步访问“新建”图形文件的操作,只能在应用程序中调用。

AcApDocManager::closeDocument函数

virtual Acad::ErrorStatus

closeDocument(

AcApDocument* pAcTargetDocument) = 0;

pAcTargetDocument 有效的AcApDocument对象的输入指针这个函数关闭pAcTargetDocument所指定的 文件。若输入文件不是当前文件,则当前文件仍具有控制权;若输入文件是当前文件,则在这个函数返回之前文件的执行环境就被终止,并且终止正常的命令。

AcApDocManager::curDocument函数

virtual AcApDocument *

curDocument() const = 0;

这个函数返回含有当前环境的文件。关联的函数mdiAcitveDocument(),返回MDI的活动文件。curDocument() 和mdiActiveDocument()可以不同。可以调用curDocument()使一个文件成为当前文件而实际上不激活它。在临时的当前文件下完成acDbDAtabase操作后,调用setCurDocument(acDocManager->mdiActiveDocument())重新设置MDI的活动文件为当前的文件。

AcApDocManager::disableDocumentActivation函数

virtual Acad::ErrorStatus

disableDocumentActivation() = 0;

这个函数将禁止用户转移至另一文件中。结束后,应用程序必须重新激活(使用AcApDocManager::enableDocumentActivation)。当一个应用程序命令执行的时间较长时就可以使用这个函数。

若已经处于无效模式则返回一个错误,否则,返回Acad::eOk。

AcApDocManager::document函数

virtual AcApDocument *

document(

AcDbDatabase* unnamed) const = 0;

unnamed 一个AcDbDatabase对象的输入指针这个函数返回含有输入的数据库的文件。所有的数据库都在ObjectARX中建立,当前的数据和任何一个加载的Xref数据库都拥有一个和它们关联的文件。由ObjectARX应用程序建立的数据库将会自动和建立它们的环境文件关联。那么数据库中就会记录这个文件的Undo(撤消)信息。同时对数据库中的对象必须使用这个文件的Transaction Manager(事务管理器)。

AcApDocManager::documentCount函数

virtual int

documentCount() const = 0;

这个函数返回当前开启的文件个数。

AcApDocManager::enableDocumentActivation函数

virtual Acad::ErrorStatus

enableDocumentActivation() = 0;

这个函数将允许用户转移至另一文件中。这个函数用于重新激活调用AcApDocManager::disableDocumentActivation后。

若已经处于无效模式则返回错误,否则,返回Acad::eOk。

AcApDocManager::inputPending函数

virtual int

inputPending(

AcApDocument* pAcTargetDocument) = 0;

pAcTargetDocument 指向您要查询的是否有未完成的输入的文件的指针这个函数将指定文件的输入缓冲器的状态,只和AcApDocManager::sendStringToExecute函数联合使用。

返回待处理的特性的数值。返回0表示没有未完成的输入,返回-1表示错误。

AcApDocManager::isDocumentActivationEnabled函数

virtual bool

isDocumentActivationEnabled() = 0;

这个函数显示作用中的文件是否为激活状态。

若为激活状态则返回true,否则,返回false。

AcApDocManager::lockDocument函数

virtual Acad::ErrorStatus

lockDocument(

AcApDocument* pDoc,

AcAp::DocLockMode unnamed = AcAp::kWrite,

const char* pGlobalCmdName = NULL,

const char* pLocalCmdName = NULL,

bool prompt = true) = 0;

pDoc 输入要被锁定的文件

unnamed 从AcAp::DocLockMode enum(枚举)输入的锁定模式

pGlobalCmdName 输入命令名称。每次锁定一个文件都被认为是在acad中另一命令或动作的开始。这个名称由doc管理器反应器返回当作锁定命令的名称,可以为NULL

pLocalCmdName 输入当命令未执行完时显示在命令行的名称,可以为NULL

prompt 输入的提示。由于正对目标文件执行某一命令,文件未被锁定,如果提示为True,就会显示标准的提示符,让用户完成目标文件的操作并锁定文件。如果用户选择取消锁定或提示为False,则锁定失败并返回eLockConflict这个函数用于为了锁定文件以访问文件资源。文件资源含有和文件关联的所有AcDbDatabases对象、数据库中的AcDbObject对象和所有的AcDbDatabase常驻系统变量。文件资源也含有所有的基于文件的系统变量以及和文件关联的Transaction Manager(事务管理器)。在AcDb::kForRead中的打开AcDbObject或取得系统变量,不必锁定文件,也不必取得系统变量。

注意:kForRead为只读型。

通常应用程序不必总是锁定或解锁当前文件。以addCommand() 或 aceddefun()注册的命令,开始执行时会锁定文件,完成后会解除锁定。可以使用addCommand()函数标签控制。

返回值:

Acad::eOk 锁定成功

Acad::eLockChangeInProgress  如果锁定文件的请求是由文件锁定切换反应器的回调发出,则不能“嵌套”锁定的请求

Acad::eVetoed 切换锁定被另一应用程序禁止

Acad::eNoDocument pDoc为NULLAcApDocManager::mdiActiveDocument函数

virtual AcApDocument *

mdiActiveDocument() const = 0;

这个函数返回MDI的活动文件。关联的函数mdiAcitveDocument(),返回含有当前环境的 文件。curDocument() 和mdiActiveDocument()可以不同。您可以调用curDocument()使一个文件成为当前文件而实际上不激活它。在临时的当前文件下完成acDbDAtabase操作后,调用setCurDocument(acDocManager->mdiActiveDocument())重新设置MDI的活动文件为当前的文件

AcApDocManager::newAcApDocumentIterator函数

virtual AcApDocumentIterator *

newAcApDocumentIterator() = 0;

返回指向AcApDocumentIterator对象的新的指针。

AcApDocManager::newDocument函数

virtual Acad::ErrorStatus

newDocument() = 0;

这个函数使用标准的用户交互式界面建立一个新的文件。

注意:文件的建立会挂起活动文件的环境。

AcApDocManager::openDocument函数

virtual Acad::ErrorStatus

openDocument() = 0;

这个函数使用标准的用户交互式界面打开一个文件。

AcApDocManager::popResourceHandle函数

virtual void

popResourceHandle() = 0;

这个函数使堆栈顶部的资源文件句柄成为当前的,并将它从堆栈中删除。

AcApDocManager::pushAcadResourceHandle函数

virtual void

pushAcadResourceHandle() = 0;

这个函数把当前源句柄压入当前文件的源句柄堆栈中并使AutoCAD源文件成为当前的。

AcApDocManager::pushResourceHandle函数

virtual void

pushResourceHandle(

HINSTANCE hNewResourceHandle) = 0;

hNewResourceHandle 输入指定句柄作为当前的这个函数把当前源句柄压入当前文件的源句柄堆栈并使指定句柄成为当前的。

AcApDocManager::removeReactor函数

virtual void

removeReactor(

AcApDocManagerReactor* unnamed) = 0;

unnamed 输入要删除的AcApDocManagerReactor对象这个函数从文件管理器中删除指定的AcApDocManagerReactor对象。

AcApDocManager::sendStringToExecute函数

virtual Acad::ErrorStatus

sendStringToExecute(

AcApDocument* pAcTargetDocument,

const char * pszExecute,

bool bActivate = true,

bool bWrapUpInactiveDoc = false,

bool bEchoString = true) = 0;

pAcTargetDocument 要将输入传送至的文件

pszExecute 用于输入的字符串

bActivate 布尔值,表示是否激活目标文件

bWrapUpInactiveDoc 布尔值,表示在转换活动文件时,是否在下一个OnIdle()中等待当前活动文件完成

bEchoString 布尔值,表示是否在命令行中显示的字符串这个函数在命令行中输入一字符串并在给定的目标文件中执行。

AcApDocManager::setCurDocument函数

virtual Acad::ErrorStatus

setCurDocument(

AcApDocument* pDoc,

AcAp::DocLockMode unnamed = AcAp::kNone,

bool activate = false) = 0;

pDoc 输入临时作为当前的文件

unnamed 输入需要锁定的文件的类型。缺省值为空。

activate 输入的布尔值,表示是否激活文件。缺省值为:false或不激活文件这个函数允许在应用程序环境下运行一外部应用程序使一个文件成为当前文件而实际上不激活它。这个当前状态只有在调用这个API函数的环境时有效。这样可以安全地操作文件数据而实际上使文件不处于最上层或激活状态。缺省的锁定模式参数和活动状态允许锁定和激活文件。这是允许用单一的API函数和调用单独的API函数完成多个步骤的捷径。

如果调用acDocManager->setCurDocument(pDoc, AcAp::kWrite),就可以有效地设置当前文件并锁定它。一旦完成对文件的操作,则必须将它解锁,可以调用acDocManager->unlockDocument(pDoc)进行解锁。

AcApDocManager::setDefaultFormatForSave函数

virtual Acad::ErrorStatus

setDefaultFormatForSave(

AcApDocument::SaveFormat format) = 0;

format 输入保存图形时使用的缺省文件格式这个方法在用SAVEAS(另存为)、SAVE(保存)和QSAVE(快速保存)命令保存一个图形时使用SaveFormat值中的一种来设置文件的使用格式。这里设置了工作区间范围的默认值,然而对于一个文件,用户可以临时选择另外一个值使用。

可能的AcApDocument枚举SaveFormat(保存格式)如下:

名称 值 用途 (文件扩展名)

kR12_dxf 1 AutoCAD R12/LT2 DXF (*.dxf)

kR13_dwg 4 AutoCAD R13/LT95 Drawing (*.dwg)

kR13_dxf 5 AutoCAD R13/LT95 DXF (*.dxf)

kR14_dwg 8 AutoCAD R14/LT97 Drawing (*.dwg)

kR14_dxf 9 AutoCAD R14/LT97 DXF (*.dxf)

kR15_dwg 12 AutoCAD R15 Drawing (*.dwg)

kR15_dxf 13 AutoCAD R15 DXF (*.dxf)

kR15_Template 14 AutoCAD 2000 Drawing Template File (*.dwt)

kNative  kR15_dwg 当前DWG版本是AutoCAD 2000

kUnknown -1 无效格式这个方法可以由用户输入交互式命令直接设置文件格式。如果每次保存数据库时,希望将您的应用程序用当前的保存格式保存,您首先需要调用AcApDocument::formatForSave(),再用返回的SaveFormat值决定调用哪个函数。例如:如果formatForSave()返回kR14_dxf,则调用acdbDxfOutAsR14()将数据库写为Release14的DXF文件。

小结:

您和您的用户都可以设置一个永久的工作区间范围的保存默认值,这个默认值将用于所有保存命令,除了AUTOSAVE(自动保存)。

只有用户可以临时(在工作区间中并不持久)为特定的文件选择这项设置。

formatForSave()方法返回用户需要的一个文件保存的格式,它可以是永久的工作区间范围的默认值或临时选择的值。

AcApDocManager::unlockDocument函数

virtual Acad::ErrorStatus

unlockDocument(

AcApDocument* pDoc) = 0;

pDoc 输入要被解锁的文件这个函数用于解锁之前被锁定的一个文件。除了kAutoWrite锁定模式,所有用lockDocument()锁定的文件必须配合相应的unlockDocument()调用进行解锁。除非首先成功调用了lockDocument(),否则不能调用unlockDocument()。不能调用unlockDocument()解锁kAutoWrite模式。

注意:kProtectedAutoWrite是kAutoWrite的一种特殊形式。只有在不知道锁定何时被解锁时才使用kAutoWrite模式锁定。它们会在下一次锁定中自动解锁。然而,如果存在锁定不能被嵌套的锁定请求解锁的一段时间,则使用kProtectedAutoLock。当没有嵌套锁定的危险时,可以调用unlockDocument()。此时kProtectedAutoWrite降级为一个普通的kAutoWrite锁定。

如果解锁成功,则返回Acad::eOk。

如果pDoc 是NULL,则返回Acad::eNoDocument。

如果锁定文件的请求是由文件锁定切换反应器的回调发出,则返回Acad::eLockChangeInProgress。不能“嵌套”锁定的请求。

如果还没有锁定文件,则返回Acad::eLockViolation。

AcApDocManagerReactor

这个类为文档管理的多种事件提供通知。

继承自

AcRxObject

包含文件

Acdocman.h

成员

AcApDocManagerReactor 函数

AcApDocManagerReactor::documentActivated函数

virtual void

documentActivated(

AcApDocument* pActivatedDoc);

pActivatedDoc 指针指向的活动文档 这个通知在文档被激活且其环境成功地切换时发出。

注意:存在标准用户交互作用如documentToBeActivated()之外的文档被激活的情况。

AcApDocManagerReactor::documentActivationModified函数

virtual void

documentActivationModified(

bool bActivation);

bActivation true:文档是激活的,false:文档不是激活的 这个通知在调用disableDocumentActivation()或enableDocumentActivation()导致激活状态发生变化时发出。

AcApDocManagerReactor::documentBecameCurrent函数

virtual void

documentBecameCurrent(

AcApDocument* unnamed);

unnamed 指针指向刚成为当前的活动文档 这个通知在当前文档转换时发出。这不能与文档获取焦点或激活混淆。同一文档中可以获取或失去焦点,或成为激活或不激活。这个通知只有在文档激活时发出,且不同于前一个活动文档。

AcApDocManagerReactor::documentCreateCanceled函数

virtual void

documentCreateCanceled(

AcApDocument* pDocCreateCancelled);

pDocCreateCancelled 指针指向刚取消的文档 这个通知在用户取消文档的建立时发出。通知只有在MDI多文档模式和documentCreateStarted()返回后才发出。

AcApDocManagerReactor::documentCreated函数

virtual void

documentCreated(

AcApDocument* pDocCreating);

pDocCreating 指针指向刚建立的文档 这个通知在建立一个新的AcApDocument时发出。它不和数据库链接。当开始新建一个文档时,应用程序可以使用在acrxEntryPoint()中的新信息确定,尽管这种方法有一指针指向新的AcApDocument。

AcApDocManagerReactor::documentCreateStarted函数

virtual void

documentCreateStarted(

AcApDocument* pDocCreating);

pDocCreating 指针指向正在建立的文档 这个通知在文档第一次示例和无数据库访问时发出。

AcApDocManagerReactor::documentDestroyed函数

virtual void

documentDestroyed(

const char* fileName);

fileName 被消除文档的文件名 这个通知在文档被完全消除且与文档对应的基本数据库也被删除时发出。

AcApDocManagerReactor::documentLockModeChanged函数

virtual void

documentLockModeChanged(

AcApDocument* unnamed,

AcAp::DocLockMode myPreviousMode,

AcAp::DocLockMode myCurrentMode,

AcAp::DocLockMode currentMode,

const char* pGlobalCmdName);

unnamed 输出锁定模式已改变的文档

myPreviousMode 输出锁定模式变化前的最高级锁定模式

myCurrentMode 输出当前执行环境的新的最高级锁定模式

currentMode 输出在文档中锁定的所有执行环境的新的最高级锁定模式

pGlobalCmdName 输出启用改变锁定模式的原始命令的名称。如果是解锁命令,应加上前缀‘#’。它可能会使命令名称失效,在这种情况下,只有‘#’本身是解锁命令。 这个通知在一个锁定已确定或在文档中已删除时发出。您可以区分锁定或解锁命令,解锁命令在命令名称前总带有前缀‘#’。锁定可以被禁止,但解锁不能。

AcApDocManagerReactor::documentLockModeChangeVetoed函数

virtual void

documentLockModeChangeVetoed(

AcApDocument* unnamed,

const char* pGlobalCmdName);

unnamed 输出锁定被禁止的文档

pGlobalCmdName 输出锁定已被禁止的原始命令的名称 要求在文档中建立锁定的请求可通过反应器接受documentLockModeChanged()回调来禁止。如果这种情况发生,则接受这个回调的所有的反应器均知道请求被禁止,尽管在禁止之前不是所有的反应器都接受了documentLockModeChanged()回调。

AcApDocManagerReactor::documentLockModeWillChange函数

virtual void

documentLockModeWillChange(

AcApDocument* unnamed,

AcAp::DocLockMode myCurrentMode,

AcAp::DocLockMode myNewMode,

AcAp::DocLockMode currentMode,

const char* pGlobalCmdName);

unnamed 输出锁定模式即将改变的文档

myCurrentMode 输出当前执行环境的最高级锁定模式

myNewMode 输出当新的锁定被确定时用于当前执行环境的新的最高级锁定模式

currentMode 输出含有文档当前锁定的所有执行环境的新的最高级锁定模式

pGlobalCmdName 输出将要改变锁定模式的原始命令的名称。如果是解锁命令,应加上前缀‘#’。 这个通知在文档改变所有锁定之前发出。它不能被禁止。

AcApDocManagerReactor::documentToBeActivated函数

virtual void

documentToBeActivated(

AcApDocument* pActivatingDoc);

pActivatingDoc 指针指向即将被激活的AcApDocument 这个通知在文档即将被激活时发出。

AcApDocManagerReactor::documentToBeDeactivated函数

virtual void

documentToBeDeactivated(

AcApDocument* pDeActivatedDoc);

pDeActivatedDoc 指针指向即将被解除激活的AcApDocument 这个通知在文档即将被解除激活时发出。

AcApDocManagerReactor::documentToBeDestroyed函数

virtual void

documentToBeDestroyed(

AcApDocument* pDocToDestroy);

pDeActivatedDoc 指针指向即将被删除的文档 这个通知在开始删除文档时发出。

AcApDocManagerReactor::veto函数

Acad::ErrorStatus

veto();

如果documentLockModeChanged()是一个锁定请求的回调,则这个函数可以在这个documentLockModeChanged()的回调期间调用。调用这个函数的结果会使锁定请求被禁止,这通常意味着在开始执行锁定命令之前取消命令。当调用这个函数时,documentLockModeChangeVetoed()将发出通知。

如果在其它回调期间或是在解锁请求时调用此函数,将返回eNotApplicable。

为了满足函数调用接收者需要在决定是否要vote(禁止)之前对文件进行一些修改,在documentLockModeChanged()期间此函数只能为激活。通过等待发生修改的回调,文件将在具有禁止能力时被当前锁定。这是必要的,因为从这些回调的任何一个中都不能改变文档的锁定状态。

ARX-7 强弩 阿巴雷斯Arbalest

ARX-7是以M9 Gernsback为原型,米斯里鲁投入所有黑科技之试作机体,作品中米斯里鲁唯一拥有搭载λ-Driver之AS。

由于是以当时仍在开发中的M9为原型进行制作,因此在机体基础系统设计上大多与M9相同,零件上还有不少是直接流用XM-9之设计,因此只要进行M9转换训练之驾驶员即可使用此机;由于搭乘者相良宗介在战斗中大多是处于前锋之位置, 因此惯用oto-Melala制57mm散弹炮"boxer"进行作战。

作战上说,似乎ARX-7与M9最大的相异点就是在于搭载了λ-Driver。拜此所赐,ARX-7的机体骨架为驱动λ-Driver的前提进行特别制作, 此机与M9使用的骨架虽然在外观上没有差异,但内部组成架构完全不同;由于ARX计划的核心人物已经死亡的因素,因此骨架的备用零件已经无法生产,如果备用零件用光之后虽然可以使用M9的零件进行运作,但是无法驱动λ-Driver。另外,由于驱动λ-Driver的时候会消耗大量电力以及发出极高热量,因此机体也装备了大型电容器以及散热装置,由于这些相关装置的因素,ARX-7的设计作战时间比M9的作战时间来的短。

但是最重要的不同,也就是ARX系统的真面目,是隐藏在其机器人面目之下的,由人工智能“AL”为核心的整体系统。AL是由黑科技技术开发(开发者为“细语者”巴尼·摩拉塔)的,具有高度拟人化的模拟人格计算机,其性格,思维会随着驾驶员思维展现一定的同调性。同时整部机体(尤其λ-Driver)也会因为ARX系统的存在而向着配合驾驶员的方向变化,是藏有大量潜力和迷团的技术。

在外观上除了配色之外与M9不同的地方,主要是λ-Driver冷却器安装位置(双肩以及背后之翼状散热版),双眼感应器,还有类似人类的口部临时武装搭载硬点(可在战斗中固定单分子刀)。

该机体在2006年12月28日于东京市区,在多架汞合金AS以及雷纳德.泰斯塔罗莎驾驶的钢铁堕天使围攻下严重毁损,后由前秘银人员亨利(化名)勉强收集并由另一名“细语者”米拉指导修复为新型机ARX-8,后话按下不表。

机体名称英文翻译为中世纪的弩,以雷纳德.泰斯塔罗莎的说法,ARX计划之机体皆以中世纪武器为名(ARX-6代号为戟,顺便一提ARX只是带有实验模块的模拟系统,并非一架机器人)

因此中文翻译中翻成强弩兵其实乃错误翻译。

机体参数:ARX-7 Arbalest 高度: 8.5米 重量: 9.8 吨 最高的速度: 未知 最大跳跃力: 未知 最大的战斗时间: 100 小时 能量来源: Palladium[护卫] ( 冷的核聚变反应堆)Ross & Humbleton APR 2500c 携带武器: AM 11 12.7mm 链枪 ( x2 ) XM 18 电线枪 ( x2 ) 标准便携式武器: Otto/Melala "Boxer" 57mm 霰弹枪 Royal Ordnance M1108 反坦克匕首 GeoTron Electronics GRAW-2 单分子切割器 特殊处: 装载了一台Lambda Driver 简单介绍: 在Mithril[米斯利尔]的准许下在第6话的事件中由相良驾驶.它内部装载了一台Lambda Driver.从外型来看是同M9一样出于Mithril[米斯利尔]的Whisper[耳语者]工程师Bonny Morauta之手.应该是M9的后继机型. 在它装甲内部所包含的潜在力量是深不可测的.自从Arbalest在第6话中第1次被相良驾驶以后,它拒绝除了相良以外的所有驾驶员驾驶它. 由于只是实验模型,所以仍然有很多的错误.例如,它装载的Lambda Driver是否完全工作都无法肯定. Arbalest的一个特征就是嘴里象一个忍者一样携带了一把刀.

搭载系统:

1.ECS系统镭射全方位光学迷彩系统:在全身各关节装上镭射投影头,在机体上投影出反方向的影像,原理就很简单就现在演唱会中在空中写字的镭射投影机,只不过是完全真彩的。该系统只对光学设备起作用,对雷达无效.

2.λDRIVE系统精神实体化系统:即所想即所得,你想防守,系统就在机体前产生防护系统。在敌我双方都有λDRIVE系统时,集中力强的会突破对方的防护系统 驾驶员

相良宗介此机是秘银的耳语者工程师BonnyMorauta开发的LambdaDriver系统试验机是至目前为止秘银唯一一架用于实战的搭载LambdaDriver系统的机体实力超强的机体,配合能力同样超强的驾驶员,战功可谓显赫。曾创造过单机击毁四台VENOM及一台VENOM队长机(均搭载LambdaDriver系统,其队长机实力更是强的离谱)的辉煌战绩然而由于ARX只是实验机,所以仍然有很多的错误.例如,它装载的LambdaDriver并不是每次都会处于完全工作状态,LambdaDriver系统的散热也是

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/3/1 17:31:27